Google+ プラットフォームを利用してiOSのユーザーログインを簡潔にする

2015.04.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも。大村です。 弊社の中では、あまり利用者の少ないGoogleプラットフォームですが、Gmail APIが昨年の夏に登場し、そういったサービスを手軽に利用する為にGoogle+のプラットフォームを積極的に使ったアプリを作っても面白いんではないかと思ってる今日このごろです。 というわけで、その第一歩として、Googleプラットフォームを色々使える「iOS 用 Google+ プラットフォーム SDK」を使ったログイン実装を試してみようと思います。

まずはダウンロードから

まずは「Google+ iOS SDK」をダウンロードします。 こちらのページから該当するファイルをダウンロードして下さい。私の場合のダウンロード時はバージョン1.7.1でした。 その後、ダウンロードしたZIPファイルを解凍します。 一応サンプルのファイルがあるのでこれでもいいのですが、とりあえずお勉強のため自分で実装してみます。 このGoogleから提供されているSDKは、今のところObjective-Cのため、今回作成するアプリも素直にObjective-Cにしています。 多分swiftでもできるはずですが、今回は簡単にこなすためにObj-cを選んでいます。

なお、このGoogle+ iOS SDKの使用できるバージョンは以下になります

iOS iOS 6.0 以上
Xcode 4.5 以上

Googleアプリとして登録する

Google Developers Consoleでログインするためのアプリケーションを登録します。 アプリケーションを登録したら、Googleアカウントでのログイン時に同意画面が表示されるので、その同意画面を作ります。 とりあえず適当にアプリ名だけ決める形でも同意画面は作れます。

gppios1

同意画面を作った後は、新しいクライアントIDを作成します。 クライアントIDは「インストールされているアプリケーション」、インストールされているアプリケーションの種類に「iOS」を選んで、バンドルIDで「jp.classmethod.hogehoge」みたいなiOSのXcodeのBundle Identifierを入力して作成すると、さくっと作れます。

gppios2

これによって、クライアントIDとクライアントシークレットを発行することが出来ました。 この情報は後ほど使用します。

gppios3

Xcodeでプロジェクトを作る

Xcodeでプロジェクトを作ります。 今回は普通にシングルビューアプリケーションで大丈夫でしょう。 ここからの実装方法はGoogleのこちらのページで解説されていますが初期化周りも合わせて説明しちゃいます。

gppios4

Xcodeプロジェクトファイルを作成したら、まずはそこに先ほどダウンロードしたFramework達をコピーしましょう。 コピーするファイルは

  • GoogleOpenSource.framework
  • GooglePlus.framework
  • GooglePlus.bundle
  • OpenSource フォルダ以下

です。これをコピーした後、プロジェクトのLinked Frameworks and Librariesで指定します。

gppios5

TargetsのInfoにあるURL Typesで、今回のアプリケーションのバンドルIDを設定します。 これにより、アプリケーションに再度返ってくることが出来ます。

gppios6

また、このアプリはARC対応していないので、そのためのコンパイルオプションを付けます。 (このへんはこの手のお約束みたいなものですね)

gppios7

コーディングする

ここからは、必要最低限でコーディングしていきます。 まずはAppDelegateでクライアントIDをstaticで持ちます。

AppDelegate.h

static NSString *const kClientId = @"xxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com";

また、カスタムURL用に以下のコードを追加します。

AppDelegate.m
 
 - (BOOL)application:(UIApplication *)application
     openURL:(NSURL *)url
     sourceApplication:(NSString *)sourceApplication
     annotation:(id)annotation{
         return [GPPURLHandler handleURL:url
             sourceApplication:sourceApplication
             annotation:annotation];
     }

次に、ViewControllerで自動で認証を走らせられるコードを記述します。

ViewController.h

#import <GooglePlus/GPPSignIn.h>

@interface ViewController : UIViewController <GPPSignInDelegate>

ViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    GPPSignIn *signIn = [GPPSignIn sharedInstance];
    signIn.clientID = kClientId;
    signIn.delegate = self;
    
    if(![signIn trySilentAuthentication]){
        [signIn authenticate];
    };

}

#pragma mark - GPPSignInDelegate
- (void) finishedWithAuth:(GTMOAuth2Authentication *)auth error:(NSError *)error{
    NSLog(@"Received error %@ and auth object %@",error, auth);
    if(error){
        // ここで何らかのエラー処理を行います。
    }else{
        // ログイン後の処理を記入します。
    };
}

ここまで実装したら実行してみます。 するとビルドエラーになります。

gppios8

足りないFrameworkを追加しましょう。 私の時は、以下の様なFrameworkを追加すればビルドが通りました。

gppios9

晴れてビルドに成功したら、とりあえず実機で動かしてみます。 裏でSafariが立ち上がり、Google+でのログイン権限の画面が出てきました。

gppios11

ここであえてキャンセルを選んでみます。 すると、以下のログが抽出されました。

Received error Error Domain=com.google.GooglePlusPlatform Code=-1 "Unknown error" UserInfo=0x174079840 {NSLocalizedDescription=Unknown error} and auth object (null)

おそらくここで許可するとauth情報が入ってくると、思うのですが、このままでは権限がこの2つに対しての許可になります。 今回は後々Gmailを読み込むために、権限を設定することを想定してみましょう。

デフォルトの権限は次のものが設定されています。

@[@"https://www.googleapis.com/auth/plus.login"]

signIn.scopeで、対象のプロパティを設定することで、権限を指定することが出来ます。 今回は以下のように設定してみました。

signIn.scopes = @[@"https://www.googleapis.com/auth/userinfo.profile",
    @"https://www.googleapis.com/auth/userinfo.email",
    @"https://www.googleapis.com/auth/gmail.readonly"];

これは、下記のように書き換えることも出来ます。

#import <GoogleOpenSource/GTLPlusConstants.h>

signIn.scopes = @[kGTLAuthScopePlusUserinfoProfile,
    kGTLAuthScopePlusUserinfoEmail,
    @"https://www.googleapis.com/auth/gmail.readonly"];

gppios12

権限を承認すると、以下のようなメッセージが表示されます。

Received error (null) and auth object GTMOAuth2Authentication 0x174104920: {accessToken="xxxxxxxxxxxxxxxx", refreshToken="1/xxxxxxxxxxxxxxxxxxxxxx", code="4/xxxxxxxxxxxxxxxxxxxxxxxx", expirationDate="2015-04-08 08:49:23 +0000"}

authのオブジェクトを使って、ここからデータを取得していけば、google+との連携が可能です。 とりあえず、今回はここまで。