ニフクラmBaaSお役立ちブログ

スマホアプリ開発にニフクラmBaaS。アプリ開発に役立つ情報をおとどけ!

SNS連携機能にGoogle認証が追加されました!

SNS連携機能ではこれまでTwitterおよびFacebookを提供してきましたが、この度Google認証が追加されることになりました!Googleには多くのサービス(Gmail、Googleカレンダー、Google Photosなど)があり、どれも皆さんがよく使っているものだと思います。そうしたサービスを扱う上でもGoogle認証機能が便利ではないでしょうか。

そこで今回はGoogle認証機能の使い方を紹介します。

管理画面の変更について

ニフティクラウド mobile backendの管理画面において変更が行われています。SNS連携を使う場合は、アプリ設定のSNS連携機能においてGoogle連携を有効にしてください。

CocosPodsに登録する

現在、Google認証機能はCocosPods版のみ提供しています。Frameworkファイル形式では提供していませんのでご注意ください。CocoaPodsファイルに以下のように追記して pod update を実行します。 YOUR_APP_TARGET はそれぞれ読み替えてください。

platform :ios,'7.0'

target "YOUR_APP_TARGET" do
    pod 'Google/SignIn' # 追加
    pod 'NCMB', :git => 'https://github.com/NIFTYCloud-mbaas/ncmb_ios.git'
end

Googleでのアプリ登録

次にGoogleでアプリ登録を行います。これはOAuth認証を行うために必要な処理になります。Start integrating Google Sign-In into your iOS app   |   Google Sign-In for iOS   |   Google Developersへ行き、手順を順番に行っていきます。

まず、GET A CONFIGURATION FILEのボタンをクリックします。Googleのアカウント認証が出ると思いますのでパスワードを入力してください。

次にステップに従って進めていきます。Pick platformをクリックします。

今回はiOS Appを選択します。

App name、iOS Bundle IDを入力します。この時、エラーが出ることがあります。そうした時には予めGoogle Developer Consoleでアプリケーションを作成しておくと良いようです。

次にGoogleのサービス選択が出ますので、Google Sign-Inをクリックします。

ENABLE Google SIGN-INを押して有効にします。

そしてGenerate configuration filesをクリックします。

最後にGoogleService-Info.plistというファイルがダウンロードされます。

GoogleService-Info.plistの内容は以下のようになっています。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CLIENT_ID</key>
    <string>9999999999-xxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com</string>
    <key>REVERSED_CLIENT_ID</key>
    <string>com.googleusercontent.apps.9999999999999-xxxxxxxxxxxxxxxxxxxxxx</string>
</dict>
</plist>

CLIENT_IDはニフティクラウド mobile backendの管理画面で、SNS連携 > Google連携のGoogle Client IDに保存してください。

Xcodeプロジェクトでの処理

まずXcodeプロジェクトに先ほどダウンロードした GoogleService-Info.plist をドラッグ&ドロップして追加します。

それが終わったらプロジェクトのinfoを開き、一番下のURL Typesに2つ追加します。一つ目はURL Schemesの値として、GoogleService-Info.plistのREVERSED_CLIENT_IDの値を入力してください。

値はGoogleService-Info.plistを開くと分かります。

もう一つはURL Schemesの値としてBundle Identifierの値を入力してください。

これで準備は完了です。

実際に使ってみる(準備)

では実際にGoogle認証を行ってみます。AppDeligate.m を開いて、まずインポートを追加します。

#import "AppDelegate.h"
#import <Google/SignIn.h> // 追加
#import "NCMB/NCMB.h"

次にdidFinishLaunchingWithOptionsにおいて以下のように処理を追加します。

[NCMB setApplicationKey:@"APPLICATION_KEY"
              clientKey:@"CLIENT_KEY"];
NSError* configureError;
[[GGLContext sharedInstance] configureWithError: &configureError];
if (configureError != nil) {
    NSLog(@"設定エラー: %@", configureError);
}

設定エラーには基本的に流れないはずですが、エラーが出た場合はここに来るまでの設定、記述内容を確認してください。

そしてopenURLメソッドを追加します。

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

認証を実行する

実際に認証する場合には logInWithGoogleAccountWithBlock を使ってください。

[NCMBGoogleUtils logInWithGoogleAccountWithBlock:^(NCMBUser *user, NSError *error) {
  if(error == nil){
    NSLog(@"Googleで登録成功");
  }else{
    NSLog(@"Googleで登録失敗:%@",error);
  }
}];

既に他の方法(メールアドレス認証やFacebook、Twitter認証)でユーザ登録済みの場合、以下の方法でGoogle認証情報をリンクさせることができます。

[NCMBGoogleUtils linkUser:user googleAccountWithblock:^(NCMBUser *user, NSError *error){
  if (error){
    NSLog(@"Googleアカウントのリンク完了");
  } else {
    NSLog(@"Googleアカウントのリンク失敗:%@",error);
  }
}];

これでGoogleアカウントを用いた認証ができるようになります!

補足1:WebViewを使う

デフォルトではSafariが立ち上がってコールバックで戻ってくる仕様になっています。WebViewを使ってアプリ内で認証を行いたい場合は、まずAppDeligate.hを開いて、

#import <Google/SignIn.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate, GIDSignInDelegate>

を追加します。次に application:didFinishLaunchingWithOptions において以下のように実行します。

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  NSError* configureError;
  [[GGLContext sharedInstance] configureWithError: &configureError];
  if (configureError != nil) {
    NSLog(@"Error configuring the Google context: %@", configureError);
  }

  [GIDSignIn sharedInstance].delegate = self;

  return YES;
}

そして任意のコントローラのviewDidAppearにおいて、以下のように記述します。

- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    
    [GIDSignIn sharedInstance].uiDelegate = self;

    //WebViewでの認証を有効にする
    [GIDSignIn sharedInstance].allowsSignInWithWebView = YES;
}

最後に認証後に呼び出されるデリゲートメソッドにおいて、NCMBUser の signUpWithGoogleToken を実行します。例えば以下のようになります。

- (void)signIn:(GIDSignIn *)signIn
    didSignInForUser:(GIDGoogleUser *)user
     withError:(NSError *)error
{
    //mBaaSへの会員登録を行うためにNCMBUserクラスのインスタンスを作成
    NCMBUser *mbUser = [NCMBUser user];

    //認証済みのGIDGoogleUserからuserIDとaccessTokenを取得してmBaaSへの会員登録を行う
    [mbUser signUpWithGoogleToken:@{@"id":user.userID,
                                    @"access_token":[user.authentication accessToken]}
                            block:^(NSError *error) {
                                if(error == nil){
                                    NSLog(@"Googleで登録成功");
                                }else{
                                    NSLog(@"Googleで登録失敗:%@",error);
                                }
                            }];
}

この他、詳しくは SDKガイド (iOS) : SNS連携 | ニフティクラウド mobile backend を参照してください。ぜひGoogle認証を使って利用者が感じているユーザ登録の手間を軽減してください。

サーバー開発不要!アプリ開発をよりスマートに、スピーディに。 | ニフティクラウド mobile backend