ゲーム開発チーム「丸ダイス」の開発ブログです! 公式サイトはこちら

【Unity】NCMB3.0.0 インポート時にiOSビルドのリンカエラー

前回(【Unity】NCMB インポート時のAndroidビルドエラーを読み解く - 丸ダイスの卓上開発日誌Android版でのビルドエラーを解決したら、今度はiOSのCloud Buildでビルドエラーが。

※結局、2.2.0か3.0.0かはエラーと無関係だったので、新しい方を使っています。

原因

ログを見てみると、Unityのビルドは通って、xcodeのビルドの一番最後にこんな出力。

       [xcode] Undefined symbols for architecture armv7:
       [xcode]   "_OBJC_CLASS_$_UNUserNotificationCenter", referenced from:
       [xcode]       objc-class-ref in NCMBAppControllerPushAdditions.o
       [xcode] ld: symbol(s) not found for architecture armv7
       [xcode] clang: error: linker command failed with exit code 1 (use -v to see invocation)

obj-cは書いたことないですが、「NCMBAppControllerPushAdditions.oの中で参照されてる_UNUserNotificationCenterってシンボルがUndefinedやぞコラ!」っつってるんだから、リンカエラーでしょう多分。

まさにNCMBの.oで参照されてるようなので、今起きたエラーと見てよさそうですね。

解決方法

原因は読み解けたので、_UNUserNotificationCenterが含まれてるライブラリがどっかにあるじゃろうと踏んでググったらあっさりヒット。

stackoverflow.com

UserNotifications.framework を追加すればいけるぜって言ってますね。欲しいUndefined symbolsが含まれてそうな名前です。

Macを起動するまでもなくiOS のポストプロセッサにframeworkを追記してcommit。そのままCloud Build復活!

緑のチェックマークが並ぶと気持ちいいですね!

..
    [PostProcessBuildAttribute(0)]
    public static void OnPostprocessBuild(BuildTarget buildTarget, string pathToBuiltProject)
    {
..
        PBXProject proj = new PBXProject();
..
        // Add framework
        proj.AddFrameworkToProject(target, "UserNotifications.framework", false);
..
    }
}

※ポストプロセッサはこのあたりを参考に前から使ってるものです。UnityでXcodeの設定を自動化する方法まとめ - スマゲ