Firebase | iOSでTwitterを使用して認証するをサクッとやってみようと思い久々にXcodeを立ち上げたりpodコマンドを叩いたりしてみると結構苦戦したので3〜4時間格闘した記録です。
目的
元々は、UnityアプリでSNS連携を実装したかったんですが、前回の記事の通りネイティブプラグインを実装する必要があるため、各プラットフォーム側の対応がどんなもんなのかを知るためにまずはiOSでSNS連携を実装してみようと思い事が始まりました。
事象
今回起きた事象は2点、1つは公式で書かれている$ pod 'Firebase/Auth'
がUnknown command
になってしまう。
もう1つがタイトルにもある通りValue of optional type 'AuthCredential?' must be unwrapped to a value of type 'AuthCredential'
になります。
[!] Unknown command: 'Firebase/Auth'
解決方法
準備が足りていないのか何が原因なのか分からずじまいだったので強引に$ vi Podfile
で解決させましたw
# platform :ios, '9.0'
use_frameworks!
target 'unityfirebaseapp' do
pod 'Firebase/Auth'
end
Value of optional type 'AuthCredential?' must be unwrapped to a value of type 'AuthCredential'
さて、これでimport Firebase
がエラーにならないことを確認して、公式のサンプルコードをAppDelegate.swift
とViewController.swift
に書き込んでいくとSNS連携の処理でタイトルのエラーが出ました。
@IBAction
のメソッドでボタンが押されたら処理するようにするとこのように出ます。
Swiftはプライベートで少ししか触っていないこともあり、アンラップしないといけないぐらいにしか分からないレベルでめちゃ苦戦しました汗
解決方法
公式サンプルのfirebase/quickstart-iosのソースコードを参考にしました。
authentication/AuthenticationExampleSwift/MainViewController.swiftにTwitter連携しているソースコードがあるため、その部分だけを抜き取り、調整して組み込んだところ以下の内容でエラーは無くなりました。
import UIKit
import Firebase
import FirebaseAuth
class ViewController: UIViewController {
var twitterProvider : OAuthProvider?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.twitterProvider = OAuthProvider(providerID:"twitter.com");
}
@IBAction func login(_ sender: Any) {
self.twitterProvider?.getCredentialWith(_: nil){ (credential, error) in
if error != nil {
// Handle error.
}
if let credential = credential {
Auth.auth().signIn(with: credential) { (authResult, error) in
if error != nil {
// Handle error.
}
// 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
}
}
}
}
}
たぶんprovider?
が必要だったんですかね?笑
accessToken
とsecret
の取得
本来の目的であるaccessToken
とsecret
の取得を上記のソースコードで実装する際、同じくアンラップ関連のエラーが表示されます。
Value of optional type 'AuthDataResult?' must be unwrapped to refer to member 'credential' of wrapped base type 'AuthDataResult'
Stack Overflowと記事を参考に実装中...w