繁体   English   中英

Facebook好友请求对话框在UIWebView上停止工作

[英]Facebook friend request dialog stopped working on UIWebView

我使用stackoverflow上的帖子在iPhone上实现了“添加好友”对话框:
Facebook好友对话框返回“未知方法”错误 ,已为Android实现,但易于转换为iPhone。

直到几天前它停止工作时,它的工作情况还不错,现在却抛出一个错误:

HitMe发生错误。 请稍后再试。
API错误代码:3
API错误描述:未知方法
错误消息:此显示类型不支持此方法

我尝试在Facebook路线图中进行搜索: https : //developers.facebook.com/roadmap/,但找不到任何更改提及,有人遇到此问题或知道另一种在iPhone上实现“好友请求”对话框的方法?

这是我对Facebook 2.0 sdk进行的更改,以实现“好友请求”对话框:

在facebook.m中的dialog:andParams:andDelegate:方法中,我用以下代码替换了原始代码:

-(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/

它适用于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"];
    }
}

使用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容器的useragent:

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上再次对我有效。 这很丑陋,但是(目前)有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM