Search Unity

2019 年 6 月に開催された Worldwide Developers Conference(WWDC)にて、Apple は新製品 Sign in with Apple を発表しました。2019 年 9 月 19 日に行われた iOS 13 のリリースに合わせて、Apple は App Store Review ガイドラインを更新し、サードパーティまたはソーシャルログインサービスを使用するすべての新規アプリケーションに、同等のオプションとして Sign in with Apple の提供が求められるようになりました。既存のアプリケーションについては、2020 年 4 月までに対応することが求められます。この変更の詳細については、Apple のデベロッパーサイトを参照してください。

Unity では、Unity の開発者の多くがサードパーティのサインインサービスを採用していることを理解しています。これらの新しいガイドラインに簡単に準拠できるように、Unity では新しいアセットストアパッケージを作成しました。このパッケージを新規または既存のプロジェクトに追加することで、新しい Sign in with Apple の機能を簡単に利用できます。

以下に次の内容がまとめられています。

  1. 新しいアセットストアプラグインの使用方法に関するステップバイステップガイド
  2. 重要なガイドラインへのリンク
  3. より高度なユースケースのための、サーバー側検証の実行方法に関する概要

プレイヤーの識別は多くのモバイルゲームにとって重要な部分を占め、プレイヤーのプライバシー確保の点で特に重要性が増しています。自社システムを保有している場合でも、サードパーティのログインシステムを利用している場合でも、Unity ではゲーム開発者に柔軟性を提供する一方で、プレイヤー体験がよりシームレスになるよう支援したいと考えています。また、そのことを念頭に置いて、Unity ではこの機会を利用して、今年の後半に公開予定のユーザー認証ソリューションの計画を共有したいと考えています。

スタートガイド

Sign in with Apple の利用を開始できるように、Unity では新しいアセットストアパッケージを作成しました。このパッケージの目的は、新しく追加された iOS 13 API で求められる Sign in with Apple を利用できるようにすることです。

他には Xcode 11 が必要です。Xcode 11 は、macOS 10.14(Mojave)または 10.15(Catalina)のほか、iOS 13.0 がインストールされているデバイスで動作します。Xcode と iOS 13 は、こちらからダウンロードできます。また、Unity では、Sign in with Apple クイックスタートガイドに目を通しておくことを推奨しています。このガイドでは、Apple の「Human Interface Guideline(英語)」と「App Store Review ガイドライン」について説明しています。また、アプリケーションで Sign in with Apple 機能を Apple のデベロッパーポータルで有効にする必要があります。

Unity アセットストアから新しいパッケージをダウンロードできます。

パッケージは、次のように使用します。

1.パッケージを既存の Unity プロジェクトにインポートします。
2.Apple からのログインに関わるデータを受け取るコールバックを持つスクリプトを作成します。API がどのように使用されるかの例については、サンプルスクリプト「SignInWithApple.cs」を参照してください。

3.Unity プロジェクトを再ビルドし、Unity によって作成された Xcode プロジェクトを開きます。

4.Xcode 内で、エンタイトルメントとフレームワークの依存関係を設定する必要があります。

a.「Project Settings」に「Sign in with Apple」機能を追加する必要があります。

b.プロジェクトに AuthenticationServices フレームワークを追加する必要があります。前のバージョンの iOS をターゲットにする予定がある場合は、このフレームワークをオプションとマークする必要があります。

ここまでの手順については、以下のビデオをご覧ください。

注:Unity 2019.2 またはそれより前のバージョンで作成された Xcode プロジェクトには UnityFramework ターゲットがありません。代わりに、AuthenticationServices フレームワークを Unity-iPhone ターゲットに追加する必要があります。

5.プロジェクトの設定が完了したら、次はコールバックで利用できるようにしたあらゆるデータを抽出し、プロジェクトの既存のコードベースで使用できるようにします。

サーバー側検証

サーバー側での ID 検証も求められるゲームやアプリケーションについては、検証のためにサーバーに identityToken を渡すことができます。

Apple の identityToken は、クライアント側では生成できない JSON Web Token(JWT)トークンです。JWT トークンが Apple により発行され、ご自身のアプリでの使用が意図されていることを検証するには、次のことを確認する必要があります。

  • 標準の JWT 検証を適用する:
  • その JWT トークンの対象がご自身のアプリの対象ユーザーであることを確認する。
    • Sign in with Apple から返されるトークンでは、対象ユーザーとしてご自身の iOS アプリ ID が使用されます。サーバー側でトークンを検証し、ご自身のアプリでの使用が意図されたものであることを確認する必要があります。

Apple JWT ペイロードクレームは、次のとおりです。

クレーム 列名 種類 説明
iss 発行元 string https://appleid.apple.com 値は常に https://appleid.apple.com
aud 対象ユーザー string com.unity.testApp トークンの対象ユーザー。
exp 有効期限 number 1568671600 エポック(1970 年 1 月 1 日 0 時 0 分 0 秒(協定世界時)からの経過秒数)で表したトークンの有効期限。
iat 発行時間 number 1568671000 エポックで表したトークンの発行時間。
sub 主体 string 001999.80b18c74c3264cad895d0eae181d8f50.1909 認証されたユーザーのユーザー ID。
c_hash コードハッシュ string agyAh42GdE-O72Y4HUHypg 承認コードのハッシュ。承認コードを検証する必要があるときにのみ使用されます。
email メール string xxx@privaterelay.appleid.com ユーザーの E メールアドレス。
email_verified 検証済みのメール string true メールが検証済みであるかどうか。これは JSON タイプの文字列です。
auth_time 認証時間 number 1568671000 エポックで表した認証が発生した時間。

JWT ライブラリは、ほとんどのプログラミング言語で用意されています。これらのライブラリはトークンを解析して検証するのに役立ちます。

JavaScript を使用する場合、トークンを検証する方法についての例は次のとおりです。stdin からトークンを読み取り、トークンの検証を試行します。”your.app.id” は Apple から提供される実際のアプリ ID に置き換えてください。

今後の見通し

今後のユーザー認証ソリューションは、Unity でホストされる認証 API と承認 API、バックエンドの実装と独立してログインとキー認証ワークフローを実装する Unity パッケージ、Sign in with Apple で求められるようなユーザー体験固有の要件に対処するドロップインプレハブで構成されます。

Unity のユーザー認証の最初のリリースでは、フェデレーション ID プロバイダーとしてメールの ID/パスワードと Sign in with Apple を介した認証のサポート(Android でのサポートを含む)を提供します。さらに、この新しいソリューションは拡張可能で、お好みでカスタマイズしたまたはサードパーティ製の追加のフェデレーション ID プロバイダーを統合できます。ユーザー認証では、一般的で簡略化された API を使用して Unity エディター内で ID プロバイダーを複数のプラットフォームにわたって設定できます。これにより、開発時間が数週間から数日短縮されるだけでなく、認証を簡単にするより多くの選択肢を顧客に提供できるようになります。消費者のプライバシー意識が高くなるにつれて、認証の代替案に対するニーズは高まります。

ユーザー認証のアルファ版は、今年後半にリリースされます。先行体験するにはサインアップしてください。

11 replies on “Apple サインインに対応”

Hello, is it possible to get an identity token from “apple sign in” without getting the apple popup each time ?

Figured out why it’s crashing, I’m getting the same issue.

Inside of Bulk_Assembly-CSharp_0.cpp, line 21015 there is a method called extern “C” void UserInfo_tC46F8D8850FF36FFAD9060EF32007B2A7F920041_marshal_pinvoke_back. Inside of this method an error is being set on line 21021 unmarshaled.set_error_4(il2cpp_codegen_marshal_string_result(marshaled.___error_4));

The crash is occurring here because the error is NULL when returned from the server because of a successful login, thus when the parameter is set and returned as null, it triggers a crash.

Here’s what I did as a temporary workaround:

Inside of UnitySignInWithApple.m, go to line 92, inside of the UserInfo struct, set data.error hardcoded to “NULL” (string). This no longer crashed after I was successfully signed in. I don’t know what other adverse effects this would have (if any) as I haven’t fully read through the code to see where else this method was invoked, but knowing this delegate method is presented on completion of a login, and there is already a check that verifies success, it should be fine.

Hope this helps, I’ll submit a bug report to Unity about this.

How can Unity release an official plugin with so many problems?! The two login functions are calling each other infinitely. The native callback functions don’t manage the memory correctly and cause crashes. The coding style is also terrible. Does Unity development team even do code review?

> Rebuild your Unity project and open the Xcode project created by Unity…
Does that mean that building with Unity Cloud Build wont work?

Good old Apple. Keeps forcing everyone to stay in their ecosystem. They never change.

Comments are closed.