LoginSignup
5
5

More than 5 years have passed since last update.

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

Posted at

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

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5