Code Monkey home page Code Monkey logo

ncmb_unity's Issues

【SNS認証機能】既に認証して登録した会員で、アプリを再インストールし、再度認証してログインを実施するとcurrentUserがnullになります

Unity 2019年版で、Unity 4.0.3で以下の流れで検証を実施して、エラー再現しました。
※例としてFacebook認証として記載ですが、実装は同様のため、twitter認証もエラー発生すると思われます。

再現手順

  1. Facebookにログインして、会員管理でユーザーが保存される
  2. アンインストール
  3. 再度インストールして、Facebookログインを叩く

実装コード

以下のドキュメントの通り実装
https://mbaas.nifcloud.com/doc/current/sns/facebook_unity.html

using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using Facebook.Unity;
using NCMB;

public class LoginFacebook : MonoBehaviour {

    // Use this for initialization
    async void Start () {

        Debug.Log("Let's wait!");
        await Task.Delay(1000 * 15);

        var list = new List<string> { "public_profile", "email", "user_friends" };
        //Facebookへログイン
        FB.LogInWithReadPermissions(list, result => {
        var aToken = Facebook.Unity.AccessToken.CurrentAccessToken;
        var userId = aToken.UserId;
        var token = aToken.TokenString;
        var extime = aToken.ExpirationTime;

        //認証用パラメータの作成
        NCMBFacebookParameters parameters = new NCMBFacebookParameters(
            userId,
            token,
            extime
        );

        NCMBUser user = new NCMBUser ();
        user.AuthData = parameters.param;

        //ニフクラ mobile backendにログイン
        user.LogInWithAuthDataAsync((NCMBException e) => {
            Debug.Log("login成功");

            if (e == null) {
                Debug.Log("Current user: " + NCMBUser.CurrentUser.ObjectId);
            } 
        });
        });

    }

   <<省略>>
}

ERRORログ

E/Unity: NullReferenceException: Object reference not set to an instance of an object
      at LoginFacebook+<>c.<Start>b__0_1 (NCMB.NCMBException e) [0x00015] in /projects/SampleUnity/FaceBookLogin/Assets/LoginFacebook.cs:39 
      at NCMB.NCMBUser+<>c__DisplayClass56_0.<LogInWithAuthDataAsync>b__0 (NCMB.NCMBException error) [0x0002a] in /projects/SampleUnity/FaceBookLogin/Assets/NCMB/Script/NCMBUser.cs:694 
      at NCMB.NCMBObject+<>c__DisplayClass72_0.<Save>b__0 (System.Int32 statusCode, System.String responseData, NCMB.NCMBException error) [0x000ba] in /projects/SampleUnity/FaceBookLogin/Assets/NCMB/Script/NCMBObject.cs:978 
      at NCMB.Internal.NCMBConnection+<SendRequest>d__37.MoveNext () [0x0037b] in /projects/SampleUnity/FaceBookLogin/Assets/NCMB/Script/NCMBConnection.cs:458 
      at UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) [0x00028] in /Users/builduser/buildslave/unity/build/Runtime/Export/Scripting

AndroidManifest内のコメントに誤りがある

AndroidManifest内のコメントに誤りがあることを確認いたしました。

【誤】

 <!-- UNITY PLAYER ACTIVITIES ( [WARNING] if use Prime31, edit 'com.nifty.cloud.mb' to 'com.prime31' at android:name of 3 these activities) -->

【正】

 <!-- UNITY PLAYER ACTIVITIES ( [WARNING] if use Prime31, edit 'com.nifty.cloud.mb.ncmbgcmplugin' to 'com.prime31' at android:name of 3 these activities) -->

正しくはcom.nifty.cloud.mb.ncmbgcmplugincom.prime31に書き換える形になります。
お客様にはご迷惑をおかけいたしますが、
コメント修正はSDKのアップデートまでいましばらくお待ちいただきますようお願い申し上げます。

【要望】WaitForSecondsをWaitForSecondsRealtimeに変更

要望内容

NCMBConnections.csのSendRequest()メソッド内で、処理の完了をWaitForSeconds()で待っていますが、WaitForSecondsRealtime()への変更を要望いたします。

理由

WaitForSeconds()はスケールされた時間で待ってしまうため、Time.timeScaleを変更すると待ち時間が変化してしまいます。Time.timeScaleが0の場合、止まってしまいます。

ご検討、よろしくお願いいたします。

参考

queryの引数に文字列の配列、Listを渡す場合、空の値になる

■再現環境
 。Unity Ver=5.3.5
 。Unity NCMB Ver=2.2.0
 。Sample例

1.mBaasに下記のスクリプトを事前登録する
【powerup.js】
 module.exports = function(req, res){
 res.send(req.query);
 };

2.Unityから下記を実行する
【unity】
//スクリプトを設定する
NCMBScript script = new NCMBScript ("powerup.js", NCMBScript.MethodType.GET);
//配列場合
string[] foods = new string[] { "aaa", "bbb" };
Dictionary<string, object> query = new Dictionary<string, object>() {
{ "name", foods }
};
//実行結果
script.ExecuteAsync (null, null, query, (byte[] result, NCMBException e) => {
if (e != null) {
// 失敗
UnityEngine.Debug.Log("失敗:" + e);
} else {
// 成功
UnityEngine.Debug.Log("成功:" + System.Text.Encoding.ASCII.GetString(result));
}
});

3.実行結果
・成功:{"name":"System.String[]"} -> お客様の問い合わせとおりに配列値(System.String[])が見みえない状態でした。

4.設定影響
・Unity SDKで利用できるデータ型の中、配列、Listなとの値設定に不具合が出ます。
(参考:http://mb.cloud.nifty.com/doc/current/sdkguide/unity/datastore.html)

■原因(Unity NCMB Ver=2.2.0(現在の最新))
1.Unityからscript.ExecuteAsyncを実行

2.NCMBScript.cs
ExecuteAsync():非同期処理でスクリプトの実行を行う
クエリ文字列作成の中、"pair.Value.ToString ()"でこのまま文字列に変換しております。★不具合★

3.NCMBScript.cs
Connect():通信

■改善
・配列、Listのオブジェクトが正しくクエリに設定されるように修正する。

iOSでプッシュ通知のメッセージ受信後のイベントのペイロードデータが不足

不具合の概要(Description of bug)

  • SDKのバージョン(SDK version)
    • v3.0.1
  • Platform
    • iOS
  • 不具合が発生した環境(Environment requirement)
    • Unity 5.6.2f1
  • 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
      /// <summary>
      ///メッセージ受信後のイベント
      /// </summary>
      void OnNotificationReceived(NCMBPushPayload payload)
      {
          // ここでペイロードデータ出力
      }
    
  • エラーメッセージ(Error messages)
    • 特になし

4.0.1/セッション切れなどのケースでResponseDataが空文字だと例外で落ちる

不具合の概要(Description of bug)

  • SDKのバージョン(SDK version)ver4.0.1
  • 不具合が発生した環境(Environment requirement)Unity2019.1.12f1+Windows7
  • 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
    次の手順となります。
  1. 「クイックスタート」の手順に従い環境を整える。
  2. ダッシュボードにログインしアプリ設定の会員認証設定で認証有効時間を最短の1時間にする。
  3. NCMBSettingsオブジェクトに、下記のスクリプトをアタッチして実行する。
  4. 本来のセッション切れ例外Authentication error by header incorrect.は作られているが、それが投げられる前に、下記例外で落ちる。
using NCMB;
using NCMB.Tasks;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using UnityEngine;

public class NCMBTest2 : MonoBehaviour {
    private async void Start() {

        await NCMBUser.LogOutTaskAsync();

        NCMBUser currentUser = await NCMBUser.LogInTaskAsync("Yamada Tarou", "password");

        //セッション切れになる1時間以上待つ
        //もしくは擬似的なセッション切れを再現した次のコードを実行する
        //var CurrentUserFileName = $"{Application.persistentDataPath}/CurrentUser";
        //var CurrentUserData = Regex.Replace(File.ReadAllText(CurrentUserFileName), "\"sessionToken\":\"[^\"]*\",", "\"sessionToken\":\"dammyToken\",");
        //await NCMBUser.LogOutTaskAsync();
        //File.WriteAllText(CurrentUserFileName, CurrentUserData);
        //await Task.Delay(1000);//書き込み待ち
        Debug.Log("Let's wait!");
        await Task.Delay(1000 * 3700);

        //エラー発生
        await currentUser.FetchTaskAsync();

    }
}

  • エラーメッセージ(Error messages)
CurrentUser is found, sessionToken info error, delete localdata
UnityEngine.Debug:Log(Object)
NCMB.Internal.NCMBDebug:Log(String) (at Assets/NCMB/Script/NCMBDebug.cs:44)
NCMB.Internal.NCMBConnection:_checkInvalidSessionToken(String) (at Assets/NCMB/Script/NCMBConnection.cs:356)
NCMB.Internal.<SendRequest>d__37:MoveNext() (at Assets/NCMB/Script/NCMBConnection.cs:439)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
�StatusCode�:401
�Error�:NCMB.NCMBException: Authentication error by header incorrect.
�ResponseData�:
UnityEngine.Debug:Log(Object)
NCMB.Internal.NCMBDebug:Log(String) (at Assets/NCMB/Script/NCMBDebug.cs:44)
NCMB.<>c__DisplayClass77_0:<FetchAsync>b__0(Int32, String, NCMBException) (at Assets/NCMB/Script/NCMBObject.cs:1053)
NCMB.Internal.<SendRequest>d__37:MoveNext() (at Assets/NCMB/Script/NCMBConnection.cs:458)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
Error occurred: Value was either too large or too small for a character. 
 with: System.Collections.ListDictionaryInternal ; 
   at System.Convert.ToChar (System.Int32 value) [0x00016] in <7d97106330684add86d080ecf65bfe69>:0 
  at MiniJSON.Json+Parser.get_PeekChar () [0x00001] in E:\develop\Unity\projects\NCMBTest\Assets\NCMB\Script\MiniJSON.cs:333 
  at MiniJSON.Json+Parser.EatWhitespace () [0x00026] in E:\develop\Unity\projects\NCMBTest\Assets\NCMB\Script\MiniJSON.cs:322 
  at MiniJSON.Json+Parser.get_NextToken () [0x00001] in E:\develop\Unity\projects\NCMBTest\Assets\NCMB\Script\MiniJSON.cs:361 
  at MiniJSON.Json+Parser.ParseValue () [0x00001] in E:\develop\Unity\projects\NCMBTest\Assets\NCMB\Script\MiniJSON.cs:210 
  at MiniJSON.Json+Parser.Parse (System.String jsonString) [0x00009] in E:\develop\Unity\projects\NCMBTest\Assets\NCMB\Script\MiniJSON.cs:130 
  at MiniJSON.Json.Deserialize (System.String json) [0x0000e] in E:\develop\Unity\projects\NCMBTest\Assets\NCMB\Script\MiniJSON.cs:91 
  at NCMB.NCMBObject+<>c__DisplayClass77_0.<FetchAsync>b__0 (System.Int32 statusCode, System.String responseData, NCMB.NCMBException error) [0x00057] in E:\develop\Unity\projects\NCMBTest\Assets\NCMB\Script\NCMBObject.cs:1057 
UnityEngine.Debug:Log(Object)
NCMB.NCMBException:.ctor(Exception) (at Assets/NCMB/Script/NCMBException.cs:137)
NCMB.<>c__DisplayClass77_0:<FetchAsync>b__0(Int32, String, NCMBException) (at Assets/NCMB/Script/NCMBObject.cs:1068)
NCMB.Internal.<SendRequest>d__37:MoveNext() (at Assets/NCMB/Script/NCMBConnection.cs:458)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
  • 原因の可能性
    スタックをたどると、NCMBObject#FetchAsyncにてMiniJSONのパースに失敗して例外発生しています。その原因は空文字をDeserializeしている事ですが、上記上限ではResponseDataがヌルでは無くて空白文字のため、1056行の
	if (responseData != null) {

でトラップされないためだと思われます。この行を、

	if (!string.IsNullOrWhiteSpace(responseData)) {

と編集する事で上記エラーを回避する事ができます。

NCMBPush.csのGetQueryの説明が実装と異なっている

        /// <summary>
        /// installation内のオブジェクトで使用出来るクエリを取得します。
        /// </summary>
        /// <returns> クエリ</returns>
        public static NCMBQuery<NCMBPush> GetQuery ()
        {
            return NCMBQuery<NCMBPush>.GetQuery ("push");
        }

プッシュ通知アイコンの色を変更したい

■環境
Unity5.4.3 の場合
SDK 2.2.0 : 現在プッシュ通知のアイコン設定はあるげと、アイコン色を変更する設定がありません。

■関連
Android 5.0 Lolipop以上で通知アイコンが白くなってしまう問題

■修正場所
①Pluginsの改善
 場所:【UnityProject】/Assets/Plugins/Android/NcmbGcmPlugin.jar
com.nifty.cloud.mb.ncmbgcmplugin.NCMBGcmListenerService.java

②AndroidManifest.xmlのmeta-data定義設定からプッシュ通知アイコンの色を変更出来ます。
設定例:<meta-data android:name="smallIconColor" android:value="0xff0000ff"/>

ライセンス表記修正

  • サイト、ドキュメントと合わせて、以下のように修正
Copyright 2017 FUJITSU CLOUD TECHNOLOGIES LIMITED All Rights Reserved.

Copyright 2017-2018 FUJITSU CLOUD TECHNOLOGIES LIMITED All Rights Reserved.

[Unity] Twitter、FacebookのSNS連携機能で、NCMBUser.CurrentUserの値が2回目以降だとnullになる

会員登録済みの場合、Twitter認証にてログイン、データ更新ができない問題が発生しております。
(初回会員登録はOK)
初回時登録後は、NCMBUser.CurrentUser が存在する(ログインできている)
2回目以降は NCMBUser.CurrentUser は null となっている

AndroidStudio にて検証したところ、上記の症状にならず2回目以降もログイン可能でした。
下記が試したときのソースコードになります。

  • SDKのバージョン(SDK version)
    v3.0.0
    Twitter、FacebookのSNS連携機能の追加

  • 不具合が発生した環境(Environment requirement)
    Unity 5.5.1p4
    Android

  • 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
    Unityのソース(下記にて発生)

var session = Twitter.Session;
//認証用パラメータの作成
NCMBTwitterParameters parameters = new NCMBTwitterParameters(
    session.id.ToString(),
    session.userName,
    TWITTER_KEY,
    TWITTER_SECRET,
    session.authToken.token,
    session.authToken.secret
    );

NCMBUser user = new NCMBUser();        
user = new NCMBUser();
user.AuthData = parameters.param;

//--データ更新--
user.Add("test", Random.Range(0, 100).ToString()); 
user["Score"] = Random.Range(0, 100);

//ニフティクラウド mobile backend AuthDataにてログイン
user.LogInWithAuthDataAsync(e =>
{
    if (e != null)
    {
        Debug.Log("error : " + e);
    }
    else
    {
        Debug.Log("login成功");
        Debug.Log(" NCMBUser.CurrentUser : " +  NCMBUser.CurrentUser);//--初回登録時は値アリ、2回目以降はnull--
    }
});

AndroidStudio(適当にサンプル切り貼りしたもの こちらでは発生しない)

loginButton.setCallback(new Callback<TwitterSession>() {
    @Override
    public void success(Result<TwitterSession> result) {

        TwitterSession session = result.data;

        NCMBTwitterParameters parameters = new NCMBTwitterParameters(
                String.valueOf(session.getUserId()),
                session.getUserName(),
                TWITTER_KEY,
                TWITTER_SECRET,
                session.getAuthToken().token,
                session.getAuthToken().secret
        );

        try {
            NCMBUser.loginWith(parameters);
            String msg = "Login to NIFTYCloud mobile backend with Twitter account";
            Toast.makeText(getApplicationContext(), msg, 
Toast.LENGTH_LONG).show();

            String str = String.valueOf(NCMBUser.getCurrentUser().getUserName());
            Toast toast = Toast.makeText(MainActivity.this,str, Toast.LENGTH_LONG);
            toast.show();

        } catch (NCMBException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void failure(TwitterException exception) {
        Log.d("TwitterKit", "Login with Twitter failure", exception);
    }
});
  • エラーメッセージ(Error messages)
    とくにエラーは出ておりません。

Unity-iOSでのFindAsyncでデータストアのデータを取得時、タイムアウトエラーが返ってきてデータを取得できません

■環境

 ▼種別
    Unity , iOS

    ▼SDKバージョン
    Unity 2.2.0

    ▼お問い合せ詳細
    querryのFindAsyncでデータストアのデータを取得しようとしたときに回線が悪い状態で
       タイムアウトエラーが返ってくると、それ以降は回線の状態がよくなってもタイムアウトエラーが
       返ってきてデータを取得できません。

■ログ内容

【StatusCode】:0
【Error】:NCMB.NCMBException: The request timed out
【ResponseData】:
    NCMB.Internal.NCMBDebug:Log(String) (at Assets/NCMB/Script/NCMBDebug.cs:44)
    NCMB.c__AnonStorey12:<>m__1E(Int32, String, NCMBException) (at Assets/NCMB/Script/NCMBQuery.cs:571)
    NCMB.Internal.NCMBConnection:_Connection(HttpWebRequest, HttpClientCallback, HttpClientFileDataCallback) (at Assets/NCMB/Script/NCMBConnection.cs:229)
    NCMB.Internal.NCMBConnection:Connect(HttpClientCallback) (at Assets/NCMB/Script/NCMBConnection.cs:113)
    NCMB.NCMBQuery`1:Find(NCMBQueryCallback`1) (at Assets/NCMB/Script/NCMBQuery.cs:570)
    NCMB.c__AnonStorey11:<>m__1C() (at Assets/NCMB/Script/NCMBQuery.cs:550)

【NCMBConnection.cs -> _Connection(..)メソッド】
 httpResponse = (HttpWebResponse)Httpreq.GetResponse(); //ここで発生します。

■原因

1)HttpWebRequestインスタンスを確実にAbortしておらず、
 HttpWebRequestの"何かが"残り、WebStreamの読み書きができず
 HttpWebRequestが固まることがあるらしいです。
 (この固まる現象はHttpWebRequestを連続で呼び出すときに発生しやすい)

2)HttpWebRequestクラスは直接TCPコネクションを処理しているわけではありません。
 ServicePointManagerクラスによって管理されているServicePointクラスを介して通信してます。
(更にその先にConnectionGroupやらConnectionクラスがありますが。)
 そのため、もしも通信できないTCPコネクションを持ったServicePointインスタンスが生き続け、HttpWebRequestがそのServicePointばかりを割り当てられた場合、現象のようにエラーになり続けます。
 ですので、破棄されていないServicePointインスタンスを使用し続けているのが原因かもしれません。

■修正案

・MaxIdleTime = ServicePoint オブジェクトに関連付けられた接続が閉じられるまでにアイドル状態を持続できる合計時間を取得または設定します。
・各 ServicePoint オブジェクトは、アイドル時間が MaxIdleTime プロパティで指定された時間を超えるまで、インターネット リソースへの接続を維持します
・現在のServicePoint オブジェクトは、アイドル時間が MaxIdleTime プロパティ値 = 900000 長いです。(デフォルト 900秒=15分意味)
・Unity
  【NCMB/Script/NCMBConnection.cs -> internal HttpWebRequest _returnRequest ()メソッド】追加更新要
    1)Unityでプラットフォーム(iOSのみ)に分岐を作る。(#if UNITY_IOS)
    2)接続が閉じられるまでにアイドル状態を短くします。(MaxIdleTime = 1)
    
    例)
    :::::
  // ---------------------------------------------------------------------- ここから↓
    #if UNITY_IOS
        req.ServicePoint.MaxIdleTime = 1; //接続を閉じていないための回避案
    #endif
  // ---------------------------------------------------------------------- ここまで↑

    return req;

以上です。

Unity SDKバージョン1.1.1にIOS SDKバージョン2.0.4を対応させる

ニフティクラウドmobile backendのUnity SDKバージョン1.1.1は
iOS SDKバージョン2.0.3にて動作確認をしており、IOS SDKバージョン2.0.4はまだ対応しておりません。
※IOS SDKバージョン2.0.4でビルドすると、NCMBErrorResultBlockのビルドエラーが発生しております。

回避策として、iOS SDK バージョン2.0.3を利用していただくか、
iOS SDKバージョン2.0.4を利用する場合、以下のように修正していただくことが必要になります。

■修正ファイル:NCMBAppControllerPushAdditions.mm
■修正コード:

(修正1) //96行

 [currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
⇒[currentInstallation saveInBackgroundWithBlock:^(NSError *error) {

(修正2) //97行

  if(succeeded){
⇒ if(!error){

(修正3) //115行

  [currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *updateError) {
⇒ [currentInstallation saveInBackgroundWithBlock:^(NSError *updateError) {

(修正4) //246行

 [push sendPushInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
⇒[push sendPushInBackgroundWithBlock:^(NSError *error) {

Android実機にて installation に登録されない

SDKの改善にご協力いただきありがとうございます。
(Thank you for your support our SDK.)

SDKの不具合を報告する場合は、以下の項目を確認してください。
(If you want to report a bug of the SDK, please confirm the following terms.)

  • サンプルコードにAPIキーや個人情報が含まれていないか (The sample code does not include credential information?)
  • 同じバグをすでに誰かが報告していてOpenになっているissueはないか (This bug is not being reported?)

不具合の概要(Description of bug)

iOS実機、Unity Editorは正常に動作しております。
Android実機において、検証を行い動作しないため、ご連絡いたします。
SenderId、AndroidManifest.xmlの設定はもちろん行っております。

NCMBのC#スクリプトを追いかけたところ

NCMBPush.cs

m_AJClass.CallStatic("InitSenderId", senderId);

の呼び出しまで実行されておりますが、
NCMBManager.onTokenReceived に返ってきてないようです。

なので、installationに登録される、installation.SaveAsync 以前に
このイベントハンドラの呼び出しが行われていないようです。

InitSenderIdの内部まで追いかけられなかったため、
不具合に関する解消に関してアップデートを待てば良いのか、
他の原因があるのか等ご教授いただきたく連絡しました。

よろしくお願いいたします。

  • SDKのバージョン(SDK version)
    v3.2.1

Android SDK : API 27
Android NDK : android-ndk-r13b
Java : jdk1.8.0_144

  • 不具合が発生した環境(Environment requirement)
    Unity 2017.3.1.f1

  • 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
    クイックスタートにある手順通り

  • エラーメッセージ(Error messages)
    特になし

階層構造の変更

  • リリースページから公開されているNCMB.unitypackageと同じ階層構造に変更する
    • 具体的には以下の様な修正イメージです
    $ NCMB
    ├── NCMBManager.cs
    ├── NCMBSettings.cs
    └── Script
       ├── CommonConstant.cs
       ├── ExtensionsClass.cs
       ├── MimeTypeMap.cd
       ・
       ・
       ・
    

ログイン後に他のユーザを削除する際、CurrentUserがnullになります

エラー確認するコードは以下となります。
削除するユーザは権限許可されたユーザと前提になります。

        NCMBUser.LogInAsync("user1", "pass1", (NCMBException e) => {
            if (e != null)
            {
                UnityEngine.Debug.Log("ログインに失敗: " + e.ErrorMessage);
            }
            else
            {
                UnityEngine.Debug.Log("ログインに成功!");
                NCMBUser curuser = NCMBUser.CurrentUser;
                UnityEngine.Debug.Log("CurrentUser" + curuser.ObjectId);
                NCMBUser user = new NCMBUser();
                user.ObjectId = "anotherUserID";
                user.DeleteAsync((NCMBException ex) =>
                {
                    if (ex != null)
                    {
                        UnityEngine.Debug.Log("Deleted error:" + ex.ErrorMessage);
                    }
                    else
                    {
                        UnityEngine.Debug.Log("Deleted successful!");
                        NCMBUser curuser2 = NCMBUser.CurrentUser;
                        UnityEngine.Debug.Log("CurrentUser" + curuser2.ObjectId);
                    }
                });
            }
        });

エラーは

Test+<>c.<Start>b__0_1 (NCMB.NCMBException ex) (at Assets/Test.cs:43)
NCMB.NCMBObject+<>c__DisplayClass67_0.<DeleteAsync>b__0 (System.Int32 statusCode, System.String responseData, NCMB.NCMBException error) (at Assets/NCMB/Script/NCMBObject.cs:865)
NCMB.Internal.NCMBConnection+<SendRequest>d__37.MoveNext () (at Assets/NCMB/Script/NCMBConnection.cs:458)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at /Users/builduser/buildslave/unity/build/Runtime/Export/Scripting/Coroutines.cs:17)```

リッチプッシュのウィンドウ上で PDFファイルのURLを表示することができない

不具合の概要(Description of bug)

  • SDKのバージョン(SDK version)
    3.1.0
  • 不具合が発生した環境(Environment requirement)
    Android 6
  • 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
    以下のURLを指定したリッチプッシュを送付する。
     パターン①:PDFファイル
     パターン②:通常のWebページ
  • 事象 (Phenomenon)
     パターン①:画面がホワイトアウトして、PDFが表示できない
     パターン②:通常のWebページは表示できるが、そのWebページからリンクしているPDFファイルが開けない。

Google Analytics SDKとの競合(Conflict)

Unity 5.3にNifty Cloud SDKを実装しプッシュ通知を利用したいのですが、以下のように、ビルド時に先に実装していたGoogle Analytics SDKとの競合エラーが発生してしまいます。


Error building Player: CommandInvokationFailure: Unable to convert classes into dex format. See the Console for details.
C:\Program Files\Java\jdk1.8.0_40\bin\java.exe -Xmx2048M -Dcom.android.sdkmanager.toolsdir="D:/Android SDK\tools" -Dfile.encoding=UTF8 -jar "E:\Unity\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\sdktools.jar" -

stderr[
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/analytics/internal/Command;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/analytics/internal/Command$1;
2 errors; aborting

]

Google Analytics SDKを削除してビルドすると、Nifty Cloud SDKがクラッシュし、Nifty Cloud SDKを削除すると、Google Analyticsは正常に動作するような状況です。

こちらのコミュニティやネットでも検索してみましたが、同様のケーススタディが見つかりませんでした。バグの可能性ありという指摘がありましたので、Issueを切ります。

Xcodeのビルド時にリンカエラー

不具合の概要(Description of bug)

  • SDKのバージョン(SDK version)
    v3.0.1

  • 不具合が発生した環境(Environment requirement)

  • 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
    Xcodeのビルド時に_UNUserNotificationCenterのリンカエラーが発生

  • エラーメッセージ(Error messages)

4.0.1/ログインユーザを2回以上更新するとエラー

不具合の概要(Description of bug)

  • SDKのバージョン(SDK version)ver4.0.1
  • 不具合が発生した環境(Environment requirement) Unity2019.1.12f1+Windows7
  • 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
    次の手順となります。
  1. 「クイックスタート」の手順に従い環境を整える。
  2. NCMBSettingsオブジェクトに、下記のスクリプトをアタッチして実行する。
using NCMB;
using NCMB.Tasks;
using UnityEngine;

public class NCMBTest : MonoBehaviour {
    private async void Start() {

        await NCMBUser.LogOutTaskAsync();

        NCMBUser user = new NCMBUser();

        user.UserName = "Yamada Tarou";
        user.Password = "password";
        user.Add("phone", "987-654-3210");

        await user.SignUpTaskAsync();

        //987-654-3210と表示される
        Debug.Log(user["phone"]);

        NCMBUser currentUser = await    NCMBUser.LogInTaskAsync("Yamada Tarou", "password");

        currentUser["phone"] = "987-654-0123";

        currentUser = await currentUser.SaveTaskAsync();

        //987-654-0123と表示される
        Debug.Log(currentUser["phone"]);

        currentUser["phone"] = "987-654-2222";

        //エラー発生
        //StatusCode:403
        //Error:NCMB.NCMBException: sessionToken must not be entered.
        //ResponseData:
        currentUser = await currentUser.SaveTaskAsync();

        Debug.Log(currentUser["phone"]);
    }
}

  • エラーメッセージ(Error messages)
NCMBException: sessionToken must not be entered.
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () (at <7d97106330684add86d080ecf65bfe69>:0)
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) (at <7d97106330684add86d080ecf65bfe69>:0)
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) (at <7d97106330684add86d080ecf65bfe69>:0)
System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) (at <7d97106330684add86d080ecf65bfe69>:0)
System.Runtime.CompilerServices.TaskAwaiter`1[TResult].GetResult () (at <7d97106330684add86d080ecf65bfe69>:0)
NCMBTest+<Start>d__0.MoveNext () (at Assets/Scripts/NCMBTest.cs:36)
--- End of stack trace from previous location where exception was thrown ---
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () (at <7d97106330684add86d080ecf65bfe69>:0)
System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state) (at <7d97106330684add86d080ecf65bfe69>:0)
UnityEngine.UnitySynchronizationContext+WorkRequest.Invoke () (at C:/buildslave/unity/build/Runtime/Export/Scripting/UnitySynchronizationContext.cs:115)
UnityEngine.UnitySynchronizationContext:ExecuteTasks()

-原因の可能性
2回目のPUTのログが

�url�:https://mbaas.api.nifcloud.com/2013-09-01/users/Jw73knBE9p31OYxh
�type�:PUT
�content�:{"sessionToken":"mj7et4qoWRfbEFFBcKXeqYLS4","phone":"987-654-2222"}
UnityEngine.Debug:Log(Object)
NCMB.Internal.NCMBDebug:Log(String) (at Assets/NCMB/Script/NCMBDebug.cs:44)
NCMB.NCMBObject:Save(NCMBCallback) (at Assets/NCMB/Script/NCMBObject.cs:960)
NCMB.Tasks.NCMBUserTaskExtension:SaveTaskAsync(NCMBUser) (at Assets/NCMB/Script/Task/NCMBUserTaskExtension.cs:38)
<Start>d__0:MoveNext() (at Assets/Scripts/NCMBTest.cs:36)
System.Threading.Tasks.TaskCompletionSource`1:SetResult(NCMBUser)
NCMB.Tasks.<>c__DisplayClass1_0:<SaveTaskAsync>b__0(NCMBException) (at Assets/NCMB/Script/Task/NCMBUserTaskExtension.cs:46)
NCMB.<>c__DisplayClass72_0:<Save>b__0(Int32, String, NCMBException) (at Assets/NCMB/Script/NCMBObject.cs:978)
NCMB.Internal.<SendRequest>d__37:MoveNext() (at Assets/NCMB/Script/NCMBConnection.cs:458)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

となっており、#143が関連している可能性が考えられます。

ログイン中のユーザを更新すると以降リクエストエラーになる

不具合の概要(Description of bug)

  • SDKのバージョン(SDK version): v.4.0.0
  • 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
    以下の手順を実施すると、エラーが発生することを確認しています。
  1. 登録済みの会員にログインする
  2. ユーザー情報を取得し、何らかのデータを更新する。(SaveAsync()を実施)
  3. データストアの適当なクラスに検索する。(FindAsync()を実施すると以下のエラーが発生する)
  • エラーメッセージ(Error messages)
NCMBException: NCMBObject has no data for this key.  Call FetchAsync() to get the data.
NCMB.NCMBObject._checkGetAccess (System.String key) (at Assets/NCMB/Script/NCMBObject.cs:200)
NCMB.NCMBObject.get_Item (System.String key) (at Assets/NCMB/Script/NCMBObject.cs:58)
NCMB.NCMBUser.get_SessionToken () (at Assets/NCMB/Script/NCMBUser.cs:101)
NCMB.NCMBUser._getCurrentSessionToken () (at Assets/NCMB/Script/NCMBUser.cs:351)
NCMB.NCMBQuery`1[T].Find (NCMB.NCMBQueryCallback`1[T] callback) (at Assets/NCMB/Script/NCMBQuery.cs:568)
NCMB.NCMBQuery`1[T].FindAsync (NCMB.NCMBQueryCallback`1[T] callback) (at Assets/NCMB/Script/NCMBQuery.cs:551)
PushObject.Process3 () (at Assets/Scenes/PushObject.cs:72)
PushObject+<Process2>c__AnonStorey0.<>m__0 (NCMB.NCMBException e2) (at Assets/Scenes/PushObject.cs:63)
NCMB.NCMBObject+<Save>c__AnonStorey1.<>m__0 (System.Int32 statusCode, System.String responseData, NCMB.NCMBException error) (at Assets/NCMB/Script/NCMBObject.cs:978)
NCMB.Internal.NCMBConnection+<SendRequest>c__Iterator0.MoveNext () (at Assets/NCMB/Script/NCMBConnection.cs:458)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at /Users/builduser/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)

原因の可能性

NCMBUser.SaveAsync() を実行すると、ローカルにあるCurrentUserの更新を行いますが、同時にkey sessionTokenが削除されます。以降のリクエストがNCMBUser._getCurrentSessionToken()を呼び出せれ、データが存在しない例外が発生しました。

unity5.3.5f1でビルド出来ない

不具合の概要(Description of bug)

  • SDKのバージョン(SDK version)
    • 2.1.1
  • 不具合が発生した環境(Environment requirement)
    • unity5.3.5f1
  • 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
    • クイックスタートを unity5.3.5f1で実施
  • エラーメッセージ(Error messages)
Assets/NCMB/NCMBManager.cs(230,87): error CS1502: The best overloaded method match for System.IO.FileNotFoundException.FileNotFoundException(string, string)' has some invalid arguments Assets/NCMB/NCMBManager.cs(230,87): error CS1503: Argument#2' cannot convert System.IO.FileNotFoundException' expression to typestring'

iOS10の端末で開封率が反映されない

不具合の概要(Description of bug)

iOS10の端末で開封率が反映されません。

  • SDKのバージョン(SDK version)
    ncmb_unity 3.0.0
    Unity2017.1.0b1 及び Unity5.6.0f3

  • 不具合が発生した環境(Environment requirement)

  • 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
    http://mb.cloud.nifty.com/doc/current/push/openrates_unity.html#プッシュ通知の開封通知を行う
    NCMBSettingsのInspector内「useAnalytics」にチェックを入れて、プッシュ通知から起動しても、反映されませんでした。

  • エラーメッセージ(Error messages)

プッシュ通知を設定する際、メッセージとタイトルをnullで指定する場合、クラッシュになる

  • 以下のようにプッシュ通知を設定すると、
 {
    aps =     {
        alert =         {
            body = "<null>";
            title = "<null>";
        };
        "content-available" = 1;
        sound = "<null>";
    };
    "com.nifty.PushId" = **************;
}

Unity SDKで受信する時、以下のようにクラッシュになります

Application Specific Information:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull UTF8String]: unrecognized selector sent to instance'
  • 原因の可能性
    下記のUnitySDKでのプッシュ通知を受信する処理では
    bodyがnullとtitleがnullを持っているalertを持っているuserInfoオブジェクトをUnitySendRemoteNotificationに設定しているので本エラーが発生しました。
    ※UnitySendRemoteNotificationはnull許可しないため

  • 修正案

今のソースはsoundがnullの場合のみsoundがuserInfoから削除されています。合わせて、nullがある値は削除処理を追加
https://github.com/NIFCloud-mbaas/ncmb_unity/blob/master/ncmb_unity/Assets/Plugins/iOS/NCMBAppControllerPushAdditions.mm#L209

ビルドしたAPKをアンドロイド端末にインストールできない

SDKのバージョン(SDK version)
2.2.0
不具合が発生した環境(Environment requirement)
unity5.3.5f1
不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
unity5.3.5f1でAPKファイルをビルド後、アンドロイド端末にてインストールを行う。
エラーメッセージ(Error messages)
パッケージの解析中に問題が発生しました。

補足
SDKのバージョン2.0.0でビルドした場合は正常にインストールができます。

実機でログインする際にエラーが発生する

不具合の概要(Description of bug)

  • SDKのバージョン(SDK version)
    • v3.2.0
  • 不具合が発生した環境(Environment requirement)
    • Unity 2017.3.0f3
  • 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
    • ログインメソッドを実行
  • エラーメッセージ(Error messages)
    • Unknown Error

Login後にユーザ保存するとローカルのcurrentUserが反映されない

  • 現象
    Unity SDKを利用し、ユーザログインし、currentUserのユーザ情報を更新しようとすると、
    サーバ側はデータ反映しましたが、currentUser内のローカルデータは反映しません。
  • 原因

/ncmb_unity/Assets/NCMB/NCMBUser.cs

		//save後処理  オーバーライド用 新規登録時のみログインを行う
		internal override void _afterSave (int statusCode, NCMBException error)
		{
			if (statusCode == 201 && error == null) {
				_saveCurrentUser ((NCMBUser)this);
			}
                }

ユーザが正常に保存した後のstatusCodeが200のため、上記のロジックのため、_saveCurrentUser ((NCMBUser)this);が処理を実行されません。

  • 改修案
			if ( (statusCode == 201 || statusCode == 200) && error == null) {
				_saveCurrentUser ((NCMBUser)this);
			}

エディター上でゲーム再生中にログインし、そのまま再生を止めるとcurrentUserファイルが残る

概要

Unityエディタ上でPlayボタンを押下しログインを行った後、ログアウト処理をせずに再生を止めると、NCMBSettings.currentInstallationPath ( Application.persistentDataPath )下のcurrentUserファイルが残ったままになります。
この状態で再びPlayボタンを押すと、ログイン処理を行う前にNCMBUser.CurrentUserにcurrentInstallationが入りっぱなしになり、予期しない動作につながります。

iosでリッチプッシュ通知を2回目からタップするとリッチビューが表示されません

不具合の概要(Description of bug)

UnitySDKでビルドするiOSアプリに限り、
アプリがバックグラウンドモードで、リッチプッシュ通知を2回目からタップするとアプリを開くけど、リッチビューが表示されません。

SDKのバージョン(SDK version)

最新版: v3.0.1

Platform

iOS

不具合を再現させる手順

  1. UnitySDKでプッシュアプリを作成して、インストールする
  2. アプリを開いたとたん、バックグラウンドモードにする
  3. リッチプッシュ通知を受信して、通知をタップして、アプリを開いて、リッチビューが表示される
  4. また、アプリをバックグラウンドモードにする
  5. リッチプッシュ通知を受信して、通知をタップして、アプリを開いて、リッチビューが表示されない。

エラーの原因詳細

リッチプッシュ通知をタップするとNCMBRichPushView.mのhandleRichPushメソッドを呼ばれます。
handleRichPushメソッドの処理は以下の通りです。

  1. リッチビューがnilかどうか確認します
    → nilでしたら、リッチビューを初期して、リッチビューが表示します
  2. リッチビューがリッチURLを読んで、表示します

2回目からリッチビューがnilではないので、リッチビューが表示するのソースが実施されていなくて、表示されないんです。

V4.0.2/新規サインインしてもアカウント情報を取得できない

不具合の概要(Description of bug)

  • SDKのバージョン(SDK version)v4.0.2
  • 不具合が発生した環境(Environment requirement)Unity2019.2.6f1+windows10
  • 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
    ニフクラのサンプル「アプリにログイン機能をつけよう!」にNCMB4.0.2をインポートする

Twitter連携時にArgumentExceptionが発生

Twitter連携でLinkWithAuthDataAsyncを呼び出したとき、
ユーザーにAuthDataが存在しない場合のみ、ArgumentExceptionが発生します。
SignUp処理が2度走り、authDataのマージでエラーとなっているようです。
※片方のSignUpが成功し画面上は問題なく登録されています。

  • SDKのバージョン(SDK version)
    v3.0.0

  • 不具合が発生した環境(Environment requirement)
    Unity 5.6.0f3
    Unity 2017.1.0b1

  • 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)

  1. 新規でAuthDataを持たないユーザーを作成
  2. LinkWithAuthDataAsyncでTwitterと連携
  • エラーメッセージ(Error messages)
    ArgumentException: An element with the same key already exists in the dictionary.

Response Validationにチェックある場合、ダブルクォーテーション値を検索時NG

■現象

  1. Script用のサーバstubを立ち上げる。(あるいは、node.jsを立ち上げる)
    2.UnityEditorTestを実行すると、テスト失敗(NG)になっている。
    ※NCMBObjectTest.cs
    |-- doubleQuotationUnescapeTest()
    NG内容 ="Authentication error by response signature incorrect."

・チケット: Unity No.122592と同じ課題です

  • 事前環境設定:Response Validationにチェックをする
  • 値にダブルクォーテーションが入っている場合 - 登録、更新、削除はOK, 検索はNG -> レスポンスシグネチャCheckにNGになる

■原因
v1.1.5 :/ncmb_unity/releases/
・データに絵文字が含まれる場合のレスポンスシグネチャ計算の不具合を修正しました
   -> ダブルクォーテーションが検索出来ない不具合発生する結果になった!

v2.1.1 :/ncmb_unity/releases/
・ダブルクォーテーションがフィールド内に含まれた場合にデータを検索出来ない不具合を修正
  -> 正しく修正出来てない!

■対応
・今回の修正で過去のv1.1.5とv2.1.1の両方対応にも合う修正する
・パターン1 : ダブルクォーテーションなどエスケープがあるデータ
・パターン2 : 絵文字(4桁の16進数で表記されたUnicode文字)があるデータ
(絵文字一覧 : http://www13.plala.or.jp/bigdata/emoji.html)
・パターン3 : 絵文字とダブルクォーテーションが混雑するデータ

AndroidのtargetSdkVersionの指定について

以下のGoogle からの告知により、今後アプリが対応するAPIが28以降になります。
https://android-developers.googleblog.com/2019/02/expanding-target-api-level-requirements.html

Unity SDK内で利用するAndroid設定関連部分ではtargetSdkVersionは現在以下のように、
指定されていますが、アプリ側の指定に合わせるため、SDK側の指定が不要と判断され、
削除を検討します。
https://github.com/NIFCloud-mbaas/ncmb_unity/blob/master/NcmbFcmPlugin/ncmbfcmplugin/build.gradle

        minSdkVersion 14
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"

空のロールを取得後、ユーザーの追加を行なうとエラーが発生する

不具合の概要(Description of bug)

  • SDKのバージョン(SDK version)
    • UnitySDK 2.1.1
  • 不具合が発生した環境(Environment requirement)
    • Unity 5.3
  • 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
NCMBRole.GetQuery ().WhereEqualTo ("roleName", "expertPlan")
    .FindAsync ((roleList, error) => {
    NCMBRole role = roleList [0];
    role.Users.Add (NCMBUser.CurrentUser);
    role.SaveAsync ();
});
  • エラーメッセージ(Error messages)
    • Operation is invalid after previous operation.

【要望】UnitySDKではプッシュ通知を登録する際、絞り込み配信ができるようにする

内容

  • 現在UnitySDKで端末絞り込みできるのはPushTiAndroid/PushToIoSのみ
  • searchConditionを指定できるようにすることで、配信端末絞り込みが簡単にできるようになります
  • 詳細実装方法はAndroid/iOSで実施している方法でいいではないかと思います

参考

iOSで行っている実装

http://mb.cloud.nifty.com/assets/sdk_doc/ios/doc/html/Classes/NCMBPush.html#//api/name/setSearchCondition:

Androidで行っている実装
http://mb.cloud.nifty.com/assets/sdk_doc/android/javadoc/index.html
⇒ NCMBPush -> setSearchConditionメソッド

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.