Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Facebook好友请求对话框已停止在UIWebView上工作_Ios_Facebook - Fatal编程技术网

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

Ios Facebook好友请求对话框已停止在UIWebView上工作,ios,facebook,Ios,Facebook,我使用stackoverflow上的帖子在iPhone上实现了添加好友对话框: ,它是为Android实现的,但很容易转换为iPhone 它工作正常,直到几天前它停止工作,现在它给了我一个错误: HitMe发生错误。请稍后再试。 API错误代码:3 API错误描述:未知方法 错误消息:此显示类型不支持此方法 我试着在facebook路线图中搜索:但没有找到任何关于这一变化的内容,有没有人遇到过这个问题,或者知道在iPhone上实现“好友请求”对话框的其他方法 以下是我为实现“好友请求”对话框而对

我使用stackoverflow上的帖子在iPhone上实现了添加好友对话框:
,它是为Android实现的,但很容易转换为iPhone

它工作正常,直到几天前它停止工作,现在它给了我一个错误:

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

我试着在facebook路线图中搜索:但没有找到任何关于这一变化的内容,有没有人遇到过这个问题,或者知道在iPhone上实现“好友请求”对话框的其他方法

以下是我为实现“好友请求”对话框而对Facebook 2.0 sdk所做的更改:

在Facebook.m中的dialog:andParams:andDelegate:method中,我将原始代码替换为以下代码:

-(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];
-(void)对话框:(NSString*)操作
andParams:(NSMutableDictionary*)参数
andDelegate:(id)delegate{
[fbu对话框发布];
NSString*对话框URL;
if([操作IsequalString:kFriends])
{
dialogURL=[kDialogBaseURLForFriends stringByAppendingString:action];
}
其他的
{
dialogURL=[kDialogBaseURL stringByAppendingString:action];
}
if([操作IsequalString:kFriends])
{
[params setObject:@“弹出”forKey:@“显示”];
}
其他的
{
[params setObject:@“触摸”forKey:@“显示”];
}
[params setObject:kSDKVersion forKey:@“sdk”];
[params setObject:kRedirectURL forKey:@“重定向uri”];
if([操作isEqualToString:kLogin]){
[params setObject:@“用户代理”forKey:@“类型”];
_fbDialog=[[FBLoginDialog alloc]initWithURL:dialogURL LoginParms:params委托:self];
}否则{
[params setObject:_appidforkey:@“app_id”];
如果([self isSessionValid]){
[params setValue:[self.accessToken StringByReplacingPercents EscapeSusingEncoding:NSUTF8StringEncoding]
forKey:@“访问令牌”];
[如果需要,可自行扩展访问令牌];
}
//默认情况下,我们显示对话框,无摩擦的情况下可能有一个隐藏的视图
布尔隐形=否;
//应用程序请求的无摩擦处理
如果([action isEqualToString:kApprequests]){
//如果启用了无摩擦请求
if(自身是否无摩擦请求已启用){
//1.显示“不再为这些朋友显示此内容”复选框
//2.如果开发人员正在发送目标请求,则跳过加载屏幕
[params setValue:@“1”forKey:@“无摩擦”];
//3.请求成功url中编码的无摩擦收件人列表
[params setValue:@“1”forKey:@“get_frictionless_recipients”];
}
//如果为无摩擦请求启用了所有收件人,则设置为不可见
id fbid=[params objectForKey:@“to”];
如果(fbid!=零){
//如果值解析为json数组表达式,则以这种方式获取列表
SBJsonParser*parser=[[[SBJsonParser alloc]init]autorelease];
id fbids=[parser objectWithString:fbid];
如果(![FBID是类:[NSArray类]]){
//否则用逗号分隔(也处理单例)
fbid=[fbid组件由字符串分隔:@“,”];
}                
隐形=[自身摩擦减少矫正剂:FBID];
}
}
_fbDialog=[[fbDialog alloc]initWithURL:dialogURL
params:params
iView不可见:不可见
无摩擦设置:\ u无摩擦请求设置
代表:代表];
}
[fbu对话框显示];
}


其中kFriends是@“friends”,kDialogBaseURLForFriends是@”“

我在使用Facebook发送对话框时发现了同样的问题(https://www.facebook.com/dialog/send?....)API调用

在iOS和Android应用程序中运行数月的调用现在失败,API错误代码为:3,如上所述

我已经尝试完全忽略display=iframe,或者改为其他显示类型,如popup等。它仍然不起作用。网站上的文档仍然提到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上再次为我工作。虽然很难看,但它仍然有效(目前)。

在使用Facebook发送对话框时,我发现了同样的问题(https://www.facebook.com/dialog/send?....)API调用

在iOS和Android应用程序中运行数月的调用现在失败,API错误代码为:3,如上所述

我已经尝试完全忽略display=iframe,或者改为其他显示类型,如popup等。它仍然不起作用。网站上的文档仍然提到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上再次为我工作。它很难看,但(目前)还可以使用。

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

似乎重新开始工作,但现在要求我登录,而不管我添加到请求参数的有效访问令牌是什么,你知道如何处理吗?似乎重新开始工作,但现在要求我登录,而不管我添加到请求参数的有效访问令牌是什么,你知道怎么处理吗??