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

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

この記事を読むのに必要な時間:およそ 4 分

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/

著者プロフィール

あんどうやすし

(株)ミクシィ プラットフォームサービス開発部