assaulter's diary

主にバイクについて

iOS6以上でFacebookに投稿をする方法

iOS6からFacebook連携がデフォルトで入るようになったので、"Social Framework"と"Acounts Framework(これはiOS5から)"なるものを入れれば、別にFacebook SDKを使わなくてもFacebookのGraph apiを叩けるみたいです。

超カンタンな方法

SLComposeViewControllerを呼ぶだけ。以上。Facebookにアプリ登録をする必要もありません。

コレはググれば出てくるのでいいでしょう。

ちょっとめんどくさい方法

上記の方法だとfacebookの投稿がvia iOSになります。それが嫌って時はちゃんとFacebookにアプリ登録して、アプリIDを取得しましょう。

今日は眠いので、軽くメモっておきます。

 

参考文献:http://www.slideshare.net/i2key/socialframeworkaccountframework-twtrhack

このスライドにあるように、いきなり書き込み権限を取りに行くと怒られます。めんどくさ!なので処理の流れとしては

1. read権限を取得する(ついでにアカウント情報を取得する)

2.write権限を取得する

3.取得できたら、graph apiを叩いて投稿する

こんな感じです。あとはtokenが有効かどうかを確認して更新リクエストを行う処理を適当なタイミングでやりましょう。

サンプル

1.read権限を取得 + アカウント情報を取得

ACAccountStore* accountStore = [ACAccountStore new];
ACAccountType* facebookType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    
    NSDictionary* options = @{ACFacebookAppIdKey : @"アプリのid",
                              ACFacebookPermissionsKey : @[@"email"], // read権限の例
                              ACFacebookAudienceKey : ACFacebookAudienceOnlyMe}; // 公開範囲
    
    [accountStore requestAccessToAccountsWithType:facebookType options:options completion:^(BOOL granted, NSError *error) {
        if (granted) {
            NSArray *accounts = [accountStore accountsWithAccountType:facebookType];
            _fbAccount = [accounts lastObject]; // facebookのアカウント情報を取得
            ACAccountCredential *fbCredential = [_fbAccount credential];
            NSString *accessToken = [fbCredential oauthToken];
            NSLog(@"fbAccessToken : %@", accessToken); // token取れるので、ここで有効かどうか確認してもいいかも
        } else {
            NSLog(@"error getting permission email : %@", error);
        }
    }];

2.write情報を取得

1.のソースのoptionsを変えるだけ

3.投稿する

    NSString* urlString = [NSString stringWithFormat:@"https://graph.facebook.com/%@/photos", [[_fbAccount valueForKey:@"properties"] valueForKey:@"uid"]];
    /// facebook apiの種類に応じてurlを変える必要アリ
    NSURL* url = [NSURL URLWithString:urlString];
    NSDictionary* params = [NSDictionary dictionaryWithObject:@"facebook photo upload test" forKey:@"message"];
    SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                            requestMethod:SLRequestMethodPOST
                                                      URL:url
                                               parameters:params];
    /// addMultipartDataで、写真を投稿する
    NSData* photo = [[NSData alloc] initWithData:UIImagePNGRepresentation([UIImage imageNamed:@"namekuji700.jpg"])];
    [request addMultipartData:photo withName:@"withname" type:@"multipart/form-data" filename:@"filename"];
    /// アカウント情報を付加
    [request setAccount:_fbAccount];
    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
        NSLog(@"response : %@", [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]);
    }];

4.token更新処理

    [_accountStore renewCredentialsForAccount:_fbAccount completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
        if (renewResult == ACAccountCredentialRenewResultRenewed) {
            NSLog(@"renewed");
        } else if (renewResult == ACAccountCredentialRenewResultRejected) {
            NSLog(@"rejected");
        } else if (renewResult == ACAccountCredentialRenewResultFailed) {
            NSLog(@"failed");
        }
    }];

大体こんな感じでどうにかなるんじゃないでしょうか?

自前で画面とエラーハンドリングしないといけないですが、graph api叩けるので、やりたいことはほぼ出来るんじゃないかなぁと。

もっと楽な方法あったら教えて下さい。

では。

 

 

最近haskell勉強してます。応用先が見つかりませんが頭の体操になりますね。