SwiftでFacebookログイン

SwiftFacebookログインを実装する方法をまとめました。

環境: MacOSX Yosemite 10.10.5, iOS SDK 9.0, Facebook SDK v4.7.0
参考サイト: http://blog.hello-world.jp.net/ios/3745/

1. Facebook SDKをDLする

FacebookSDKをダウンロードして、~/Documents/FacebookSDK に移動する。

2. Facebook App を作る

Facebook開発者 - 開発者向けFacebookにアクセスして、MyApps > Add a New App を選択して、Facebook Appを作る。

3. Facebook App の設定を変更する

  1. Facebook Appのダッシュボードにて左欄から「Settings」を選択する
  2. Settings画面の「Add Platform」をクリックし、iOSを選択する
  3. Bundle IDフィールドに、XcodeプロジェクトのBundle Identifierを入力する
  4. Single Sign On を YESに変更する
  5. Save Changes を押す

ここまでは、はまる箇所もなくスムーズに進められるはずです。

4. XcodeプロジェクトにFacebookSDKを追加する

XcodeのProject Navigator(command + 1)に、~/Documents/FacebookSDK内の 「FBSDKCoreKit.framework」「FBSDKLoginKit.framework」「FBSDKShareKit.framework」を追加する。 そして、Build Settings > Search Path に 「~/Documents/FacebookSDK」を設定する。(下図) f:id:umadash:20151011100123p:plain

5. Info.plistに追記する

Project Navigator(command + 1)の、Info.plistを右クリックしてOpen As > Source Codeを選択する。
そして、下のコードを追記する。 * {FACEBOOK_APP_ID},{Your App Name}には、上で作成したFacebook AppのIDと名前を入力する。

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>fb{FACEBOOK_APP_ID}</string>
    </array>
  </dict>
</array>
<key>FacebookAppID</key>
<string>{FACEBOOK_APP_ID}</string>
<key>FacebookDisplayName</key>
<string>{Your App Name}</string>
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>facebook.com</key>
    <dict>
      <key>NSIncludesSubdomains</key> <true/>        
      <key>NSExceptionRequiresForwardSecrecy</key> <false/>
    </dict>
    <key>fbcdn.net</key>
    <dict>
      <key>NSIncludesSubdomains</key> <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>  <false/>
    </dict>
    <key>akamaihd.net</key>
    <dict>
      <key>NSIncludesSubdomains</key> <true/>
      <key>NSExceptionRequiresForwardSecrecy</key> <false/>
    </dict>
  </dict>
</dict>
<key>LSApplicationQueriesSchemes</key>
<array>
        <string>fbapi</string>
        <string>fb-messenger-api</string>
        <string>fbauth2</string>
        <string>fbshareextension</string>
</array>

6.AppDelegate

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
    }
    
    func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
        return FBSDKApplicationDelegate.sharedInstance().application(
            application,
            openURL: url,
            sourceApplication: sourceApplication,
            annotation: annotation)
    }

    func applicationDidBecomeActive(application: UIApplication) {
        FBSDKAppEvents.activateApp()
    }

7.ViewController

import UIKit
import FBSDKLoginKit

class ViewController: UIViewController, FBSDKLoginButtonDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let btn = FBSDKLoginButton()
        btn.center = self.view.center
        btn.delegate = self
        btn.readPermissions = ["public_profile", "email", "user_friends"]
        self.view.addSubview(btn)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
        // ここいらはお好きなように

        if ((error) != nil)
        {
            // Process error
        }
        else if result.isCancelled {
            // Handle cancellations
        }
        else {
            // If you ask for multiple permissions at once, you
            // should check if specific permissions missing
            if result.grantedPermissions.contains("email")
            {
                // Do work
            }
        }
    }
    
    func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) {
        
    }
}

気になるエラーが・・・

ログインボタンを押すと、以下のような警告がコンソールに吐き出された。 検索しても解消する方法は見つからなかったため現状放置している。

-canOpenURL: failed for URL: "fbauth2:/" - error: "(null)"