Value of optional type 'AuthCredential?' must be unwrapped to a value of type 'AuthCredential'


<img width="300" src="https://www.gstatic.com/devrel-devsite/va3a0eb1ff00a004a87e2f93101f27917d794beecfd23556fc6d8627bba2ff3cf/firebase/images/lockup.png">

[Firebase | iOSでTwitterを使用して認証する](https://firebase.google.com/docs/auth/ios/twitter-login?hl=ja)をサクッとやってみようと思い久々にXcodeを立ち上げたりpodコマンドを叩いたりしてみると結構苦戦したので３〜４時間格闘した記録です。

## 目的
元々は、UnityアプリでSNS連携を実装したかったんですが、[前回の記事の通りネイティブプラグインを実装する必要がある](https://qiita.com/gremito/items/dfb2080300955c5d5768#auth)ため、各プラットフォーム側の対応がどんなもんなのかを知るためにまずはiOSでSNS連携を実装してみようと思い事が始まりました。

## 事象

今回起きた事象は２点、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'`
<img width="450" alt="スクリーンショット 2019-08-10 19.15.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/ace47dfe-f9a9-fd84-e115-865bf92fda6e.png">

#### 解決方法

準備が足りていないのか何が原因なのか分からずじまいだったので強引に`$ vi Podfile`で解決させましたw

```
# platform :ios, '9.0'
use_frameworks!

target 'unityfirebaseapp' do

  pod 'Firebase/Auth'

end
```
`$pod install`して正常に入ったことを確認
<img width="792" alt="スクリーンショット 2019-08-10 19.20.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/b99ed120-0439-3960-7619-4aa47425b2bc.png">

### `Value of optional type 'AuthCredential?' must be unwrapped to a value of type 'AuthCredential'`

さて、これで`import Firebase`がエラーにならないことを確認して、公式のサンプルコードを`AppDelegate.swift`と`ViewController.swift`に書き込んでいくとSNS連携の処理でタイトルのエラーが出ました。

<img width="1000" alt="スクリーンショット 2019-08-10 19.04.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/37bc6e76-8115-6d94-2b59-a72da523b5f5.png">

`@IBAction`のメソッドでボタンが押されたら処理するようにするとこのように出ます。
Swiftはプライベートで少ししか触っていないこともあり、アンラップしないといけないぐらいにしか分からないレベルでめちゃ苦戦しました汗

#### 解決方法

公式サンプルの[firebase/quickstart-ios](https://github.com/firebase/quickstart-ios)のソースコードを参考にしました。
[authentication/AuthenticationExampleSwift/MainViewController.swiftにTwitter連携しているソースコードがある](https://github.com/firebase/quickstart-ios/blob/master/authentication/AuthenticationExampleSwift/MainViewController.swift#L170)ため、その部分だけを抜き取り、調整して組み込んだところ以下の内容でエラーは無くなりました。

```swift
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と記事](https://stackoverflow.com/questions/51409307/value-of-type-authdataresult-has-no-member-uid)を参考に実装中...w