Unity+NCMBでiOSビルドしたときのどえりゃあエラー

Unityでビルドして、xcodeにいき、そこでビルドしたときに出るなんだかよくわからんエラー。ぞろぞろ出てくるもんだから とっても怖い。

Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_UNUserNotificationCenter", referenced from:
      objc-class-ref in NCMBAppControllerPushAdditions.o
  "_OBJC_CLASS_$_ASAuthorizationController", referenced from:
      objc-class-ref in NCMBAppleAuth.o
  "_OBJC_CLASS_$_ASAuthorizationAppleIDProvider", referenced from:
      objc-class-ref in NCMBAppleAuth.o
  "_ASAuthorizationScopeEmail", referenced from:
      -[NCMBAppleAuth loginWithAppleId:] in NCMBAppleAuth.o
  "_ASAuthorizationScopeFullName", referenced from:
      -[NCMBAppleAuth loginWithAppleId:] in NCMBAppleAuth.o
  "_OBJC_CLASS_$_WKWebView", referenced from:
      objc-class-ref in NCMBRichPushView.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

UnityFrameworkが不足しているだけである。

あわてず、+ をクリックし以下を追加する
WebKit.framework
UserNotifications.framework
AuthenticationServices.framework
そこまでやって、再度ビルドしよう。いちおうxcodeもクリーンして、再起動かましとこう。

あとは、AuthenticationServices.frameworkを「Optional」に変更しておく。

AuthenticationServices.frameworkは、ユーザー認証のフレームワークらしい

https://developer.apple.com/jp/documentation/authenticationservices/

Unityとニフクラ mobile backendでプッシュ通知の設定するまで、iOS編

特に迷わなかった。証明書.p12を書き出すときに間違ってパスワードを設定したくらいである。
ニフクラのドキュメントにきれいに書いてある。

念の為、ざっくりと手順だけかいておく。

1)Appleデベロッパーにアクセスして準備

https://developer.apple.com/にて
・「バンドル識別子」を使用します。
・証明書はめんどくさいので、本番用をいきなり作りました
・こちらにきれいに書いてある。

mBaaSとAPNsの連携に必要な設定
https://mbaas.nifcloud.com/doc/current/tutorial/push_setup_ios.html#gsc.tab=0

証明書を.p12形式に変換するとき、パスワードを設定しちゃいかんぞ

プッシュ通知の設定はiOSの方が簡単じゃのお

Unityとニフクラ mobile backendでプッシュ通知の設定するまで、Android編

ほんとさあ、プッシュ通知まじでめんどくさい。何がめんどくさいって最初がめんどくさい。ほんとめんどくさい。最初はFirebaseだけでやろうと思ったんだけど、どーもUnityでのビルドでひっかかってしまう。何が悪いかわからない。

そういうわけで、我らがニフクラでプッシュ通知を実装したので、以下手順を書く。Unity + ニフクラ + Firebaseということになる。挫折したひと、いると思うのよね。

つかうもの
1)Unity(プロジェクトつくっておく)
2)Firebaseを使う
3)ニフクラを使う

1)Unityでプロジェクト作る
 まず、Unityで適当なプロジェクトを作る。別になんでもよい。プロジェクトを作成したらビルド設定をひらき、プレイヤー設定をクリックして

バンドル識別子を設定しておく。

2)Firebaseの設定を行う
 プロジェクトを追加にて新しくプロジェクト追加する。

Unity アプリに Firebase を追加 にて、バンドル識別子を入力。iOS app にもプッシュ通知したいのでここにもバンドル識別子をいれる。もちろんAndroid appにもいれる。アプリのニックネームは適当に。

秘密鍵のダウンロードをする

google-services.json をダウンロードしておく(Android用)

GoogleService-Info.plist をダウンロードしておく(iOS用)

ここまでで、Firebaseの設定は終わります

3)ニフクラの設定
 プッシュ通知設定ファイルの選択 をクリックして、firebase上でダウンロードした秘密鍵をアップする

4)Unityの設定
 基本的にはニフクラのドキュメントに沿って行えば良い。以下、簡単に書いておく。

 1.NCMBのSDKをインポート。
 2.Prefabsフォルダ内の「NCMBManager」「NCMBSettings」をドラッグしてシーン直下へ。
 3.NCMBSettingsのUse Pushにチェックをいれる。
 4.google-services.jsonを配置する。(google-services.jsonは、プロジェクト内のAssets/Plugin/Android直下に配置。)
 5.アプリケーションキーとクライアントキーを入力。(アプリケーションキーとクライアントキーはニフクラからコピペ。)

5)ここまででいったん、ビルドしてAndroid端末にいれてみよう
 もしビルドエラーが出た場合、Unityを再起動する。どういう理屈なのかはわからないが、なんらかのSDKをインポートしたとき、ビルドでめっちゃエラーがでてくるときがある。

6)プッシュ通知をするためのコードを書く。
 PushObjectをいうゲームオブジェクトを作成し、PushObjectソースコードファイルをアタッチ。

コードは以下。
using UnityEngine;
using System.Collections;

/////////////////////////ここから追加コード////////////////////////
//SDKの利用を宣言
using NCMB;
/////////////////////////ここまで追加コード////////////////////////

using System.Collections.Generic;

public class PushObject : MonoBehaviour {

/////////////////////////ここから追加コード////////////////////////
    private static bool _isInitialized = false;

    /// <summary>
    ///イベントリスナーの登録
    /// </summary>
    void OnEnable()
    {
        NCMBManager.onRegistration += OnRegistration;
        NCMBManager.onNotificationReceived += OnNotificationReceived;
    }

    /// <summary>
    ///イベントリスナーの削除
    /// </summary>
    void OnDisable ()
    {
        NCMBManager.onRegistration -= OnRegistration;
        NCMBManager.onNotificationReceived -= OnNotificationReceived;
    }

    /// <summary>
    ///端末登録後のイベント
    /// </summary>
    void OnRegistration (string errorMessage)
    {
        if (errorMessage == null) {
            Debug.Log ("OnRegistrationSucceeded");
        } else {
            Debug.Log ("OnRegistrationFailed:" + errorMessage);
        }
    }

    /// <summary>
    ///メッセージ受信後のイベント
    /// </summary>
    void OnNotificationReceived(NCMBPushPayload payload)
    {
        Debug.Log("OnNotificationReceived");
    }

    /// <summary>
    ///シーンを跨いでGameObjectを利用する設定
    /// </summary>
    public virtual void Awake ()
    {
        if (!_isInitialized) {
            _isInitialized = true;
            DontDestroyOnLoad (this.gameObject);
        } else {
            Destroy (this.gameObject);
        }
    }


/////////////////////////ここまで追加コード////////////////////////

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }

}

「Awake」内の処理、これを書くことでPushObjectが別のシーンに入っても生き続けることができる。OnEnable内の処理で端末をニフクラに登録することが可能となる。

 Unityをビルドし、端末で実行してみる。

 ニフクラのサーバー内にプッシュ通知をおくるべき端末が記録されていることを確認できる。

 あとは、ニフクラのプッシュ通知を使用してプッシュ通知をおくることが可能になる。