Salesforce Mobile SDK(iOS)でのちょっとしたTips

More than 3 years have passed since last update.

知っておくと便利?なちょっとしたtips集。サンプルコードはObjective-Cです。


OAuth2の認証情報を取り出したい

SDK経由でなく、生でリクエスト呼びたいなどに

SFOAuthCredentials *cred = [SFRestAPI sharedInstance].coordinator.credentials;

NSString *instanceUrl = cred.instanceUrl.absoluteString;
NSString *accessToken = cred.accessToken;
NSString *userId = cred.userId;

などが取れる。他はSFOAuthCredentialsのドキュメント参照。


ApexRestで公開しているAPIを呼びたい

デフォルトだとURLの頭に/services/dataを付けられてしまうので、/services/apexrestで始まるAPIが呼べない。endpointを明示的に指定する必要がある。

SFRestRequest req = [SFRestRequest new];

req.method = @"GET";
req.path = path; // apiのパス
req.endpoint = @"/services/apexrest"; // ここが重要!
req.queryParams = @{@"queryString": @"hoge"}; // パラメータを渡したい場合NSDictionaryで
req.parseResponse = YES; // レスポンスがJSONな場合はYES

[[SFRestAPI sharedInstance] sendRESTRequest:req failBlock:^(NSError *e) {
// エラー時の処理
} completeBlock:^(NSDictionary *res) {
// 成功時の処理 (resにはパース済みのJSONが入ってる)
}];


multipart/form-data形式でAPIを呼びたい

Chatter投稿で写真添付したい場合など。multipart/form-dataでJSONと写真を送らないといけないが、SDKにそういったメソッドがない。

AFNetworkingを使ったサンプルコード。

AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer new];

NSMutableURLRequest *req = [serializer multipartFormRequestWithMethod:@"POST" URLString:@"フルURL" parameters:nil constructingBodyWithBlock:^(AFMultipartFormData *data) {
// このブロック内でmultipart/form-dataに追加したいpartを必要数分追加する

// NSData *attachData = // 添付するファイルのバイナリデータ
[formData appendPartWithFileData:attachData name:@"feedItemFileUpload" fileName:@"photo.jpg" mimeType:@"image/jpeg"];

// 投稿の情報はJSONで別のpartとして追加
NSMutableDictionary *segments = @{}.mutableCopy;
NSMutableDictionary *body = @{@"body":@{@"messageSegments":segments}}.mutableCopy;
[segments addObject:@{
@"type":@"Text",
@"text":@"投稿したいテキスト"
}];

body[@"attachment"] = @{
@"attachmentType":@"NewFile",
@"title":@"Photo"
};

NSData *json = [NSJSONSerialization dataWithJSONObject:body options: NSJSONWritingPrettyPrinted error: nil];
[data appendPartWithHeaders:@{@"Content-Disposition":@"form-data; name=\"json\"", @"Content-Type":@"application/json; charset=UTF-8"} body:json];
} error:nil];

// 実際の呼び出し部分
AFHTTPRequestOperationManager *http = [AFHTTPRequestOperationManager new];
http.requestSerializer = serializer;
[serializer setValue:[NSString stringWithFormat:@"Bearer %@", accessToken] forHTTPHeaderField:@"Authorization"]; // 自前でAccessTokenを指定してやる
http.responseSerializer = [AFJSONResponseSerializer new];

AFHTTPRequestOperation *ope = [http HTTPRequestOperationWithRequest:req success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 成功時の処理
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 失敗時の処理
}];

// 忘れがち。別スレッドで実行開始!
[ope start];