はじめに
こんにちは! Eight事業部でiOSアプリエンジニアをしている福尾です。
コロナウイルス大変ですね...
弊社も原則在宅勤務になっており、日々リモートでの業務をしております。*1
幸い、僕が所属するアプリチームには普段からリモートの方が数人いるため、チーム全員がリモートになったからといって特に変わりはなくいつも通りに業務が行えております。
先が見えないですが、Stay Homeで頑張りましょう!
さて、みなさん去年のWWDC 2019で発表されたSign in with Appleという機能をご存知でしょうか?
対応しているアプリも出始めているので使ったことがある人もいるかもしれません。
我々が日々開発を行っている名刺アプリのEightというサービス(以下、Eight)も対応しました。
今回は、そのSign in with Appleについて、実装するに至った背景やざっくりとした対応方法を紹介したいと思います。
Sign in with Appleとは?
WWDC 2019で発表されたApple公式の認証システム*2になります。(iOS13以上で利用可能)
この機能を使うことでユーザは都度メールアドレスやパスワードを設定することなく、パスワード / TouchID / FaceIDで新規登録やログインができるようになります。
また、アプリに登録する際に利用するメールアドレスを匿名にし、Appleが自動生成したメールアドレスを使うことでAppleIDのメールアドレスをアプリに知られないようにすることも可能です。
加えて、Sign in with Apple JS*3を使うことでiOSだけでなく、Web版やAndroid版にも同様の機能を備えることが可能です。
実装しなければいけない!?
WWDC 2019での発表当初、Eightは新規登録時に自分の名刺の登録を必須としているため、Sign in with Appleに対応する予定はありませんでした。
しかし、ガイドラインをみてみると
Existing apps and app updates must follow them by April 2020.
Apps that use a third-party or social login service (such as Facebook Login, Google Sign-In, Sign in with Twitter, Sign In with LinkedIn, Login with Amazon, or WeChat Login) to set up or authenticate the user’s primary account with the app must also offer Sign in with Apple as an equivalent option.
(実は最初はmustという表現ではなく、exclusivelyという表現でした)
と書かれており、FacebookログインやGoogleサインインなどのサードパーティのログインサービスを提供している場合はSign in with Appleも提供しないといけない。とのこと。
そして、期限が2020年4月まで。(2019年9月時点)
Eightは一般的なアプリとは異なり、新規登録では必ず名刺が必要なものの、新規登録後にFacebookなどのサービスと連携可能であり、連携後はFacebookアカウントでログインできる機能を提供しておりました。
つまり、Facebookなどのアカウントを使って新規登録はできないものの、連携後はログイン可能といった状態です。
果たして僕たちはSign in with Appleを実装すべきなのか、しなくて良いのか...
そこから、調査を開始しました。
ググってみると同じような悩みを抱えている人も出てきました。
数回Appleに問い合わせをしたものの有力な情報は得られませんでした。
悩んだ挙げ句、最終的にリジェクトをされるのを避けるため対応するということが決定しました。
他の選択肢としては既存のFacebookログインをなくすということも考えられましたが、一定数のユーザが使用しておりそちらをなくすことはできないという判断になりました。
Eightにおける実装
さきほどお伝えした通りEightでは新規登録時に必ず自分の名刺が必要な作りなので、IDやパスワードなどのユーザ情報はすでに取得済みです。
なのでクライアントの実装自体はそこまで大変ではありませんでした。
主に使うAPIは3つでAppleから提供されている
- ASAuthorizationAppleIDProvider
- ASAuthorizationController
- ASAuthorizationControllerDelegate
になります。
ASAuthorizationAppleIDProviderを使いリクエストを組み立て、ASAuthorizationControllerに作ったリクエストをセットし、perform。ASAuthorizationControllerDelegateで成功か失敗を受け取る。といった感じです。
こちらに関してはAppleのExampleがあるのでそちら*4を見てみると早いと思います。
認証機構は基本的にサーバが持っているため、ざっくりフローは以下のようになります。
おそらくサーバを持つアプリでほぼこのようなフローになると思います。加えて、App ID ConfigurationのCapabilityにSign in with Appleの追加、プロジェクトのCapabilityにSign in with Appleの追加、Sign in with Apple用のKeyの作成もお忘れなく。
こちらのフローおよび実装で対応し、Sign in with Apple対応バージョンは無事審査も通り、先日リリースもしております。*5
次々伸びる締め切り日...
2019年9月時点では2020年4月が締め切りでしたが、2020年3月4日には4月30日に伸びました。*6
All new apps and app updates submitted to the App Store must follow these guidelines by April 30, 2020.
そして3月26日にはコロナウイルスの影響も考慮してなのか、6月30日まで伸ばすというアナウンスがありました。
*7
the requirements below has been extended to June 30, 2020.
おわりに
おわかりいただける通り、締め切り日がどんどん伸びている状態です。
今後さらに伸びるのか、はたまた実装が必須ではなくなるのか定かではないですが、サードパーティのログインサービスを利用しているアプリのエンジニアはこちらにアテンションを張っておく必要がありそうです。
Sign in with Apple、連携をしておくとログインは楽になるので、Eightを使っている人はぜひ使ってみてください。
最後に、この記事を読んでiOSアプリ開発におけるつらみを少しでも感じていただければ幸いです。笑
buildersbox.corp-sansan.com
buildersbox.corp-sansan.com
buildersbox.corp-sansan.com
*1:執筆時現在
*2:https://developer.apple.com/sign-in-with-apple/
*3:https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js
*4:https://developer.apple.com/documentation/authenticationservices/implementing_user_authentication_with_sign_in_with_apple
*5:対応バージョンは9.25.0