Skip to content
This repository has been archived by the owner on Apr 1, 2024. It is now read-only.

Latest commit

 

History

History
263 lines (194 loc) · 13.1 KB

README.md

File metadata and controls

263 lines (194 loc) · 13.1 KB

【iOS Objective-C】アプリにFacebookログイン機能をつけよう!

画像1

概要

ニフクラ mobile backendって何??

スマートフォンアプリのバックエンド機能(プッシュ通知・データストア・会員管理・ファイルストア・SNS連携・位置情報検索・スクリプト)が開発不要、しかも基本無料(注1)で使えるクラウドサービス!

注1:詳しくはこちらをご覧ください

画像2

動作環境

  • Mac OS 12.5.1 (Monterey)
  • Xcode Version 14.0
  • iPhone X (iOS 16)

※上記内容で動作確認をしています。 ※古いバージョンだと動作しないい可能性があります。 ※Simulatorでは動作しない可能性があります。実機ビルドが必要な場合はこちらをご覧ください。

手順

1. ニフクラ mobile backendの会員登録とログイン→アプリ作成

  • 上記リンクから会員登録(無料)をします。登録ができたらログインをすると下図のように「アプリの新規作成」画面が出るのでアプリを作成します

画像3

  • アプリ作成されると下図のような画面になります
  • この2種類のAPIキー(アプリケーションキーとクライアントキー)はXcodeで作成するiOSアプリにニフクラ mobile backendを紐付けるために使用します

画像4

  • 動作確認後に会員情報(アクセストークン)が保存される場所も確認しておきましょう

画像5

2. GitHubからサンプルプロジェクトのダウンロード

  • この画面(GitHub)の画像10ボタンをクリックし、さらに画像11ボタンをクリックしてサンプルプロジェクトをMacにダウンロードします

3. Xcodeでアプリを起動

  • Using below command to install NCMB SDK and Facebook SDK.
pod install
  • ダウンロードしたフォルダを開き、画像09をダブルクリックしてXcode開きます 画像08

画像6

4. APIキーの設定

  • AppDelegate.mを編集します
  • 先程ニフクラ mobile backendのダッシュボード上で確認したAPIキーを貼り付けます

画像07

  • それぞれYOUR_APPLICATION_KEYYOUR_CLIENT_KEYの部分を書き換えます
  • このとき、ダブルクォーテーション(")を消さないように注意してください!
  • 書き換え終わったらcommand + sキーで保存をします

5. FacebookSDKを使用するための準備と設定

  • facebook for developersにログイン(Facebookアカウントがない場合はアカウントを作成して)して、右上の「マイアプリ」からの「新しいアプリを追加」を選択します

画像12

  • アプリの利用目的は「その他」を選択します
  • アプリ表示名(任意)と連絡先メールアドレスを入力して「アプリIDを作成」をクリックします
  • 製品を追加するページに移るので「Facebookログイン」の設定ボタンをクリックする
  • プラットフォームは「iOS」を選択します
  • 下のクイックスタートに進みますので順に設定していきます
  • 開発環境は「SDK:Cocoapods」を選択します
  • 今回はこの設定は既に終えているので「次へ」で進みます
  • バンドルIDはxcodeにあるものと同じものを使用します

画像24

  • アプリのシングルサインオンは今回は有効にする必要はありません
  • 「info.plistを構成する」の内容は今回はすでに含まれているので以下の設定のみ行います
  • 「アプリ名」と「アプリID」をXcodeプロジェクトのInfo.plistにコピペします

画像16

  • 「アプリデリゲートに接続する」以降も今回は必要ないので「次へ」で飛ばして完了です

6. 動作確認

  • Xcode画面で左上の実行ボタン(さんかくの再生マーク)をクリックします

  • シミュレーターが起動したら、Login画面が表示されます

  • Login ボタンをクリックします

画像19

  • Facebookログインのブラウザが画面が表示されるのでしたがってログインを行います
  • ログインに失敗した場合は画面にエラー内容が表示されます(Facebookログインのブラウザ画面でキャンセルした場合は表示されません)
  • 万が一エラーが発生した場合は、こちらよりエラー内容を確認いただけます
  • ログインに成功したらログアウトします

画像21 画像20


  • 保存に成功したら、ニフクラ mobile backendのダッシュボードから「会員管理」を確認してみましょう!
  • authDataにはアクセストークンが保存されます

画像1

操作はここまでです

解説

サンプルプロジェクトに実装済みの内容のご紹介

SDKのインポートと初期設定

ロジック

  • FacebookSDKを使用するための処理をAppdelegate.mに記述しています
#import "AppDelegate.h"
#import "NCMB/NCMB.h"
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    //********** APIキーの設定とSDKの初期化 **********
    [NCMB setApplicationKey:@"YOUR_APPLICATION_KEY" clientKey:@"YOUR_CLIENT_KEY"];

    return [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    [FBSDKAppEvents activateApp];

}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation];

}

@end
  • Main.storyboardでデザインを作成し、LoginViewController.mLogoutViewController.mにロジックを書いています
  • Facebook連携はブラウザのFacebookページに遷移し、行われます。Facebookログインボタン押下時の処理は以下のように記述されます
//
//  LoginViewController.m
//  ObjcFacebookLoginApp
//
// Loginボタン押下時の処理
- (IBAction)FacebookLoginBtn:(UIButton *)sender {
    // labelを空にする
    self.label.text = @"";
    if ([FBSDKAccessToken currentAccessToken]) {
        [self performSegueWithIdentifier:@"login" sender:self];
    } else {
        FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
        [loginManager logInWithPermissions:@[@"public_profile", @"email"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult * _Nullable result, NSError * _Nullable error) {
           //TODO: process error or result
           if(error){
               // その他のエラーが発生した場合
               NSLog(@"エラーが発生しました:%ld", error.code);
               self.label.text = [NSString stringWithFormat:@"エラーが発生しました:%ld", error.code];
           } else {
               if(result.token.userID != nil){
                   // mobile backend会員登録するための認証情報を作成
                   NSDictionary *facebookInfo = @{@"id":result.token.userID,
                                                  @"access_token":result.token.tokenString,
                                                  @"expiration_date":result.token.expirationDate};

                   //会員のインスタンスを作成
                   NCMBUser *user = [NCMBUser user];

                   //Facebookの認証情報を利用して会員登録を行う
                   [user signUpWithFacebookToken:facebookInfo withBlock:^(NSError *error) {
                       if (error){
                           //会員登録に失敗した場合の処理
                           NSLog(@"Facebookの会員登録とログインに成功しました:%@", user.objectId);
                       } else {
                           //会員登録に成功した場合の処理
                           NSLog(@"Facebookの会員登録とログインに成功しました:%@", user.objectId);
                           [self performSegueWithIdentifier:@"login" sender:self];
                       }
                   }];
               } else {
                   if (result.isCancelled) {
                       // Facebookのログインがキャンセルされた場合
                       NSLog(@"Facebookのログインがキャンセルされました");
                       self.label.text = @"Facebookのログインがキャンセルされました";
                   } else {
                       // その他のエラーが発生した場合
                       NSLog(@"エラーが発生しました:%ld", error.code);
                       self.label.text = [NSString stringWithFormat:@"エラーが発生しました:%ld", error.code];
                   }

               }

           }

       }];
    }   
}
//
//  LogoutViewController.m
//  ObjcFacebookLoginApp
//

// Logoutボタン押下時の処理
- (IBAction)logoutBtn:(UIButton *)sender {
    NSLog(@"ログアウトしました");
    FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
    // 非同期でログアウト
    [NCMBUser logOutInBackgroundWithBlock:^(NSError *error) {
        if (error){
            //エラー処理
            NSLog(@"Logout error %@", error);
        } else {
            // Facebookの認証情報を削除
            [loginManager logOut];
            [self dismissViewControllerAnimated:YES completion:nil];
        }
    }];
    
}

参考

FacebookSDKを使ってFacebook会員認証するのとニフクラ mobile backendSDKを使ってFacebook会員認証するのは何が違うのか?

画像22

  • もちろん直接FacebookSDKを呼ぶことも可能ですが、ニフクラ mobile backendSDKを呼べば裏でFacebookSDKを呼んで処理するNCMBUserメソッドが備わっているので、1つ呼べば、Facebookへのログインとニフクラ mobile backendへ会員情報保存が同時に行えるので一石二鳥というわけです
  • また一度会員登録してしまえば、あとはニフクラ mobile backendの会員管理機能で処理が行えるので自前で会員管理システムを構築する必要がなくより楽に開発を行えます

もっと深く知りたい方へ