SDKのメインクラス [詳細]
#import <Mixi.h>
Public メソッド | |
| (id) | - setupWithClientId:secret: |
| OAuthクライアントIDとシークレットを指定してインスタンスを初期化。APIタイプはGraphAPI。 | |
| (id) | - setupWithType:clientId:secret: |
| タイプとOAuthクライアントIDとシークレットを指定してインスタンスを初期化 | |
| (id) | - setupWithConfig: |
| 設定を指定してインスタンスを初期化 | |
| (void) | - reportOncePerDay |
| UUカウントのためにpingを実行 | |
| (void) | - setPropertiesFromDictionary: |
| 辞書オブジェクトでプロパティをまとめて設定 | |
| (NSString *) | - application:openURL:sourceApplication:annotation:error: |
| 公式アプリからの戻り値を処理 | |
| (BOOL) | - isMixiAppInstalled |
| mixi公式iPhoneアプリがインストールされているかどうか | |
| (BOOL) | - isUsingSDKAuthorizer |
| SDK単体で認可を実行しているかどうか | |
| (BOOL) | - isUsingAppAuthorizer |
| mixi公式iPhoneアプリで認可を実行しているかどうか | |
| (BOOL) | - isAuthorized |
| アクセストークンを取得済みかどうか | |
| (BOOL) | - isAccessTokenExpired |
| アクセストークンが期限切れかどうか | |
| (BOOL) | - isRefreshTokenExpired |
| リフレッシュトークンが期限切れかどうか | |
| (BOOL) | - refreshAccessToken |
| リフレッシュトークンを使用してアクセストークンを同期的にリフレッシュ | |
| (BOOL) | - refreshAccessTokenWithError: |
| リフレッシュトークンを使用してアクセストークンを同期的にリフレッシュ | |
| (NSURLConnection *) | - refreshAccessTokenWithDelegate: |
| (BOOL) | - authorize: |
| 公式アプリを呼び出して認証を実行 | |
| (BOOL) | - authorizeForPermission: |
| 公式アプリを呼び出して認証を実行 | |
| (BOOL) | - authorizeForPermissions: |
| 公式アプリを呼び出して認証を実行 | |
| (void) | - logout |
| ログアウト | |
| (BOOL) | - revoke |
| 認可状態を解除します。 | |
| (BOOL) | - revokeWithError: |
| 認可状態を解除します。 | |
| (NSString *) | - retrieveTokensFromURL:sourceApplication:error: |
| 公式アプリからの戻りURLからaccess token、refresh tokenなどを抽出. | |
| (NSError *) | - retrieveErrorFromURL: |
| 公式アプリの戻りURLからエラーを抽出 | |
| (void) | - store |
| インスタンスの情報を保持 | |
| (BOOL) | - restore |
| インスタンスの情報を復帰 | |
| (NSURLConnection *) | - sendRequest:delegate:forced: |
| APIを実行(非同期) | |
| (NSURLConnection *) | - sendRequest:delegate: |
| APIを実行(非同期) | |
| (NSString *) | - rawSendSynchronousRequest:error: |
| APIを実行して結果を文字列で取得(同期) | |
| (NSDictionary *) | - sendSynchronousRequest:error: |
| APIを実行して結果を辞書型で取得(同期) | |
| (MixiViewController *) | - buildViewControllerWithRequest:delegate: |
| 画面を伴うAPIを実行するための画面を取得 | |
Static Public メソッド | |
| (Mixi *) | + sharedMixi |
| 共有されたインスタンスを取得 | |
プロパティ | |
| MixiConfig * | config |
| NSArray * | permissions |
| BOOL | autoRefreshToken |
| MixiViewController * | mixiViewController |
| MixiAuthorizer * | authorizer |
| MixiReporter * | uuReporter |
SDKのメインクラス
APIのほとんどは本クラスを通じて実行されます。ただし、実行されるAPIの内容はパラメータとして受け取るMixiRequestで保持されています。
SDKを利用する場合は次のヘッダファイルをインポートしてください。
#import "MixiSDK.h"
本クラスはシングルトンクラスです。インスタンスは次のようにして取得できます。
[Mixi sharedMixi]
ただし、APIを実行する前に一度シングルトンオブジェクトを初期化しておく必要があります。 UIApplicationDelegate::application:didFinishLaunchingWithOptions: 例えばGraph APIを使用する場合、メソッド内で次のように記述するといいでしょう。 (全ての引数はアプリケーションの設定に合わせて変更してください)
Mixi *mixi = [[Mixi sharedMixi] setupWithType:kMixiApiTypeSelectorGraphApi
clientId:"ab12c345de6789f12345"
secret:@"a1b2c3456d789ef0123ghi4567jklmn89op01qrs"];
[mixi restore];
[mixi reportOncePerDay];
アプリの起動を通知するコードをapplicationWillEnterForeground:に追記します。
- (void)applicationWillEnterForeground:(UIApplication *)application {
[[Mixi sharedMixi] reportOncePerDay];
}
このコードの追記は任意ですが、サービスの改善のために協力していただけると幸いです。 アプリケーションの情報は一切送信されません。
さらに、mixi公式iPhoneアプリで認可を行う場合(デフォルトの動作です)は、結果(アクセストークンなど)を受け取るために UIApplicationDelegate::application:openURL:sourceApplication:annotation: メソッドに次のような処理を追加しておきます。
NSError *error = nil;
NSString *apiType = [[Mixi sharedMixi] application:application openURL:url sourceApplication:sourceApplication annotation:annotation error:&error];
if (error) {
// エラーが発生しました
}
else if ([apiType isEqualToString:kMixiAppApiTypeToken]) {
// 認可処理に成功しました
}
else if ([apiType isEqualToString:kMixiAppApiTypeRevoke]) {
// 認可解除処理に成功しました
}
else if ([apiType isEqualToString:kMixiAppApiTypeReceiveRequest]) {
// リクエストAPIによるリクエスト受け取り
}
上記により認可が完了してればシングルトンオブジェクトはアクセストークンを保持し、APIを実行できる状態になっています。
Graph APIを利用する場合に限り公式アプリを経由せずにSDK単独で認可/認可解除を実行できます。
SDK単独での認可を行うには、mixiオブジェクトのauthorizerプロパティをMixiSDKAuthorizerインスタンスに置き換えてください。 UIApplicationDelegate::application:didFinishLaunchingWithOptions:内でMixiオブジェクトをsetupした直後に置き換えるといいでしょう。 redirectUrlはsap.mixi.jpでアプリケーションに設定したリダイレクトURLです。
if (![mixi isMixiAppInstalled]) {
mixi.authorizer = [MixiSDKAuthorizer authorizerWithRedirectUrl:redirectUrl];
}
if (![mixi isMixiAppInstalled])はmixi公式iPhoneアプリがなかった場合のみ、SDK単体で認可を行うようにするためのものです。 mixi公式iPhoneアプリの有無にかかわらず、必ずSDK単体で認可を行う場合はこのif文は不要です。 また、SDK単独で認可を行う場合は認可情報はSDK内部でやりとりされるため、先の項で説明した UIApplicationDelegate::application:openURL:sourceApplication:annotation: での処理も不要になります。
SDK単体で認可する場合は、さらにauthorizerが認可に使用するウェブビューコントローラの親になるビューコントローラを設定しなければいけません。 APIを呼び出すビューコントローラのUIViewController::viewDidAppear:に次のようなコードを追加してください。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
Mixi *mixi = [Mixi sharedMixi];
if (![mixi isMixiAppInstalled] && ![mixi.authorizer isAuthorized]) {
id authorizer = mixi.authorizer;
[authorizer setParentViewController:[self navigationController]];
}
}
こちらも![mixi isMixiAppInstalled] &&はmixi公式iPhoneアプリがなかった場合にSDK単体で認可を行うようにするためのものです。 mixi公式iPhoneアプリの有無にかかわらずSDK単体で認可を行う場合は上の条件式は不要です。
認可が完了するとその結果はSDK内に保持され、認可に使用したビューコントローラもdismissされます。 認可完了時にそれら以外の処理を実行する必要がある場合は認可オブジェクトにデリゲートを設定してください。
id<MixiSDKAuthorizerDelegate> delegate = [[YourDelegate alloc] init]; authorizer.delegate = delegate;
認可画面のツールバーはデフォルトでは標準のくすんだ青色になっています。アプリケーションのイメージカラーに合わせてツールバーの色を変更したい場合はtoolbarColorプロパティを設定してください。
authorizer.toolbarColor = [UIColor blackColor];
APIはエンドポイントとパラメーターを設定したMixiRequestインスタンスを、sendRequest:delegate: (Mixi)メソッドに渡すことで実行します。 API実行前に認可が完了しているかどうかを確認して、未認可の場合は先に認可しておきます。認可に失敗した場合はmixi公式アプリがインストールされていないか、最新版ではない可能性があるので、AppStoreのmixi公式アプリダウンロードを提案する画面を開きます。
if ([mixi isAuthorized]) {
MixiRequest *request = [MixiRequest requestWithEndpoint:@"/people/@me/@friends"];
[mixi sendRequest:request delegate:mixiDelegate];
}
else if (![mixi authorizeForPermission:@"r_profile"]) {
MixiWebViewController *vc = MixiUtilDownloadViewController(self, (closeDownloadView:));
vc.orientationDelegate = self;
[self presentModalViewController:vc animated:YES];
}
公式アプリダウンロード画面で「キャンセル」ボタンをクリックされた場合の処理はSDK利用者が自分で実装しなければいけません。 上記の例であれば、呼び出し元のコントローラで次のようなメソッドを定義します。
パラメーター付きのMixiRequestは次のようにして作成できます。サンプルのとおり、UIImageインスタンスを渡すと画像を添付できます。
if ([mixi isAuthorized]) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"yoichiro" ofType:@"png"];
UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];
MixiRequest *request = [MixiRequest postRequestWithEndpoint:@"/voice/statuses/update"
paramsAndKeys:@"こんにちはこんにちは", @"status",
image, "photo", nil];
[mixi sendRequest:request delegate:mixiDelegate];
}
else if (![mixi authorizeForPermission:@"w_voice"]) {
MixiUtilShowErrorMessage("公式アプリが入っていないか古いです");
}
複雑なオブジェクトはNSMutableDictionaryインスタンスで指定します。
if ([mixi isAuthorized]) {
NSMutableDictionary *diary = [NSMutableDictionary dictionary];
[diary setValue:"今日のなんとか" forKey:@"title"];
[diary setValue:@"今日はあれとかこれとか" forKey:@"body"];
NSMutableDictionary *privacy = [NSMutableDictionary dictionary];
[privacy setValue:"self" forKey:@"visibility"];
[diary setValue:privacy forKey:@"privacy"]; MixiRequest *request = [MixiRequest postRequestWithEndpoint:@"/diary/articles/@me/@self"
paramsAndKeys:diary, @"request", nil];
[mixi sendRequest:request delegate:mixiDelegate];
}
else {
[mixi authorizeForPermission:@"w_diary"];
}
画像オブジェクトをparamsプロパティの値に設定すると画像が一つしか指定されていない場合でもマルチパートで送信されます。 写真投稿APIのように画像をリクエストボディに設定する必要がある場合は、bodyプロパティに画像オブジェクトを設定してください。 (なお、paramsとbodyを同時に指定した場合はリクエストボディはbodyプロパティの値になり、パラメーターはエンドポイントにクエリパラメーターとして追加されます)
if ([mixi isAuthorized]) {
NSString *path = [[NSBundle mainBundle] pathForResource:"yoichiro" ofType:@"png"];
UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];
MixiRequest *request = [MixiRequest postRequestWithEndpoint:"/photo/mediaItems///123456"
body:image
paramsAndKeys:"写真タイトル", @"title", nil];
[mixi sendRequest:request delegate:self];
}
else {
[mixi authorizeForPermission:"w_photo"];
}
リクエストAPI呼び出しは確認ダイアログを表示するため、buildViewControllerWithRequest:delegate:メソッドを使用して呼び出します。
if ([mixi isAuthorized]) {
NSString *message = @"こんにちはこんにちは";
NSString *recipients = @"abcdefghijklm";
NSString *url = @"http://mixi.jp/run_appli.pl?id=xxxxx";
NSString *mobileUrl = @"http://ma.mixi.net/xxxxx/";
NSString *image = @"http://profile.img.mixi.jp/photo/user/mlkjihgfedcba_12345678901.jpg,image/jpeg"; MixiRequest *request = [MixiRequest requestWithEndpoint:@"/dialog/requests"
paramsAndKeys:message, @"message",
recipients, @"recipients",
url, @"url",
mobileUrl, @"mobile_url",
image, @"image",
nil];
UIViewController *viewController = [mixi buildViewControllerWithRequest:request delegate:mixiDelegate];
[self presentModalViewController:viewController animated:YES];
}
else {
[mixi authorizeForPermission:@"mixi_apps"];
}
リクエストAPIで送信されたリクエストをアプリケーションで受け取った場合は、処理が完了したら明示的にリクエストを削除しなければいけません。 アプリケーションの起動に使用されたURLのクエリパラメータとしてリクエストIDが付加されています。 リクエストの処理完了後に、そのIDを利用してリクエストを削除してください。
NSString *requestId = MixiUtilGetRequestIdFromURL(url);
MixiRequest *request = [MixiRequest deleteRequestWithEndpoint:"/apps/requests/@me/@self"
paramsAndKeys:requestId, @"requestIds", nil];
[[Mixi sharedMixi] sendRequest:request delegate:self];
API実行結果はsendメソッド群の引数に与えていたMixiDelegateプロトコルを実装したデリゲートで処理します。 例えば、APIの実行結果をAlertViewで表示するには次のようなデリゲートメソッドを定義したクラスのインスタンスをsendメソッド群の引数に与えます。
- (void)mixi:(Mixi*)mixi didFinishLoading:(NSString*)data {
MixiUtilShowMessageTitle(data, @"実行結果");
}
上記以外のデリゲートメソッドについてはMixiDelegateのドキュメントを参照してください。
sendSynchronousRequest:error: (Mixi) メソッドを使用してAPIを同期的に実行することもできます。 ただし、同期的に実行した場合、APIの呼び出しが完了するまでアプリケーションの動作が停止するため、どうしても必要な場合を除き、非同期呼び出しを使用してください。
NSError *error = nil;
MixiRequest *request = [MixiRequest requestWithEndpoint:@"/people/@me/@friends"];
NSDictionary *result = [mixi sendSynchronousRequest:request error:&error];
// 呼び出しが完了するまで停止します
if (error) {
// エラー
}
else {
NSArray *friends = [result objectForKey:@"entry"];
// 友人一覧を利用
}
Mixi::sendRequest:delegate メソッドは呼び出しの結果として NSURLConnection オブジェクトを返します。 リクエストをキャンセルする場合はこの NSURLConnection オブジェクトを使用してください。
例えばAPI呼び出しを0.5秒後にキャンセルする場合は次のようになります。
Mixi *mixi = [Mixi sharedMixi];
MixiRequest *request = [MixiRequest requestWithEndpoint:@"/people/@me/@friends"];
NSURLConnection *conn = [mixi sendRequest:request delegate:self];
[conn performSelector:@selector(cancel) withObject:nil delay:0.5];
デフォルトの状態では、アクセストークンが期限切れの場合、自動的にリフレッシュされ新しいトークンを使用してAPIリクエストが実行されます。 ただしこのリフレッシュは同期的に行われます。 もし非同期にトークンをリフレッシュしたい場合は、次の例を参考にしてください。 (エラー処理などは省略しています)
― (void)doMyRequest {
Mixi *mixi = [Mixi sharedMixi];
mixi.autoRefreshToken = NO;
MixiRequest *request = [MixiRequest requestWithEndpoint:@"/people/@me/@friends"];
request.openMixiAppToAuthorizeIfNeeded = NO;
[mixi sendRequest:request delegate:self];
} // トークンが期限切れの場合に非同期にリフレッシュ(API呼び出しの結果を処理しています)
― (void)mixi:(Mixi*)mixi didFailWithError:(NSError*)error {
if (error.code == kMixiTokenErrorExpired) {
[mixi refreshAccessTokenWithDelegate:self];
}
} // トークンリフレッシュに成功したのでトークンを保持してリクエストを再送(トークンリフレッシュの結果を処理しています)
― (void)mixi:(Mixi*)mixi didSuccessWithJson:(NSDictionary*)data {
[mixi setPropertiesFromDictionary:data];
[self doMyRequest];
}
| - (NSString *) application: | (UIApplication *) | application | |
| openURL: | (NSURL *) | url | |
| sourceApplication: | (NSString *) | sourceApplication | |
| annotation: | (id) | annotation | |
| error: | (NSError**) | error | |
公式アプリからの戻り値を処理
アプリケーションのURLスキームで呼び出された場合を処理するためのユーテリィティメソッドです。 UIApplicationDelegate::application:openURL:sourceApplication:annotation 内で呼び出してください。 独自の制御が必要な場合は当メソッドの実装をアプリケーションデリゲートの同名メソッドにコピーして自由に修正して構いません。
| application | 呼び出されたアプリケーション |
| url | 呼び出しに使用されたURL |
| sourceApplication | 呼び出し元アプリケーション |
| annotation | 付加情報 |
| error | エラー |
| - (BOOL) authorize: | (NSString*) | permission | |
| , | ... | ||
公式アプリを呼び出して認証を実行
| permission | 要求するパーミッション。可変長。最後の引数は必ずnilにすること |
| - (BOOL) authorizeForPermission: | (NSString*) | permission |
公式アプリを呼び出して認証を実行
| permission | 要求するパーミッション |
| - (BOOL) authorizeForPermissions: | (NSArray*) | permissions |
公式アプリを呼び出して認証を実行
| permissions | 要求するパーミッション |
| - (MixiViewController *) buildViewControllerWithRequest: | (MixiRequest*) | request | |
| delegate: | (id<MixiDelegate>) | delegate | |
画面を伴うAPIを実行するための画面を取得
| request | リクエスト |
| delegate | リクエスト結果を処理するデリゲート |
| - (BOOL) isAccessTokenExpired |
アクセストークンが期限切れかどうか
| - (BOOL) isAuthorized |
アクセストークンを取得済みかどうか
| - (BOOL) isMixiAppInstalled |
mixi公式iPhoneアプリがインストールされているかどうか
| - (BOOL) isRefreshTokenExpired |
リフレッシュトークンが期限切れかどうか
| - (BOOL) isUsingAppAuthorizer |
mixi公式iPhoneアプリで認可を実行しているかどうか
| - (BOOL) isUsingSDKAuthorizer |
SDK単体で認可を実行しているかどうか
| - (void) logout |
ログアウト
SDKが端末上に保持している情報をクリアします。
| - (NSString *) rawSendSynchronousRequest: | (MixiRequest*) | request | |
| error: | (NSError**) | error | |
APIを実行して結果を文字列で取得(同期)
(リダイレクト先で結果を返すAPIがあるため)リダイレクトされた場合は、リダイレクト先を返します。
| request | リクエスト |
| error エラー |
| - (BOOL) refreshAccessToken |
リフレッシュトークンを使用してアクセストークンを同期的にリフレッシュ
| - (NSURLConnection *) refreshAccessTokenWithDelegate: | (id<MixiDelegate>) | delegate |
リフレッシュトークンを使用してアクセストークンを非同期にリフレッシュ
| delegate | 結果を受け取るデリゲート |
| - (BOOL) refreshAccessTokenWithError: | (NSError**) | error |
リフレッシュトークンを使用してアクセストークンを同期的にリフレッシュ
| error | エラー |
| - (void) reportOncePerDay |
UUカウントのためにpingを実行
複数回送信されたとしても一日に一度しかカウントされません。
| - (BOOL) restore |
インスタンスの情報を復帰
| - (NSError *) retrieveErrorFromURL: | (NSURL*) | url |
公式アプリの戻りURLからエラーを抽出
エラーコードは次の通り。
| url | アプリ起動に使用されたURL |
| - (NSString *) retrieveTokensFromURL: | (NSURL*) | url | |
| sourceApplication: | (NSString*) | sourceApplication | |
| error: | (NSError**) | error | |
公式アプリからの戻りURLからaccess token、refresh tokenなどを抽出.
| url | アプリ起動に使用されたURL |
| sourceApplication | 呼び出し元アプリケーション。現在未使用。将来的に検証に使用したい。 |
| error | エラー |
| - (BOOL) revoke |
認可状態を解除します。
| - (BOOL) revokeWithError: | (NSError**) | error |
認可状態を解除します。
| error | エラー |
| - (NSURLConnection *) sendRequest: | (MixiRequest*) | request | |
| delegate: | (id<MixiDelegate>) | delegate | |
APIを実行(非同期)
アクセストークンのリフレッシュが必要な場合は、リフレッシュしてからAPIを実行します。
| request | リクエスト |
| delegate | リクエスト結果を処理するデリゲート |
| - (NSURLConnection *) sendRequest: | (MixiRequest*) | request | |
| delegate: | (id<MixiDelegate>) | delegate | |
| forced: | (BOOL) | forced | |
APIを実行(非同期)
アクセストークンの自動更新があり、処理がやや込み入っているので以下に簡単に説明します。 アクセストークンの更新に関係するものは次の5つです。
それらを次の順でチェックしてAPIを呼び出します。
| request | リクエスト |
| delegate | リクエスト結果を処理するデリゲート |
| forced | アクセストークンの期限切れを気にせずとにかく実行するか、そうではないか |
| - (NSDictionary *) sendSynchronousRequest: | (MixiRequest*) | request | |
| error: | (NSError**) | error | |
APIを実行して結果を辞書型で取得(同期)
| request | リクエスト |
| error エラー |
| - (void) setPropertiesFromDictionary: | (NSDictionary*) | dict |
辞書オブジェクトでプロパティをまとめて設定
| dict | 有効なキーは"access_token"、"refresh_token"、"expires_in"、"state" |
| - (id) setupWithClientId: | (NSString*) | clientId | |
| secret: | (NSString*) | secret | |
OAuthクライアントIDとシークレットを指定してインスタンスを初期化。APIタイプはGraphAPI。
| clientId | OAuthコンシューマーキー |
| secret | OAuthコンシューマーシークレット |
| - (id) setupWithConfig: | (MixiConfig*) | config |
設定を指定してインスタンスを初期化
| config | 設定 |
| - (id) setupWithType: | (MixiApiType) | type | |
| clientId: | (NSString*) | clientId | |
| secret: | (NSString*) | secret | |
タイプとOAuthクライアントIDとシークレットを指定してインスタンスを初期化
| type | kMixiApiTypeSelectorMixiAppまたはkMixiApiTypeSelectorGraphApi |
| clientId | OAuthコンシューマーキー |
| secret | OAuthコンシューマーシークレット |
| + (Mixi *) sharedMixi |
共有されたインスタンスを取得
1.7.4