💨

Apple IDでサインインできないからリジェクトされた話

2023/07/06に公開1

はじめに

N-thy では Scade という音を録音しシェアしたり、マップ上に登録することができるアプリを開発しています.
https://apps.apple.com/jp/app/scade/id6448228456

今回はこのアプリを審査に出した際に「 Apple ID でサインインできない」という理由でリジェクトされた話についての記事です.Apple ID でサインインできるようにする方法や、Simulator で SignInWithApple の動作確認を行う方法などについて紹介します.

内容

Apple Store の審査に出すと、以下のような内容が返ってきてリジェクトされました.

Guideline 4.8 - Design - Sign in with Apple

Your app uses a third-party login service, but does not offer Sign in with Apple. Apps that use a third-party login service for account authentication need to offer Sign in with Apple to users as an equivalent option to provide the sign-in experience App Store users expect.

Next Steps

Please revise your app to offer Sign in with Apple as an equivalent option for account authentication.

Additionally, it would be appropriate to update the screenshots in your app's metadata to accurately reflect the revised app once Sign in with Apple has been implemented.

Resources

- Review Sign in with Apple sample code.
- For an overview of design and formatting recommendations for Sign in with Apple, see the Human Interface Guidelines.
- Learn about the benefits of Sign in with Apple.

内容を簡単にまとめると、「サードパーティーのログインサービスを使うなら Apple も入れないとリリースさせないぞ」ということです.そのため現在開発中のアプリの Scade に Apple でのサインイン機能を追加しました.

前提

これまで firebase Auth を用いて Google アカウントでログインできるようになっていました.また、マイページや Scade と呼ばれるユーザーに投稿された音声の一覧などでユーザーのプロフィール画像、表示名を取得して表示しています.

ログイン画面 マイページ Scade

方針

こちらのパッケージを使用しました.
https://pub.dev/packages/sign_in_with_apple

実装

基本的には上記パッケージの README を参考に実装を行いました.

BundleID の設定

以下のページから BundleID を選択します.
https://developer.apple.com/account/resources/identifiers/list/bundleId

そして、以下のようなページから SignInWithApple の Capabilities を選択して保存します.

Firebase の設定

Firebase Authentication の Sign-in method で Apple を選択します.以下のような画面で Apple を有効にします.

Xcode の設定

Xcode で runner.xcodeprj を開いて、 Capability から SignInWithApple を追加します.

実装

$ flutter pub get sign_in_with_apple

などでパッケージをインストールします.そして、Signin のボタンを押すと、以下のようなロジックが呼ばれるようにします.

final credential = await SignInWithApple.getAppleIDCredential(
  scopes: [
    AppleIDAuthorizationScopes.email,
    AppleIDAuthorizationScopes.fullName,
  ],
);

final oauthProvider = OAuthProvider('apple.com');
final oAuthCredential = oauthProvider.credential(
  idToken: credential.identityToken,
  accessToken: credential.authorizationCode,
);

// 認証情報をFirebaseに登録
final user = (await FirebaseAuth.instance
        .signInWithCredential(oAuthCredential))
    .user;

// displayName, email が null なら空を入れる
if (user?.displayName == null ||
    (user?.displayName != null && user!.displayName!.isEmpty)) {
  final fixDisplayNameFromApple = [
    credential.givenName ?? '',
    credential.familyName ?? '',
  ].join(' ').trim();
  await user?.updateDisplayName(fixDisplayNameFromApple);
}
if (user?.email == null ||
    (user?.email != null && user!.email!.isEmpty)) {
  await user?.updateEmail(credential.email ?? '');
}

displayName, email の null チェックは、他の場所で displayName, email を使用する時のために行っています.( null になるケースがほとんどない & 特別な処理( null だったら入力させるとか?)はコストが高いという理由から、現状では空を入れるという暫定的な対応をしています)

その他

SignInWithApple ではユーザーのプロフィール画像を取得することができません.そこでプロフィール画像が取得できなければデフォルトのアイコンを表示するようにするなどの変更も行いました.今後はプロフィール画像などを後から変更できるようにもしていきたいと思っています.

Simulator での Apple Sign In

今回 Apple で SignIn できるようにする機能を作成するにあたって色々な記事を読みました.そこで、 Simulator では動作確認ができないという記事をよく見かけたのですが、 Simulator でもできたのでその方法を簡単に紹介します.

まず、Simulator の「設定」から「Sign in to your iPhone」を選択します.すると、 Simulator の「設定画面」からサインインしたアカウントが確認できます.

設定ページ Sign in ページ 確認画面

あとはアプリを起動して、SignInWithApple のボタンを押すだけです.Scade では以下のような流れでサインインできます.

Sign in ページ Apple ID の選択ページ パスワード入力 Scade のマイページ

困ったこと

余談なのですが、サインインボタンを作成する際に少し困ったことがあったので紹介します.

はじめはログインボタンの UI を簡単に統一できると思い以下のパッケージを導入しました.
https://pub.dev/packages/flutter_signin_button
同時期に、利用規約やプライバシーポリシーに同意しないとサインインできないようにするという修正を行っていました.その際に、同意していないとボタンを非活性にしたかったのですが、上記のパッケージではデザインを変更することができませんでした.そのため、ボタンを自作することになりました.
実際に完成した画像が以下になります.

非活性時 活性時

最後に

最後までお読みいただきありがとうございました.
今回は SignInWithApple の実装方法についてご紹介しました.使用したパッケージの README を読めば思っていたよりも簡単に実現できたかなと思います.

GitHubで編集を提案

Discussion

JboyHashimotoJboyHashimoto

シュミレーターの設定のところから、仮想デバイスでもログインする設定ができるんですね!
参考になりました!
ありがとうございます。