SLRequestでTwitterとFacebookに画像とテキストを送る

1日2回の更新お許しください・・・。

ふと、TwitterとFacebookに同時に画像とコメント送れるのどれくらいで作れるのかな・・・と思ったので作りました。一晩かかりましたけど。
Xcode自体も何ヶ月ぶりなんですかね。 

クソみたいなソースですがGitHubに上げておきました。 ご自由にどうぞ。
適当さ加減とか技術的な話なんかは続きから。 


Twitter側

-(void)submitTweet:(NSString *)status {
    ACAccountStore *accountStore = [[ACAccountStore alloc] init];
    ACAccountType *twitterType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    
    SLRequestHandler requestHandler = ^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
        if(responseData) {
            NSInteger statusCode = urlResponse.statusCode;
            if(statusCode >= 200 && statusCode < 300) {
                NSLog(@"Succeed!");
            } else {
                NSLog(@"Failed... StatusCode:%d %@",statusCode, [NSHTTPURLResponse localizedStringForStatusCode:statusCode]);
            }
        } else {
             NSLog(@"[ERROR] An error occurred while posting: %@", [error localizedDescription]);
        }
    };
    
    ACAccountStoreRequestAccessCompletionHandler accountStoreHandler = ^(BOOL granted, NSError *error) {
        if(granted) {
            NSArray *accounts = [accountStore accountsWithAccountType:twitterType];
            NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/1.1/statuses/update_with_media.json"];
            NSDictionary *params = @{@"status": status};
            SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:url parameters:params];
            NSData *imageData = UIImageJPEGRepresentation(_globalImage, 1.0f);
            [request addMultipartData:imageData withName:@"media[]" type:@"image/jpeg" filename:@"image.jpg"];
            [request setAccount:[accounts lastObject]];
            [request performRequestWithHandler:requestHandler];
        } else {
            NSLog(@"[ERROR] An error occurred while asking for user authorization: %@", [error localizedDescription]);
        }
    };
    
    
    [accountStore requestAccessToAccountsWithType:twitterType options:nil completion:accountStoreHandler];
}

以前、TWRequestで画像とテキストを同時に送る話をしましたが、それがSLRequestに変わっただけです。
そんな変な処理はしていない・・・はず。

参考

Posting images using SLRequest | Twitter Developers

Facebook側

何ともめんどくさい事に、事前にアプリを作っておかないといけない。

slrequest_01.png

バンドルIDも登録しておいて、AppIDを使用してアクセスします。

-(void)submitFacebook:(NSString *)status {
    ACAccountStore *accountStore = [[ACAccountStore alloc] init];
    ACAccountType *facebookType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    NSDictionary *options = @{ ACFacebookAppIdKey: @"xxxxxxxxxxxxxx", ACFacebookPermissionsKey: @[@"publish_stream"], ACFacebookAudienceKey: ACFacebookAudienceFriends };
    
    SLRequestHandler requestHandler = ^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
        if(responseData) {
            NSInteger statusCode = urlResponse.statusCode;
            if(statusCode >= 200 && statusCode < 300) {
                NSLog(@"Succeed!");
            } else {
                NSLog(@"Failed... StatusCode:%d %@",statusCode, [NSHTTPURLResponse localizedStringForStatusCode:statusCode]);
            }
        } else {
             NSLog(@"[ERROR] An error occurred while posting: %@", [error localizedDescription]);
        }
    };
    
    ACAccountStoreRequestAccessCompletionHandler accountStoreHandler = ^(BOOL granted, NSError *error) {
        if(granted) {
            NSArray *accounts = [accountStore accountsWithAccountType:facebookType];
            NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me/photos"];
            NSDictionary *params = @{@"message": status};
            SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodPOST URL:url parameters:params];
            NSData *imageData = UIImageJPEGRepresentation(_globalImage, 1.0f);
            [request addMultipartData:imageData withName:@"source" type:@"multipart/form-data" filename:@"image.jpg"];
            [request setAccount:[accounts lastObject]];
            [request performRequestWithHandler:requestHandler];
        } else {
            NSLog(@"[ERROR] An error occurred while asking for user authorization: %@",[error localizedDescription]);
        }
    };

    [accountStore requestAccessToAccountsWithType:facebookType options:options completion:accountStoreHandler];
}

ぱっと見一緒ですが、optionがTwitterだとnilで済んでいたのに対し、Facebookでは指定されています。
AppIDと動作権限と、公開範囲を引数として与えています。

後はaddMultipartDataのあたりとURL、AccountTypeが違うぐらいのなので共通化できそうです。

参考

iOS6のSocial.frameworkを試してみた – 中継地点
iPhone iOS 6 Facebook and Twitter Integration using SLRequest – Techotopia
objective c – Facebook in iOS6.0 use SLRequest to upload a photo failed anyway – Stack Overflow

その他

  • エラー処理とかは適当です
  • 一応ほぼ同時に送信しているはずです
  • 他の処理も比較的適当ですがお許し下さい
  • 4時間かかりました

おわり

Facebook側の権限設定で2時間ぐらい躓いていました。ややこしい・・・。

コメントを残す