watari開発 – Advent201913 –

watari開発 – Advent201913 –

stage13: twitterとの連携(その2ログイン)

まずはログイン機能を作る。これをやるとtweetする際のtwitterユーザーとアプリのユーザーの紐付けをすることができる。

多分、やったことないけどアプリ全体のアカウントを作ってその全体ユーザーとして投稿する。という仕様にもできる気がするけど、コンテンツ自体はアプリの持ち物ではなくユーザーの持ち物なのでダメだろう。

ということで

firebaseのiOSアプリをセットアップ

iOSアプリを作るので選ぶ。

iOSのbundle idを入れて次へ。

ちなみにbundle idはここにある

GoogleServiceを使うためのplistを入れる必要があるらしいので

ダウンロードして、

全てのターゲットを選んでコピー。

次はSDKを入れる。

gem install cocoapods

cocoapodsを入れて、

pod init

初期化してPodfileを生成.

Podfileに

  pod 'Firebase/Analytics'

を追記して、 pod install

初期化コードを入れろ。ということなのでまるっとコピーして AppDelegate.swift に追記。

さて、ここでbuildしようとしても上手くいかない。importしたfireabesがcannot buildとか言われるのだ。

podをinstallした後は
open watari.xcworkspace
こっちのファイルを開いて作業をすることになる。

(詳しくは こちら を読むといいんじゃないかなと)

最終的にはこんな感じの見た目になればまとめてbuildして依存関係も解決してくれた状態になっているんじゃないかと。

で、試しにbuildしてrunするとfirebaseの最後のstepが

これから

こんな感じに変わるんじゃないかなと。

よし、SETUP完了!

firebase Authを使えるようにする

https://firebase.google.com/docs/auth/ios/twitter-login

ここにiOSによるfirebaseを使ったtwitter loginの実装方法が載っているのでそのまま試してみよう。

pod 'Firebase/Auth'

Podfileに追記して

pod install

実はそれ以外の手順は前回設定済み。

サインインの流れをSDKで取り扱う

https://firebase.google.com/docs/auth/ios/twitter-login#handle_the_sign-in_flow_with_the_firebase_sdk

っていうのがその後載っているので進めてみる。

URL typesを追加する。 + を押下すると4つほど入力欄っぽいのが出てくるので URL Schemes に値を入れる。

入力するのは、 GoogleService-Info.plist という先に追加したファイルの REVERSED_CLIENT_ID に設定されている値をコピーして入れる。

さて、設定周りは終了したので後は実装あるのみ。

ContentView.swiftにて

import Firebase

...

var provider = OAuthProvider(providerID: "twitter.com")

OAuthProvider を作成し

                Button("twitter signin", action: {
                    self.provider.getCredentialWith(nil) { credential, error in
                       if error != nil {
                         // Handle error.
                       }
                       if credential != nil {
                        Auth.auth().signIn(with: credential!) { result, error in
                            if error != nil {
                            // Handle error.
                            }
                            print("sign in succeeded.")
                            if let credential = result?.credential as? OAuthCredential,
                                let accessToken = credential.accessToken,
                                let secret = credential.secret {
                                print("accessToken :" + accessToken)
                                print("secret :" + secret)
                            }
                           // User is signed in.
                           // IdP data available in authResult.additionalUserInfo.profile.
                           // Twitter OAuth access token can also be retrieved by:
                           // authResult.credential.accessToken
                           // Twitter OAuth ID token can be retrieved by calling:
                           // authResult.credential.idToken
                           // Twitter OAuth secret can be retrieved by calling:
                           // authResult.credential.secret
                         }
                       }
                     }
                })

それをbuttonで使うようにしてみた。

ERROR: 上手くログイン画面までは遷移したものの、最終的に abount: blank のページに行ってしまう。

なんか新しく入った SceneDelegate.swift が悪さをしているらしい記述がちらほら。

これやってみるか。

https://github.com/firebase/firebase-ios-sdk/issues/3706#issuecomment-554843422

直った!

結果

できた!(動画は一度ログインしているのでアプリの認証するところから始まりますが)

ログイン後のaccess tokenとかも

無事に取れている模様。

次回は

取得できたtokenを使ってtwitterに投稿してみよう。