nifcloud-mbaas / ncmb_unity Goto Github PK
View Code? Open in Web Editor NEWニフクラ mobile backend Unity SDK
License: Apache License 2.0
ニフクラ mobile backend Unity SDK
License: Apache License 2.0
Unity 2019で開く時、以下の警告が出ております。
Assets/NCMB/Script/NCMBUser.cs(508,32): warning CS0618: 'WWW' is obsolete: 'Use UnityWebRequest, a fully featured replacement which is more efficient and has additional features'
Unity 2019年版で、Unity 4.0.3で以下の流れで検証を実施して、エラー再現しました。
※例としてFacebook認証として記載ですが、実装は同様のため、twitter認証もエラー発生すると思われます。
以下のドキュメントの通り実装
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);
}
});
});
}
<<省略>>
}
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内のコメントに誤りがあることを確認いたしました。
【誤】
<!-- 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.ncmbgcmplugin
をcom.prime31
に書き換える形になります。
お客様にはご迷惑をおかけいたしますが、
コメント修正はSDKのアップデートまでいましばらくお待ちいただきますようお願い申し上げます。
NCMBConnections.csのSendRequest()メソッド内で、処理の完了をWaitForSeconds()で待っていますが、WaitForSecondsRealtime()への変更を要望いたします。
WaitForSeconds()はスケールされた時間で待ってしまうため、Time.timeScaleを変更すると待ち時間が変化してしまいます。Time.timeScaleが0の場合、止まってしまいます。
ご検討、よろしくお願いいたします。
■再現環境
。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のオブジェクトが正しくクエリに設定されるように修正する。
Unity5.3でビルドしたiOSのプッシュ通知において、
RichPushおよび開封通知が実行されない不具合を確認しております。
お客様にはご迷惑をおかけいたしますが、
SDKのバージョンアップまで今しばらくお待ちくださいますようお願い申し上げます。
/// <summary>
///メッセージ受信後のイベント
/// </summary>
void OnNotificationReceived(NCMBPushPayload payload)
{
// ここでペイロードデータ出力
}
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();
}
}
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)
if (responseData != null) {
でトラップされないためだと思われます。この行を、
if (!string.IsNullOrWhiteSpace(responseData)) {
と編集する事で上記エラーを回避する事ができます。
/// <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"/>
PlayModeTestフォルダ内のファイルで記載されている、
using UnityEditor;
は使用されていないコードのため削除する
ダブルクォーテーションがフィールド内に含まれた場合に、
データを検索出来ない不具合を確認しております。
お客様にはご迷惑をおかけいたしますが、
SDKのバージョンアップまでいましばらくお待ちいただきますようお願い申し上げます。
Copyright 2017 FUJITSU CLOUD TECHNOLOGIES LIMITED All Rights Reserved.
↓
Copyright 2017-2018 FUJITSU CLOUD TECHNOLOGIES LIMITED All Rights Reserved.
会員登録済みの場合、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);
}
});
一部Android端末においてオフライン時にAPIリクエストを行うと、
アプリが強制終了する不具合を確認しております。
お客様にはご迷惑をおかけいたしますが、
SDKのバージョンアップまで今しばらくお待ちくださいますようお願い申し上げます。
■環境
▼種別 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;
以上です。
ニフティクラウド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) {
SDKの改善にご協力いただきありがとうございます。
(Thank you for your support our SDK.)
SDKの不具合を報告する場合は、以下の項目を確認してください。
(If you want to report a bug of the SDK, please confirm the following terms.)
iOS実機、Unity Editorは正常に動作しております。
Android実機において、検証を行い動作しないため、ご連絡いたします。
SenderId、AndroidManifest.xmlの設定はもちろん行っております。
NCMBのC#スクリプトを追いかけたところ
NCMBPush.cs
m_AJClass.CallStatic("InitSenderId", senderId);
の呼び出しまで実行されておりますが、
NCMBManager.onTokenReceived に返ってきてないようです。
なので、installationに登録される、installation.SaveAsync 以前に
このイベントハンドラの呼び出しが行われていないようです。
InitSenderIdの内部まで追いかけられなかったため、
不具合に関する解消に関してアップデートを待てば良いのか、
他の原因があるのか等ご教授いただきたく連絡しました。
よろしくお願いいたします。
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
├── NCMBManager.cs
├── NCMBSettings.cs
└── Script
├── CommonConstant.cs
├── ExtensionsClass.cs
├── MimeTypeMap.cd
・
・
・
エラー確認するコードは以下となります。
削除するユーザは権限許可されたユーザと前提になります。
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)```
UnityPlayerProxyActivity
が非推奨に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を切ります。
SDKのバージョン(SDK version)
v3.0.1
不具合が発生した環境(Environment requirement)
不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
Xcodeのビルド時に_UNUserNotificationCenterのリンカエラーが発生
エラーメッセージ(Error messages)
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"]);
}
}
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が関連している可能性が考えられます。
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()を呼び出せれ、データが存在しない例外が発生しました。
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の端末で開封率が反映されません。
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)
{
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
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でビルドした場合は正常にインストールができます。
/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);
}
Unityエディタ上でPlayボタンを押下しログインを行った後、ログアウト処理をせずに再生を止めると、NCMBSettings.currentInstallationPath ( Application.persistentDataPath )下のcurrentUserファイルが残ったままになります。
この状態で再びPlayボタンを押すと、ログイン処理を行う前にNCMBUser.CurrentUserにcurrentInstallationが入りっぱなしになり、予期しない動作につながります。
UnitySDKでビルドするiOSアプリに限り、
アプリがバックグラウンドモードで、リッチプッシュ通知を2回目からタップするとアプリを開くけど、リッチビューが表示されません。
最新版: v3.0.1
iOS
リッチプッシュ通知をタップするとNCMBRichPushView.mのhandleRichPushメソッドを呼ばれます。
handleRichPushメソッドの処理は以下の通りです。
- リッチビューがnilかどうか確認します
→ nilでしたら、リッチビューを初期して、リッチビューが表示します- リッチビューがリッチURLを読んで、表示します
2回目からリッチビューがnilではないので、リッチビューが表示するのソースが実施されていなくて、表示されないんです。
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)
■現象
・チケット: Unity No.122592と同じ課題です
■原因
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 : 絵文字とダブルクォーテーションが混雑するデータ
下記の様なコードの場合コメントアウト部分の代入必須である理由が分からない
var acl = user.ACL
acl.SetRoleReadAccess(“Admin”,true);
user.ACL = acl;//この代入必須が分からない
user.SaveAsync();
以下の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"
別のJSONライブラリを使っていたりするとコンフリクトするのだそうです。
MiniJSONのライセンス上ではそういった改造は可とのこと。
NCMBRole.GetQuery ().WhereEqualTo ("roleName", "expertPlan")
.FindAsync ((roleList, error) => {
NCMBRole role = roleList [0];
role.Users.Add (NCMBUser.CurrentUser);
role.SaveAsync ();
});
iOSで行っている実装
Androidで行っている実装
http://mb.cloud.nifty.com/assets/sdk_doc/android/javadoc/index.html
⇒ NCMBPush -> setSearchConditionメソッド
関連issue内容:
NIFCLOUD-mbaas/ncmb_android#192
をjarからaarにしないとUnityに組み込んだ場合にワーニングが発生する
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.