web-dev-qa-db-ja.com

Facebook iOS SDKを使用してユーザーの壁に写真を投稿する

カメラからユーザーのFacebookウォールに写真をアップロードしようとしています。正しい戦略が何であるかは完全にはわかりませんが、読んでみると、写真をアルバムにアップロードしてから、誰かがそのアルバム/写真へのリンクを壁に投稿することです。理想的にはこれには対話が含まれますが、私が言うことができることからそれは不可能です。

写真をアルバムにアップロードして、その写真のIDを取得することに成功しましたが、その後どうすればよいかわかりません。

誰かがこれを達成するための簡単なコードを提供できますか?

おまけの質問:写真をアプリケーションの壁にも投稿できますか(または代わりに)。

編集:グラフAPIが望ましいですが、この段階で機能するものは何でも良いです。

25
Ben Williams

FBに写真を投稿し、投稿がユーザーのウォール/ストリームに配信されることを保証することで、何をしたいかが明確になります。

残念ながら、いくつかの点で問題があります。

FBグラフAPIは、写真をアルバムに投稿するか、直接壁に投稿して、Web上のどこかに既に存在する写真にリンクすることのみを許可するようです。最初のケースでは、ストリームに投稿が作成される可能性がありますが、FBは、ユーザーのストリームが攻撃されないように、複数の投稿を何らかの方法で統合するように見えます。このメカニズムは、私が目にしたどこにも文書化されていません。

2番目のケースでは、アルバムに投稿せずに、アルバムへのリンクを明示的に投稿すると思います。元のアルバム投稿にパラメータ「no_story」を値1で追加し、明示的な投稿の準備中に作成される可能性がある壁投稿を抑制できます。ただし、FBにはしばらくの間、新しく投稿された画像のソースURLがありません。また、FBは独自のコンテンツ配信ネットワークを含むURLを好きではないようで、エラーを返します。ステータスの更新をストリームに入れて投稿について話していると思うかもしれませんが、グラフAPIは、スパムを防ぐために、アプリごとに1日あたり25のそのような直接フィード投稿に制限されています。

1つの解決策は、Flickrなどに投稿し、画像のURLを取得して、壁に投稿することです。 FBの推奨される解決策は、モバイルツールキットの一部であるFBダイアログを使用することです。OAuth画面のように、本質的に小さなWebページです。

個人的には、上記のようにアルバムに投稿するだけで、ユーザーにどのように通知するかというFBのアイデアを取り入れることを計画しています。続行する方法を知りたい。

16
giff

私はこれを3つのステップで行いました

アルバムに写真を1枚投稿(imageIDを返します)

2 imageIDを使用してimageIDのメタデータを要求する

3「リンク」フィールド(「ソース」フィールドではない)をユーザーの壁への投稿の画像へのリンクとして使用します

欠点は、壁に2つの投稿があることです。1つは画像用、もう1つは実際の投稿用です。ウォールポストも表示されずに、写真をアルバムに投稿する方法はまだわかりません(理想的には、2番目の投稿が表示されるだけです)。

ステップ1:

- (void) postImageToFacebook {

    appDelegate = (ScorecardAppDelegate *)[[UIApplication sharedApplication] delegate];

    currentAPICall = kAPIGraphUserPhotosPost;

    UIImage *imgSource = {insert your image here};
    NSString *strMessage = @"This is the photo caption";
    NSMutableDictionary* photosParams = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                         imgSource,@"source",
                                         strMessage,@"message",
                                         nil];

    [appDelegate.facebook requestWithGraphPath:@"me/photos"
                                     andParams:photosParams
                                 andHttpMethod:@"POST"
                                   andDelegate:self];     

    // after image is posted, get URL for image and then start feed dialog
    // this is done from FBRequestDelegate method
}

ステップ2(kAPIGraphUserPhotosPost)およびステップ3(kAPIGraphPhotoData):

- (void)request:(FBRequest *)request didLoad:(id)result {

    if ([result isKindOfClass:[NSArray class]] && ([result count] > 0)) {
        result = [result objectAtIndex:0];
    }

    switch (currentAPICall) {
        case kAPIGraphPhotoData: // step 3
        {
            // Facebook doesn't allow linking to images on fbcdn.net.  So for now use default thumb stored on Picasa
            NSString *thumbURL = kDefaultThumbURL;
            NSString *imageLink = [NSString stringWithFormat:[result objectForKey:@"link"]];    

            currentAPICall = kDialogFeedUser;
            appDelegate = (ScorecardAppDelegate *)[[UIApplication sharedApplication] delegate];


            NSMutableDictionary* dialogParams = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                     kAppId, @"app_id",
                                     imageLink, @"link",
                                     thumbURL, @"picture",
                                     @"Just Played Wizard etc etc", @"name",
                                     nil];

            [appDelegate.facebook dialog:@"feed" 
                               andParams:dialogParams 
                             andDelegate:self];


            break;
        }
        case kAPIGraphUserPhotosPost: // step 2
        {

            NSString *imageID = [NSString stringWithFormat:[result objectForKey:@"id"]];            
            NSLog(@"id of uploaded screen image %@",imageID);

            currentAPICall = kAPIGraphPhotoData;
            appDelegate = (Scorecard4AppDelegate *)[[UIApplication sharedApplication] delegate];

            [appDelegate.facebook requestWithGraphPath:imageID
                                           andDelegate:self];
            break;
        }
    }
}

私はコードを変更して、Facebookのものだけを圧縮して表示しました。投稿が成功したかどうかを確認したい場合は、次のようにする必要があります。

- (void)dialogDidComplete:(FBDialog *)dialog {
    switch (currentAPICall) {
        case kDialogFeedUser:
        {
            NSLog(@"Feed published successfully.");
            break;
        }
    }
}

facebook post

Facebook投稿の青いテキストは、ステップ3の「name」パラメーターに入力したものです。Facebookの青いテキストをクリックすると、ステップ1でFacebookのアルバムに投稿された写真に移動します(Facebookはデフォルトのアルバムを作成しますアルバムを指定しない場合のアプリの場合)。私のアプリの場合、それはスコアカードのフルサイズの画像です(ただし、カメラなどの任意の画像を使用できます)。残念ながら、サムイメージをライブリンクにする方法を理解することはできませんでしたが、読みにくいため、私の場合はデフォルトのサムが機能します。 Facebookの投稿(黒色のフォント)で「今年の最初のゲーム...」と書かれた部分は、ユーザーによって入力されます。

18
Eric D'Souza

投稿してIDを取得しているため、どの部分が機能していないのかわかりませんが、誰かがGoogle経由でここにアクセスした場合に備えて、私がすばやく汚い方法で行ったことを以下に示します。

これはHTTP POST関数であり、ファイルのバイナリデータはマルチパートMIMEとして表示されます。

私は利用可能なASIHTTPRequestライブラリの大ファンです ここ

**更新:2012年10月22日**-過去数か月の間に、コード内のASIHTTPRequestがAFNetworkingに置き換わりました。 GitHubで利用可能 ここ

Facebookのドキュメントは、一部が不完全であったり一部が間違っている可能性があるために混乱しています。キャプションなどに設定する投稿の値を正確に把握するために、髪を切り裂く可能性がありますが、このレシピは写真をアルバムに入れ、それをフィードに入れます。

Facebook OAuthのものを基本的な方法で設定する必要があります-たまたまアプリのデリゲートで設定したので、そこからFacebookオブジェクトを取得してアクセストークンを取得しました。次のように、認証時に「publish_stream」権限を要求してください。

[facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:self];

これにより、「YOUR_APP_NAME Photos」というアルバムが作成または追加され、ユーザーのフィードに表示されます。そのアルバムのIDを取得し、URLを http://graph.facebook.com/THE_ID_OF_THE_ALBUM/photos に変更することで、「ウォール」アルバムを含む任意のアルバムに置くことができます。

基本的な方法は次のとおりです。

-(void) postImageToFB:(UIImage *) image
{

    NSData* imageData = UIImageJPEGRepresentation(image, 90);
    Facebook* fb = [(uploadPicAppDelegate *)[[UIApplication sharedApplication] delegate] facebook   ];


    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"https://graph.facebook.com/me/photos"]];
    [request addPostValue:[fb accessToken] forKey:@"access_token"];
    [request addPostValue:@"image message" forKey:@"message"];
    [request addData:imageData forKey:@"source"];

    [request setDelegate:self];
    [request startAsynchronous];  
}

Facebook提供のiOSライブラリを使用すると、次のようになります。

-(void) postImageToFB:(UIImage *) image
{

    NSData* imageData = UIImageJPEGRepresentation(image, 90);
    Facebook* fb = [(uploadPicAppDelegate *)[[UIApplication sharedApplication] delegate] facebook   ];

    NSMutableDictionary * params = [NSMutableDictionary dictionaryWithObjectsAndKeys:[fb accessToken],@"access_token",
                                    @"message text", @"message",
                                    imageData, @"source",
                                    nil];
    [fb requestWithGraphPath:@"me/photos" 
                   andParams:params 
               andHttpMethod:@"POST" 
                 andDelegate:self];


}
9
giff
3
Eneko Alonso

私はこれに出会うまで、最新のAPIで機能するソリューションを広範囲にわたって検索しました。

http://xcodenoobies.blogspot.co.uk/2012/09/how-to-upload-photo-and-update-status.html

私が出会った中でこれまでで最も明確なソリューションはシンプルで、最新のAPIで動作します。