10712
`Social.framework`を使ってFacebook連携を実装したのですが、おかしな挙動をします。  
Facebookにログインしていない状態で投稿ボタンを押すと、「ログインしていません」というアラートが出てきて「OK」を押すと下記のコードの`println("成功")`が処理されました。  
ログインができてないのにFacebookへの投稿処理が`true`で返ってくるので、おかしな挙動になってしまいます。そもそもなぜFacebookにログインしてないのに`if
SLComposeViewController.isAvailableForServiceType(SLServiceTypeFacebook)`の行で`true`が返って以下が処理されるのでしょうか？試しにTwitterをログアウトして`isAvailableForServiceType(SLServiceTypeTwitter)`に変更して実行してみると、`println("not
login")`の行が実行されました。なぜFacebookのみでログインしていないのにログインしていると判断されるのでしょうか？

```

    @IBAction func post(sender: AnyObject) {
        if SLComposeViewController.isAvailableForServiceType(SLServiceTypeFacebook) {
    
            let composeVC = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
    
            let handler: SLComposeViewControllerCompletionHandler = { result in
    
                if result == SLComposeViewControllerResult.Done {
                    println("成功")
                } else if result == SLComposeViewControllerResult.Cancelled {
                    println("失敗")
                }
            }
    
            composeVC.setInitialText("test")
            composeVC.completionHandler = handler
    
            presentViewController(composeVC, animated: true, completion: nil)
    
        } else {
            println("not login")
        }
    }
    
```
CC BY-SA 3.0
2015-05-28T03:10:27.717
10707
2015-05-28T07:08:47.360
5210
question
ios social-framework
Facebookにログインしていないのにログインしていると判断される
まず、isAvailableForServiceTypeが返す値は、「ログインしているか否か」ではなく、「アカウントが設定されていてサービスが利用可能になっているか否か」です。アカウントが設定されていれば自動的にログインされます。

(Appleのリファレンス)  
<https://developer.apple.com/library/prerelease/ios/documentation/NetworkingInternet/Reference/SLComposeViewController_Class/index.html#//apple_ref/doc/uid/TP40012205-CH1-SW4>

今回の仕様を理解するために、まずは現在インストールしているFacebookアプリを削除し、設定アプリのFacebook設定欄にアカウントを設定した状態で挙動を確認してみることをお勧めします(iOSはFacebookを特別サポートしているので、Facebookアプリがなくても設定アプリでFacebookアカウントを設定できます)。すると、isAvailableForServiceTypeは、リファレンスの説明通り、アカウントを設定していなければNO、アカウントを設定していればYESとなり、そのまま投稿画面を表示して投稿すれば正常に投稿できることが確認できると思います。

そして、Facebookアプリをインストールしている状態での動作ですが、どうもFacebookアプリにはいろいろ不具合が多く、それを入れるとおかしな挙動になることが多いです。私がリリースしているアプリや他の同類アプリでも、Facebookアプリでログアウトした状態でisAvailableForServiceTypeはYESが返ってきて(これ自体は仕様通りだと思います)、そのまま投稿画面を表示すると「ログインしていません」というエラーポップアップが表示され、OKを押すとSLComposeViewControllerResult.Doneが返って来るというおかしな挙動を確認しています。  
そして、これがずっとこの挙動のままかというと、今後のFacebookアプリのアップデートで修正される可能性もあります。つい先日まではテキストのみ埋め込んだ投稿をしても投稿できない(DoneもCancelも返ってこず操作不能になる)という致命的な不具合があり、5/21のFacebookアプリのアップデート(v31)で修正されたところです。

おかしな挙動を確認したら、同類の処理をする他のアプリでも同様の挙動になるか確認してみることをお勧めします。
CC BY-SA 3.0
2015-05-28T07:08:47.360
10712
2015-05-28T07:08:47.360
9367
10707
answer