0

stackoverflowの投稿を使用してiPhoneに[友達を追加]ダイアログを実装しました
。Facebookの友達ダイアログは「不明なメソッド」エラーを返します。Android用に実装されていますが、iPhoneに簡単に変換できます。

数日前に機能しなくなり、エラーが発生するまでは正常に機能していました。

HitMeでエラーが発生しました。後でもう一度やり直してください。
APIエラーコード:3
APIエラーの説明:不明なメソッド
エラーメッセージ:このメソッドは、この表示タイプではサポートされていません

Facebookのロードマップで検索しようとしました:https ://developers.facebook.com/roadmap/変更についての言及が見つかりませんでした、誰かがこの問題を経験したか、iPhoneで「友達リクエスト」ダイアログを実装する別の方法を知っていましたか?

これは、「友達リクエスト」ダイアログを実装するためにFacebook2.0SDKに加えた変更です。

dialog:andParams:andDelegate:Facebook.mのメソッドで元のコードを次のコードに置き換えました。

-(void)dialog:(NSString *)action
 andParams:(NSMutableDictionary *)params
 andDelegate:(id <FBDialogDelegate>)delegate {

[_fbDialog release];

NSString *dialogURL;

if ([action isEqualToString:kFriends]) 
{
    dialogURL = [kDialogBaseURLForFriends stringByAppendingString:action];
}
else 
{
    dialogURL = [kDialogBaseURL stringByAppendingString:action];
}

if ([action isEqualToString:kFriends])
{
    [params setObject:@"popup" forKey:@"display"];
}
else 
{
    [params setObject:@"touch" forKey:@"display"];
}

[params setObject:kSDKVersion forKey:@"sdk"];
[params setObject:kRedirectURL forKey:@"redirect_uri"];

if ([action isEqualToString:kLogin]) {
    [params setObject:@"user_agent" forKey:@"type"];
    _fbDialog = [[FBLoginDialog alloc] initWithURL:dialogURL loginParams:params delegate:self];
} else {
    [params setObject:_appId forKey:@"app_id"];
    if ([self isSessionValid]) {
        [params setValue:[self.accessToken stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
                  forKey:@"access_token"];
        [self extendAccessTokenIfNeeded];
    }

    // by default we show dialogs, frictionless cases may have a hidden view
    BOOL invisible = NO;

    // frictionless handling for application requests
    if ([action isEqualToString:kApprequests]) {        
        // if frictionless requests are enabled
        if (self.isFrictionlessRequestsEnabled) {
            //  1. show the "Don't show this again for these friends" checkbox
            //  2. if the developer is sending a targeted request, then skip the loading screen
            [params setValue:@"1" forKey:@"frictionless"];  
            //  3. request the frictionless recipient list encoded in the success url
            [params setValue:@"1" forKey:@"get_frictionless_recipients"];
        }

        // set invisible if all recipients are enabled for frictionless requests
        id fbid = [params objectForKey:@"to"];
        if (fbid != nil) {
            // if value parses as a json array expression get the list that way
            SBJsonParser *parser = [[[SBJsonParser alloc] init] autorelease];
            id fbids = [parser objectWithString:fbid];
            if (![fbids isKindOfClass:[NSArray class]]) {
                // otherwise seperate by commas (handles the singleton case too)
                fbids = [fbid componentsSeparatedByString:@","];
            }                
            invisible = [self isFrictionlessEnabledForRecipients:fbids];             
        }
    }

    _fbDialog = [[FBDialog alloc] initWithURL:dialogURL
                                       params:params
                              isViewInvisible:invisible
                         frictionlessSettings:_frictionlessRequestSettings 
                                     delegate:delegate];
}

[_fbDialog show];

}

ここで、kFriendsは@ "friends"であり、kDialogBaseURLForFriendsは@ " https://facebook.com/dialog/ "

4

2 に答える 2

3

IOS6 で動作します。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if ([(NSMutableURLRequest *)request respondsToSelector:@selector(setValue:forHTTPHeaderField:)]) {
        [(NSMutableURLRequest *)request setValue:@" Safari/537.1" forHTTPHeaderField:@"User_Agent"];
    }
}
于 2012-11-02T16:07:10.507 に答える
2

Facebook 送信ダイアログ (https://www.facebook.com/dialog/send?....) API 呼び出しを使用すると、ここで同じ問題が発生します。

iOS および Android アプリで何ヶ月も正常に実行されていた呼び出しが、上記のような API エラー コード: 3 で失敗するようになりました。

display=iframe を完全に除外するか、ポップアップなどの他の表示タイプに変更しようとしましたが、まだ機能しません。http://developers.facebook.com/docs/reference/dialogs/のドキュメントでは、これらのタイプのダイアログの有効な使用例として iOS と Android について言及しています。デスクトップ ブラウザで同じ URL を試すと、問題なく動作します。

更新: 少なくとも Android で機能する回避策が見つかりました。webview コンテナーのユーザー エージェントを変更するだけです。

webView.getSettings().setUserAgentString("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1");

これにより、少なくともAndroidで送信ダイアログが再び機能します。それは醜いですが、うまくいきます(今のところ)。

于 2012-09-12T14:23:26.383 に答える