71
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

iOS9でFacebook Single Sign On

今更ながらiOSアプリでのFacebookログインを実装しようとしてみたら、
iOS9でセキュリティが強化された関係で公式チュートリアルのままでは動かなかったので対処法をメモ。

ついでに、SwiftでCocoaPodsを使ってSDKを導入する方法もメモ。

追記

公式ドキュメントに全部書いてあったッ!!!

追記(2015/10/02) NativeのFacebookアプリが立ち上がることはなくなった?

FBSDK 4.6から仕様が変わったようです。

iOS9以降、別アプリを立ち上げようとすると「〜を開こうとしています」というダイアログが表示されることを嫌って、Nativeの認証をやめ、SafariViewを使って認証するようにした、と回答されています(そして回答以降のコメントはこの変更についての不評の嵐・・・

TL;DR

iOS9 からは Info.plistにLSApplicationQueriesSchemesの設定も追加しないと、
常にSafariでのFacebookログインになっちゃうよ

pod 'FBSDKLoginKit', '4.4.0'

Podfileを書いてpod install

※バージョンは CocoaPods.orgとかで確認して適宜最新版に

platform :ios, '8.0'
use_frameworks!

target 'FacebookLoginSample' do
  pod 'FBSDKLoginKit', '4.4.0'
end

このときuse_frameworks!を書き忘れないように注意

  • FBSDKLoginKit
  • FBSDKCoreKit
  • Bolts

が依存で入ってくる

Podsの準備ができたので、〜.xcodeproj で開いていたプロジェクトは閉じて、〜.xcworkspace の方をXcodeで開き直す

Bridging-Header.hを作成・・・は、しない

Facebook SDKはObjCなので、Swiftから呼び出すにはBridging Headerが必要

と、ドキュメントには書いてあるけど、use_frameworks!をつけてpod installしていると実は不要。というか、それだとむしろビルドできない

そのまま

import FBSDKLoginKit

でインポートできる

Info.plist に設定追加

公式チュートリアル通り、TARGET設定のInfoのタブを開いて

Custom iOS Target Propertiesに

  • FacebookAppID
  • FacebookDisplayName

を追加

別欄のURL Typesに

  • URL Scheme: fb*******

を追加。他はそのまま空欄でOK

Facebookのチュートリアルだと、Custom iOS Target Propertiesに自分でURL Typesのレコードを追加するようなスクリーンショットになってるので注意

'InvalidOperationException', reason: 'fb********** is not registered as a URL scheme. Please add it in your Info.plist'

とか表示されたらこのあたりの設定ミスを疑う

自分の場合は、URL TypesをCustom iOS Target Propertiesに書いていてしばらく悩んだ

で、それを解決して動いたとおもったら、Safariが開いてFacebookログインを求められる

LSApplicationQueriesSchemesでfbauthを許可

本題のiOS9での注意点。

Info.plistに

LSApplicationQueriesSchemes (Array)
  item0 : (String) fbauth

を設定してやらないと、fbauthのカスタムスキーマを開くことができず、
FacebookアプリではなくSafariでの認証になってしまう

-canOpenURL: failed for URL: "fbauth://authorize/?client_id=(略)" - error: "This app is not allowed to query for scheme fbauth"

とかがログに出てたらこれが原因のはず

参考
parse.com - swift 2 parse facebookSDK ios9 - Stack Overflow

これで無事Facebookアプリでのログインができるようになりました

追記

公式ドキュメントに、その他設定すべきスキーマ一覧があるので全部登録しましょう

http通信を許可する

ここまででFacebookログインは動くようになるけど、コンソールに

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

が出まくる

これもiOS9でのセキュリティ強化起因で、デフォルトだとhttp通信が禁止されていて、FacebookSDKがなにかしらhttpで通信しようとしているのが失敗している

理想的には、Appleの意向に沿って極力httpsを使いつつ、どうしてもhttpを使わないといけないところだけ許可設定するべきかもしれないけど、
とりあえず

NSAppTransportSecurity (Dictionary)
  NSAllowsArbitraryLoads (Boolean): YES

の設定をInfo.plistに入れて、http通信を全許可にしてやれば解決

将来的には、Facebook側がhttpじゃなくhttps使うようにしてくれると嬉しい

追記

公式ドキュメントにホワイトリストが載っているので、全許可じゃなくてこの通りに最小限の許可にしましょう

追記:bitcode OFF

bitcodeのことを忘れていたけど、

公式ドキュメント曰く、

Is bitcode supported?

v4.6 and v3.24 of the SDK supports bitcode. If you are using earlier versions, you must disable bitcode.

v4.6以降はbitcode対応しているので、今ならbitcodeは有効にしたままでもOKの模様

わかってないこと

Facebookのデベロッパーコンソールで、自分のAppを開いて、Settingのセクションに行くと

iOS
-----------------------------------
Single Sign On
will lanuch from iOS notofications
-----------------------------------

って項目があるんだけど、これはなにを制御してるんでしょうか

デフォルトでNOになっていて、別にNOのままでもFacebookアプリでのログインはできてるんだけど・・・

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
71
Help us understand the problem. What are the problem?