mixiエンジニアがおくるソーシャルアプリ開発実践講座

第1回mixi SDKでiPhoneアプリを作ろう

はじめに

mixiはSNSだけではなくプラットフォームとしての側面も持っており、mixiの持つソーシャルグラフをmixiの外のサービスで利用したり、mixi上でWebアプリケーションを動作させたりすることができます。前者はGraph APIと呼ばれるAPIセットで実現でき、後者はmixiアプリ向けAPIで実現できます。

mixiではスマートフォン上でのmixiプラットフォームの利用を促進するために、今年の5月に「mixi API SDK for Android⁠⁠、9月に「mixi API SDK for iOS」の提供を開始しました。今回と次回の2回に分けて、そのiOS版SDKとAndroid版SDKについて順に紹介します。

mixi API SDK for iOSとは

mixi API SDK for iOS(以下、mixi SDK(iOS)と表記)とはその名のとおりmixi APIをiOSで利用するためのSDKです。これを使うことでリスト1のようにして簡単にiPhoneアプリからmixiのAPIを呼び出せます。

リスト1 People API呼び出しの例
MixiRequest *request = [MixiRequest 
  requestWithEndpoint:@"/people/@me/@self"];
[[Mixi sharedMixi] sendRequest:request 
                      delegate:self];

mixi SDK(iOS)を利用すると次のような利点があります。

  • シングルサインオンができる
  • 認可・トークンの期限切れなどを気にせずAPIの呼び出しだけに専念して開発できる
  • mixiアプリはmixi内の検索機能で探すことができ、ユーザがアプリを見つけやすい

もちろん利点だけではありません。現時点では次のような欠点も存在します。

  • 認可をmixi公式アプリに依存するため開発には実機が必要になる
  • iPadには対応していない

これらの点が受け入れられない場合は、自分でmixiのAPIを呼び出すライブラリの作成を検討してもいいでしょう。またmixi SDK(iOS)はソースコードで提供されますので、好みの動作をするように変更することも可能です。

mixi API SDK for iOSを準備する

mixi SDK(iOS)を使ってmixi APIを実行するには事前にいくつかの準備が必要です。

事前準備

先の項目に進む前に下記を済ませておいてください。誌面の都合上詳細な説明は省略します。

  • iPhoneアプリを実機で動作させられるようmixi公式アプリがインストールされた実機を用意し、各種登録を済ませる
  • mixiパートナー登録をする。個人パートナーの方はクレジットカード番号も登録する[1]

アプリ登録

mixi SDK(iOS)は認可にOAuthを使用します。まずは作成するアプリケーションの情報をmixi Developer Centerに登録してOAuth Client IDとClient Secretを取得しましょう。

アプリ情報の登録で重要な設定項目は次のとおりです。

mixiアプリの場合
アプリ対応範囲:「iOS版」にチェックを入れる
Graph APIの場合
起動URIスキーム:mixi SDK(iOS)を使用するアプリの起動のためのURIスキームを入力する

プロジェクトの設定

mixi Developer Centerの「SDKダウンロード」から「mixiIOSSDK-version.zip」をダウンロードし、展開したディレクトリ内のlib/MixiSDKディレクトリをプロジェクトに追加しましょう。

さらにmixi SDK(iOS)が依存している次のフレームワークをプロジェクトに追加します。

  • CFNetwork.framework
  • Security.framework
  • SystemConfiguration.framework

最後にmixi Developer Centerのアプリ情報に表示されている起動URIスキームをプロジェクトに追加してください。mixiアプリの場合はデフォルトではmixiapp-、Graph APIの場合はアプリ情報登録時に自分で設定した値になっています。以上で準備は完了です。

mixi API SDK for iOSを利用する

mixi SDK(iOS)で動作するアプリケーションのソースコードのすべてを紹介するには誌面が足りませんので、GitHubのリポジトリに登録されているサンプルアプリケーションを説明に使用します(一部書き換えてあります⁠⁠。画面右上の「Download」ボタンをクリックしてソースコードを手元に用意してから読み進んでください。

APIを呼び出す準備をする

mixi SDK(iOS)でAPIを呼び出す前に、SDKを初期化しなければいけません。またmixi SDK(iOS)は認可をmixi公式アプリに委譲するため、トークンを公式アプリから受け取るための処理も必要です。これらは通常アプリケーションデリゲートで実装されます。mixi-api-sdk-ios-sampleのアプリケーションデリゲートに関連する部分を見てみましょうリスト2⁠。

リスト2 API呼び出しの下準備
     (中略)     
#import "MixiSDK.h" // ―― ①
     (中略)     
@implementation MixiSDKSampleAppDelegate
     (中略)     
-(BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
         (中略)     
    Mixi *mixi = [Mixi sharedMixi]; ―― ②
    [mixi setupWithType:kMixiApiTypeSelectorGraphApi ―― ③
     clientId:kMixiGraphClientId secret:kMixiGraphClientSecret 
     appId:kAppId];
    [mixi restore]; ―― ④
    return YES;
}
     (中略)     
-(BOOL)application:(UIApplication *)application ―― ⑤
    openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication 
    annotation:(id)annotation {
    NSError *error = nil;
    Mixi *mixi = [Mixi sharedMixi];
    NSString *apiType = [mixi application:application ―― ⑥
                         openURL:url sourceApplication:sourceApplication 
                         annotation:annotation error:&error];
    if (error) {
        NSLog(@"エラーが発生しました: %@", error);
    } else if ([apiType isEqualToString:kMixiAppApiTypeToken]) {
        NSLog(@"認可処理に成功しました");
    } else if ([apiType isEqualToString:kMixiAppApiTypeRevoke]) {
        NSLog(@"認可解除処理に成功しました");
        [mixi logout] ―― ⑦
    }
    return YES;
}
     (中略)
  • ① mixi SDK(iOS)を利用するには MixiSDK.h をインポートします
  • ② API実行のほとんどはMixiインスタンスを通して行われます。Mixiクラスは直接インスタンス化されることはほとんどなく、通常はシングルトンインスタンスをsharedMixiメソッドで取得して利用します
  • ③ Mixiオブジェクトは使用前にセットアップが必要です。アプリケーションの起動時にMixi#setupWithType:clientId:secret:appId:メソッドを呼び出してシングルトンインスタンスをセットアップしましょう。本例では説明を簡単にするためクライアントシークレットを定数として保持していますが、実際はリバースエンジニアリングなどでシークレットが流出する可能性を考えて、よりセキュアな保持方法を検討してください
  • ④ Mixi#restoreメソッドで前回終了時のトークンを復帰しておきます
  • ⑤、⑥ アクセストークン取得や認可解除の結果は公式アプリからSDKにURLを通じて渡されます。UIApplicationDelegate#application:openURL:sourceApplication:
    annotation:で受け取った引数をそのままMixi#application:openURL:sourceApplication:annotation:error:に渡してください
  • ⑦ 公式アプリ経由で行う認可解除処理はあくまでもサーバ側での処理です。SDKは独自に認可情報を保持しているので、サーバでの認可解除後にはMixi#logoutメソッドでSDK側の情報もクリアします

APIを実行する

まずはPeople APIを使用して自分の友人一覧を取得してみましょうリスト3⁠。

リスト3 People API呼び出しの例
Mixi *mixi = [Mixi sharedMixi];
if ([mixi isAuthorized]) { ―― ①
    MixiRequest *request = 
        [MixiRequest requestWithEndpoint:@"/people/@me/@friends"]; ―― ②
    [mixi sendRequest:request delegate:self]; ―― ③
} else if (![mixi authorize:@"r_profile", nil]) { ―― ④
    MixiWebViewController *vc = MixiUtilDownloadViewController(self,  
        @selector(closeDownloadView));  ―― ⑤
    [self presentModalViewController:vc animated:YES];
}
  • ① APIを呼び出す前に認可が完了しているかをMixi#isAuthorizedで調べます
  • ②、③ 認可が完了していればAPIを呼び出せます。MixiRequestオブジェクトにAPI呼び出しに必要な情報を格納し、Mixi#sendRequest:delegate:メソッドに渡してください。Mixi#sendRequest:delegate:メソッドの第2引数はAPIの実行結果を受け取るデリゲートです。詳細は次の節を参照
  • ④ 認可が完了していない場合はMixi#authorize:メソッドに必要なスコープを渡して認可画面を呼び出します。認可はmixi公式アプリが行いますので、本メソッド呼び出し後に画面がmixi公式アプリと切り替わります。認可の結果は先の節で実装したUIApplicationDelegate#application:openURL:sourceApplication:
    annotation:メソッドで受け取ります
  • ⑤ Mixi#authorize:がNOを返す場合はmixi公式アプリがインストールされていないか古いと判断できるので、mixi公式アプリのダウンロード画面を開きます

次に投稿APIの例としてPhoto APIを見てみますリスト4⁠。

リスト4 Photo API呼び出しの例
NSString *path = [[NSBundle mainBundle] pathForResource:@"mixi_map_logo" ofType:@"png"];
UIImage *image = [[[UIImage alloc] initWithContentsOfFile:path] autorelease];
MixiRequest *request = [MixiRequest 
                        postRequestWithEndpoint:@"/photo/mediaItems/"
                        body:image paramsAndKeys:@"mixiロゴ", @"title", nil]; ―― ①
[mixi sendRequest:request delegate:self]; ―― ②
  • ① 情報の投稿にはMixiRequest#postRequestWith…系のメソッドが利用できます
  • ② 情報の投稿でもMixi#sendRequest:delegate:の使用方法は先の例と同じです

APIを呼び出すために利用できるメソッドは上記以外にも存在します。詳細はmixi SDK(iOS)をダウンロードして展開したディレクトリにあるdocs/index.htmlを参照してください。

APIの実行結果を受け取る

非同期に実行したAPIの結果はMixiDelegateプロトコルを実装したデリゲートオブジェクトで受け取ります。MixiDelegateプロトコルで宣言されるメソッドには表1のようなものがあります。これらはすべてオプショナルですので必要なメソッドだけを実装してください。

表1 MixiDelegateプロトコルで宣言されるメソッド
メソッド説明
-(void)mixi:(Mixi*)mixi didFinishLoading:(NSString*)dataAPIの実行終了(成否は問わない)
-(void)mixi:(Mixi*)mixi didSuccessWithJson:(NSDictionary*)dataAPIの実行成功
-(void)mixi:(Mixi*)mixi didCancelWithConnection:(NSURLConnection*)connectionAPIの実行キャンセル
-(void)mixi:(Mixi*)mixi didFailWithConnection:(NSURLConnection*)connection error:(NSError*)errorAPIの呼び出し失敗
-(void)mixi:(Mixi*)mixi didFailWithError:(NSError*)errorAPI の実行失敗

たとえば成否によらずAPI実行結果をコンソール表示するには、リスト5のようなメソッドを実装したデリゲートをMixi#sendRequest:delegate:に渡してください。

リスト5 API実行結果をコンソール表示する
-(void)mixi:(Mixi*)mixi didFinishLoading:(NSString*)data {
  NSLog(@"Result: %@", data);
}

さいごに

駆け足でしたが、mixi SDK(iOS)のセットアップからAPI呼び出しまでを説明しました。今後、本ライブラリを利用したiPhoneアプリが数多く登場することを期待しています。

mixiでは開発エンジニアを募集しています。

詳細はこちら
http://career.mixi.co.jp/

おすすめ記事

記事・ニュース一覧