[Unity]Kii Cloudでサーバーサイド構築 part.2

Unity + Kii Cloudでサーバーサイド構築 part2として、まずはユーザー登録を試してみたいと思います。

前=>[Unity]Kii Cloudでサーバーサイド構築 part.1

次=>まだ

SSL証明書の判定

Kii CloudサーバーはSSL対応しているようですが、
.Netの仕様上、SSL対応したサーバーへHttpWebRequest飛ばす場合、証明書の判定を行わないとエラーになってしまうようです。
SDK内で対応してくれていればよかったのですが、見事エラーがでてユーザー作れねーぞごるぁ!?って状態になったので、自前で用意することにします。

まずは、前回作成したKiiCloudManagerに以下のコールバックメソッドを用意します。

private static bool OnRemoteCertificateValidationCallback(System.Object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
		System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors )
{
	System.Net.HttpWebRequest request = sender as System.Net.HttpWebRequest;

	string hostName = request.RequestUri.Host;
	if( hostName == "api-jp.kii.com" ||
		hostName == "api.kii.com" ||
		hostName == "api-cn2.kii.com" )
	{
		return true;
	}

	return false;
}

適当なところにコピペってください。
Kii Cloud使うことは分かりきっているので、厳密な判定はしないでホスト名で判定しちゃってます。

さて、あとは、このコールバックメソッドをKii.Initializeする前に登録しておきます

void Awake()
{
	string deviceID = SystemInfo.deviceUniqueIdentifier;

	System.Net.ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(OnRemoteCertificateValidationCallback);

	Kii.Initialize( _AppID, _AppKey, Kii.Site.JP );

	KiiAnalytics.Initialize( _AppID, _AppKey, KiiAnalytics.Site.JP, deviceID );
}

こんな感じ。
以上で、変なエラーに悩まされることなく、心置きなくKii Cloudさんを酷使できるようになりました。

※いや、まさかこんなところで躓くとは思ってもいなかったので、激おこぷんぷん丸だったりします。Kii Cloud公式ドキュメントに載ってないし、Unity SDK出すにあたってちゃんとデバッグしたんやろか・・・

ユーザー登録

それでは、本題のユーザー登録を試していきます。

まずは、ユーザー登録に当たっての注意点は、

  • ユーザー名、パスワードが使用可能文字か
  • 同じユーザー名が存在するか

これらのチェックをしなければなりません。

  • ユーザー名、パスワードが使用可能文字か
    こちらは、判定用メソッドが用意されているので、それを使えばOKです。
    KiiUser.IsValidUserNameとKiiUser.IsValidPasswordです。
    入力させる段階でその文字しか使えないようにできればいいですけどね。
  • 同じユーザー名が存在するか
    ユーザー検索メソッドはありますが、ログインしていないと使えないようです。
    なので、判定するには実際にユーザー登録APIを叩いてエラーが返ってきたらその内容をチェックする必要があります。
    なお、エラーの詳細はREST APIのドキュメントにしか載ってないようです。
    REST APIのドキュメント

エラーの内容をチェックするには、CloudException例外をキャッチするとBodyプロパティにJson形式のエラー情報が入っているので、それを解析する必要があります。
Jsonの解析には、以前LitJsonを使えるように組み込んでいたのでそれを使います。
[Unity]LitJsonでセーブデータのシリアライズ

エラー情報の受け取り用クラスはこちら

public class KiiErrorInfoBase
{
	public string errorCode;
	public string message;
}

public class KiiErrorUserAlreadyExists : KiiErrorInfoBase
{
	public string field;
	public string value;
}

各APIの詳細はいらないって場合は、KiiErrorInfoBaseだけでも大丈夫です。

以上を踏まえて作成したメソッドが以下のとおりです

public bool RegistUser( string userName,string password )
{
	if( !KiiUser.IsValidUserName( userName ) ||
		!KiiUser.IsValidPassword( password ) )
	{
		Debug.LogError( "Invalid user name or password : " + userName );
		return false;
	}

	KiiUser.Builder builder = KiiUser.BuilderWithName(userName);
	_User = builder.Build ();

	try
	{
		_User.Register( password );

		Debug.Log ( "Success user regist : " + userName );
	}
	catch( KiiCorp.Cloud.Storage.CloudException exception )
	{
		switch( exception.Status )
		{
		case 409:
			KiiErrorUserAlreadyExists errorUserAlreadyExists = JsonMapper.ToObject<KiiErrorUserAlreadyExists>( exception.Body );

			Debug.LogError( "ErrorInfo : " + errorUserAlreadyExists.errorCode + " : " + errorUserAlreadyExists.message + " : " + errorUserAlreadyExists.field + " = " + errorUserAlreadyExists.value );
			break;
		default:
			KiiErrorInfoBase errorInfo = JsonMapper.ToObject<KiiErrorInfoBase>( exception.Body );

			Debug.LogError( "ErrorInfo : " + errorInfo.errorCode + " : " + errorInfo.message );
			break;
		}

		_User = null;
		return false;
	}
	catch( System.Exception exception )
	{
		Debug.LogError( "Failed user regist : " + userName + " : " + exception );
		_User = null;
		return false;
	}

	return true;
}

適当なタイミングでRegistUserを呼び出してあげればユーザー登録完了です。
登録済みユーザー名で再度RegistUserを呼べば重複時のエラーメッセージが見れます。

ここまでの懸念点

ここまで対応してみて思い立った懸念点をざっと上げておきます。

  • 非同期呼び出しができない
    ネットワーク環境によってはかなり時間がかかることもあると思いますが、非同期呼び出しができないみたいなので、完全に処理が止まってしまいます。
    Kii Cloudの内部処理次第ではありますが、できるなら別スレッドで対応したほうがいいのかもしれません
  • ユーザー名が英数のみ
    ユーザー名以外にDisplaynameという自由に名前が付けられるフィールドがあるみたいですが、Displaynameは重複不可になってません。
    日本人向けに提供し、フレンド対応などをしたいと思っているウチの場合は、名前が結構重要になってきます。
    まあ、英数のみにすればいいじゃんという話でもありますが、要求仕様的にはやっぱり日本語対応したいところです。
  • ユーザー登録不要系のスマホアプリ対応
    登録不要のスマホアプリは結構多く、ウチもできればその形式で済ませたいと思っています。
    ただ、前述のとおりKii Cloudはユーザー名に日本語が使えないので、入力してもらった名前で管理するのは難しいです。
    そこで、UUIDなどでKiiCloud用ユーザー名を自動生成し、パスワードも自動生成。
    内部的にユーザー登録という形式にする以外になさそうです。
    もちろん、UUIDとはいえ重複する可能性は少なからずあるので、重複していたらUUIDを再生成して再登録といった感じ。
    あるいは、SystemInfo.deviceUniqueIdentifierをユーザー名に使うのもひとつの手ですね。
    この場合は、プラットフォームも埋め込んで置いたほうがいいかもしれません。
    そして、Kii Cloudユーザー登録後に、ゲーム用ユーザー情報作成のために、データストレージや拡張機能を使ってゲーム用ユーザー名の重複チェックなどを行う形式になると思います。
    はい。結構面倒なことになってきました。

次回は、その登録不要アプリ対応をやってみたいと思います。

Unityのアセット販売中!

ステートマシンの状態遷移やパラメータはエディタで編集でき、
ゲームロジックに依存するステートの挙動はスクリプトで記述可能なエディタ拡張。

詳細はこちら

RPGツクールVXやWOLF RPGエディターのオートタイルに準拠したエディタ拡張。

詳細はこちら

オススメ!