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

  • 6
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

知っておくと便利?なちょっとした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];

この投稿は Salesforce1 Advent Calendar 201418日目の記事です。