はじめに
UnityでLeaderboardを実装するためのSocialAPIを利用したのですが、気をつけないと不具合につながるケースがありました(というか進行不能の不具合をだしてしまいました)
環境
Unity: 5.5.0f3
ターゲット: iOS9以上
※Androidでは試していません
はまったのは認証API
こちらのドキュメントにあるように、認証したら成否を引数にコールバックを呼んでくれます。
https://docs.unity3d.com/ja/current/ScriptReference/Social-localUser.html
こんな感じですね。
public class SocialExample : MonoBehaviour {
void Start () {
Social.localUser.Authenticate (ProcessAuthentication);
}
void ProcessAuthentication (bool success) {
if (success) {
Debug.Log ("Authenticated");
}
else
Debug.Log ("Failed to authenticate");
}
}
とても簡単で便利ですね!
ただしよーくドキュメントを読むと次のページに注意書きがあります。
https://docs.unity3d.com/ja/current/ScriptReference/SocialPlatforms.ILocalUser.Authenticate.html
特定のプラットフォームではプログラムを 1 つ実行中に関数を呼び出すと、ユーザーや OS が認証するための最初の試みをキャンセルした場合、2 回目以降のコールバックが起動しない場合があります。
ふむふむ。認証画面を何度もださないようにプラットフォーム側が工夫しているんでしょうかね。
つまり2回以上呼び出さなきゃいいんだな と考えて、ローディングページで認証APIを呼んでコールバックを待つ実装にしていたのですが、1回目でもコールバックが返ってこないケースが発生していました。つまりローディングページから先に進めなくなるという致命的な不具合に。。。
自分の手元では起きていなかったので、リリース後にユーザーさんからの報告で気づきました。しばらくGameCenterまわりをさわっていない端末で起こっていそうです。
原因はよくわかっていないのですが、下記のような状況になっていました。
- 認証APIのコールバックが返ってこないケースがある
- それでもSocial.localUser.authenticatedはtrueを返す
- その状態でリーダーボードを開くと、「データを読み込めません。」と表示される
いずれにせよ、
Social.localUser.Authenticateのコールバックを待つような実装をしてはいけない
ということですな
今回のアプリは絶賛配信中です(もちろん不具合解消済み)
配信:
iOS: https://itunes.apple.com/jp/app/id1189800250
Android: https://play.google.com/store/apps/details?id=com.keepgamesimple.rollingsphere