前回はID、パスワードによる認証機能を実装しましたが、今回はFacebookログイン機能を実装します。Facebookなどのソーシャルログインの場合、会員登録とログインが同時にできるのがメリットです。
事前に用意するもの
Facebook for DevelopersにてFacebookアプリを作成しておきます。
フレームワークのインストール
FacebookのフレームワークはCocoaPodsでインストールするのが手軽です。以下の4つをPodfileに追加します。記述したら pod install
を実行します。
pod 'Bolts' pod 'FacebookCore' pod 'FacebookLogin' pod 'FacebookShare'
そして *-Bridge-Header.h ファイルにてフレームワークを読み込みます。
#import <FBSDKCoreKit/FBSDKCoreKit.h> #import <FBSDKLoginKit/FBSDKLoginKit.h>
AppDelegate の修正
まずフレームワークを読み込みます。
import FacebookLogin
次に didFinishLaunchingWithOptions
を修正します。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. NCMB.setApplicationKey(keys.applicationKey , clientKey: keys.clientKey) // 以下を追加 FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) return true }
さらに以下のコードを追加します。
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application(application, open: url as! URL, sourceApplication: sourceApplication, annotation: annotation) }
最後に applicationDidBecomeActive
を追加します。
func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. FBSDKAppEvents.activateApp() }
Info.plistの修正
Info.plist をSource Codeとして開いて、下記を <dict>
タグの中に追加します。 {facebook_app_id}
と {facebook_app_name}
は作成したFacebookアプリのものと置き換えてください。
<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>{facebook_app_name}</string> <key>LSApplicationQueriesSchemes</key> <array> <string>fbapi</string> <string>fb-messenger-share-api</string> <string>fbauth2</string> <string>fbshareextension</string> </array>
ログイン処理を作る
ログイン処理を行うコントローラでは以下のフレームワークを読み込みます。
import FacebookCore import FacebookLogin
画面上には適当なログインボタンを作ります。そのボタンをタップした時の処理です。 LoginManager().logIn
がログイン処理になります。
@IBAction func fbLoginButton(_ sender: Any) { LoginManager().logIn(readPermissions: [.email], viewController: self, completion: { result in // 処理を書く }) }
結果は .success と .failed 、 .cancelled に分かれます。
switch result { case let .success( _, _, token): // ログイン成功 case let .failed(error): // ログインエラー print("error:\(error)") case .cancelled: // ログインキャンセル print("cancelled") }
今回はログイン成功時の処理だけ紹介します。 token の中にmBaaSでログイン処理を行うのに必要な情報がすべて入っています。ユーザID、アクセストークン、有効期限をそれぞれ指定します。
let facebookInfo = [ "id": token.userId, "access_token": token.authenticationToken, "expiration_date": token.expirationDate ] as [String : Any]
そしてユーザオブジェクトを作成し、 signUp
を withFacebookToken
パラメータとともに呼び出します。
let user = NCMBUser.init() user.signUp(withFacebookToken: facebookInfo, with: {(error) in if error != nil { print("Login failed") } else { print("Login successful") self.viewWillAppear(true) } })
これでFacebookログイン処理が完成です。
まとめ
Facebook SDKを使うので、コーディング量はごくわずかで実装が完了します。ぜひ皆さんのアプリにもFacebookログインを付けてみてください。
今回のコードはgoofmint/NCMB-Swift-iOS-Todo at v4にアップロードしてあります。実装時の参考にしてください。