超お父さんの日記

日記とか雑談とか、スノーボードとか、サーフィンとか、たまに技術系とか。

【Amplify iOS】Cognito IDプールの未認証ユーザーのIDを取得する

サーバーレスで簡易的なユーザー登録機能を作りたい。
そういうこと、たまにあると思います。

自分も何年か前にAWS Mobile Hubを使ってiOSアプリを作ったことがあるので、またAWS Mobile Hubかなと思って調べてみると、 ここ数年の間に何やらAmplifyなるものができてるじゃない。

Amplify iOSチュートリアルとかを見つつ、なんとかそれぞれのカテゴリは動く状態を試すことができた。 *1 docs.amplify.aws

ということで、Amplify iOSを使って以下のようなことを実現したい。

  • ユーザー登録せずに使えるアプリ

  • だけどユーザーはニックネームなどを登録できる

つまりアプリ初回起動で個別の変化しないIDを発行して、そのIDでユーザー情報を管理したい。

結論からいうと、すんごくハマったけどできた。
*2 なぜハマったかと言うと、タイトルにある通り、未認証ユーザーのIDの取得方法がわからなかったから。

Amplifyの認証はCognitoのユーザープールなのだけど、一番シンプルなのでもユーザー名やEメールでのユーザー登録が必要だ。
けど、いつかそういったちゃんとしたユーザー登録機能を追加したいってなるかもしれないので、 CognitoのIDプールの未認証ユーザーのIDを使おうと思ったのだけど、 このIDはAmplify iOSだと一体どうやって取得出来るのかっていう。

奇跡的に1つ情報を見つけた。
https://itnext.io/unauthenticated-access-to-aws-for-ios-apps-using-aws-amplify-cb87222eb5d

要は、Amplify Analyticsを未認証ユーザーでもトラッキング出来るような設定にしておいて、 AppDelegateのdidFinishLaunchingのreturnに1行処理を書くだけ。

import AWSMobileClient  

AWSSignInManager.sharedInstance().interceptApplication(application, didFinishLaunchingWithOptions: launchOptions)

AWSSignInManager Class Reference

そうすると、IDプールのIDは

import AWSAuthCore  

AWSIdentityManager.default().identityId

で取得出来た。 Amplifyの存在を知ってから、ここに辿り着くまで何日かかったことやら。。。

追記)
Authentication - Accessing credentials - Amplify DocsにもIDプールのIDの取得方法が書いてありました。
10行目の

let identityId = try identityProvider.getIdentityId().get()

でIDプールのIDの値が取れました。

*1:チュートリアルにあるAmplify toolsというのがエラー吐いて動かせなかったので、そこでちょっとハマった。 自分はxcodeのrun scriptには設定せず、何かAmplifyに変更を加えたらtoolsのシェルを直接実行してます。。 githubでも同じ問題になってる人がいて助かりました。 New iOS project build failure · Issue #345 · aws-amplify/amplify-ios · GitHub

*2:機種変などで端末変わったユーザーはサポートしません。その場合は新規ユーザーになります。