読者です 読者をやめる 読者になる 読者になる

まいまいワークス

主にiPhoneアプリの開発で考えた事、調べた事、感じた事などを記していきます。

Twitter/Facebookのアカウントで認証して、アプリからタイムライン/フィードに投稿する[#8]〜Facebookのフィード投稿〜

メッセージの投稿

これが投稿の基本パターンになります。

//例によって以下の項目をインポートする
#import <Parse/Parse.h>
#import <FacebookSDK/FacebookSDK.h>
#import <AFNetworking/AFNetworking.h>



-(void)fbpost:(NSString *)message{
    
    //プライバシー(公開範囲)の設定
    NSDictionary* privacy = @{@"value":@"CUSTOM", @"friends":@"ALL_FRIENDS"};
    
    NSMutableDictionary* params = @{@"message":message,
                                    @"privacy":[dictionary_to_JSON dictionaryToJSON:privacy],
                                    }.mutableCopy;
    
    //FBリクエストの作成
    FBRequest *request = [FBRequest requestWithGraphPath:@"me/feed"
                                              parameters:params
                                              HTTPMethod:@"POST"];
    
    
    //コネクションをセットしてすぐキャンセル→NSMutableURLRequestを生成するため???
    //ここはStack Overflowの受け売り
    FBRequestConnection *requestConnection = [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
    }];
    [requestConnection cancel];
    
    //リクエストの作成
    NSMutableURLRequest *urlRequest = requestConnection.urlRequest;
    
    //送信!
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        // Do your success callback.
        NSLog(@"success!");
        
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        // Do your failure callback.
        NSLog(@"fail!");
        NSLog(@"operation=%@",operation);
        NSLog(@"error=%@",error);
    }];
    

    //進捗状況の確認
    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long totalBytesWritten, long totalBytesExpectedToWrite) {
        NSLog(@"Sent %ld of %ld bytes", totalBytesWritten, totalBytesExpectedToWrite);
    }];
    
    [[NSOperationQueue mainQueue] addOperation:operation];

}

プライバシーの設定はJSON形式で埋め込む必要があるため何らかの方法でNSDictionary→JSONの変換をする必要があります。
ここではdictionaryToJSONというクラスメソッドで変換をするという想定で記述しています。
NSMutableURLRequestの設定部分はStack Overflowを参考にしました。

テキストだけじゃなくて画像を添付する場合は以下のように書き換えます。

画像添付の場合

    NSMutableDictionary* params = @{@"message":message,
                                    @"privacy":[dictionary_to_JSON dictionaryToJSON:privacy],
                                    @"picture":data,
                                    }.mutableCopy;

    //FBリクエストの作成
    FBRequest *request = [FBRequest requestWithGraphPath:@"me/photos"
                                              parameters:params
                                              HTTPMethod:@"POST"];

paramsのところにpictureを追加し、NSData形式の画像データを指定します。 また、requestのme/feedme/photosにかわります。

動画の添付の場合

    NSMutableDictionary* params = @{@"message":message,
                                    @"privacy":[dictionary_to_JSON dictionaryToJSON:privacy],
                                  @"movie.mp4":data,
                                      @"title":@"タイトル",
                                    }.mutableCopy;

    //FBリクエストの作成
    FBRequest *request = [FBRequest requestWithGraphPath:@"me/videos"
                                              parameters:params
                                              HTTPMethod:@"POST"];

動画の場合は同じくNSData形式でデータを渡すことには変わりないのですが、keyが動画のファイル名になるようです。
あとは、動画のタイトルが付加できます。
一方、requestの方はme/videosとなります。

facebookの資料としては本家のドキュメントのほか、こちらのサイトは日本語での解説なので分かりやすかったです。


  1. イントロダクション
  2. Twitterのアプリ登録
  3. Facebookのアプリ登録
  4. Parseの登録と設定
  5. Twitterアカウントでの認証
  6. Twitterのタイムライン投稿
  7. Facebookアカウントでの認証
  8. Facebookのフィード投稿