【问题标题】:First dialog after authenticating fails immediately and closes dialog验证后的第一个对话框立即失败并关闭对话框
【发布时间】:2011-12-21 13:58:54
【问题描述】:

我在 iOS 5 上使用最新的 Facebook SDK。我可以使用 SSO 成功验证用户身份,然后尝试分享如下链接:

NSString *appId = [[[NSBundle mainBundle] infoDictionary] 
                                          objectForKey:TSFacebookAppID];

NSMutableDictionary* params = 
[NSMutableDictionary dictionaryWithObjectsAndKeys:
                          appId,                @"app_id",
                          [url absoluteString], @"link
                          title,                @"caption",
                          body,                 @"description",
                          nil];

[facebook dialog:@"feed" andParams:params andDelegate:self];

第一次尝试时,对话框出现并立即关闭,调用 dialog:didFailWithError:error 委托方法。错误是:

Error Domain=NSURLErrorDomain Code=-999 "操作无法完成。(NSURLErrorDomain error -999.)" UserInfo=0x98f2ab0 {NSErrorFailingURLKey=https://m.facebook.com/dialog/feed?link=http%3A%2F%2Fwww.thescore.com%2Fhome%2Farticles%2F184248&description=Nadal%20pulls%20out%20of%20Paris%20to%20focus%20on%20ATP%20finals&access_token=BAABw00HZB06cBALT57lZCM24N4EOtPpOQeCgl7oLUvbHFR0ZAlwgAbPHQ7HANmlBE0aUKVNDmWNYsEqB0wXq28vm4D18T5hLTVDK3x2WjnVjgIVl75RPoOszSB21f4ZD&caption=Article%20from%20ScoreMobile%20for%20iPhone&app_id=124052647629735&redirect_uri=fbconnect%3A%2F%2Fsuccess&sdk=2&display=touch, NSErrorFailingURLStringKey=https://m.facebook.com/dialog/feed?link=http%3A%2F%2Fwww.thescore.com%2Fhome%2Farticles%2F184248&description=Nadal%20pulls%20out%20of%20Paris%20to%20focus%20on%20ATP%20finals&access_token=BAABw00HZB06cBALT57lZCM24N4EOtPpOQeCgl7oLUvbHFR0ZAlwgAbPHQ7HANmlBE0aUKVNDmWNYsEqB0wXq28vm4D18T5hLTVDK3x2WjnVjgIVl75RPoOszSB21f4ZD&caption=Article%20from%20ScoreMobile%20for%20iPhone&app_id=124052647629735&redirect_uri=fbconnect%3A%2F%2Fsuccess&sdk=2&display=touch}

但是,后续共享链接的尝试工作正常。

【问题讨论】:

  • 是的!我看到 100% 一样的东西。新的实现,iOS5。非常相同的错误。随后的尝试工作正常。在应用程序重新启动时,尝试工作正常,因为会话仍然有效。但是,如果我删除应用程序并重新安装,第一次尝试再次失败(显然是由 SSO 身份验证过程以某种方式引起的?)
  • iOS 7 也是如此!除了每次认证都失败

标签: dialog facebook-ios-sdk


【解决方案1】:

只是给大家的更新,它终于分配给 Facebook 的某个人:https://developers.facebook.com/bugs/168127053284477 - 希望它会尽快修复。

同时,有人在 github 上发送了一个 pull request 并进行了修复:https://github.com/facebook/facebook-ios-sdk/pull/436

希望它对某人有所帮助,因为我仍然面临同样的错误..

【讨论】:

  • 截至 2012 年 9 月 10 日,最新的 facebook-ios-sdk 中仍未修复此错误。我必须切换到旧版本(facebook iphone sdk)才能使这个基本功能正常工作。为什么他们必须破坏核心功能?
【解决方案2】:

在尝试打开 facebook 帖子窗口时,我偶尔也会收到 -999 NSURLDomainError。我采取了忽略错误代码的策略,正如高级在 cmets 中提到的那样。

我对这个修复感觉不那么糟糕的原因是 FBLoginDialog 实际上已经忽略了这个错误。查看github中的代码:

https://github.com/facebook/facebook-ios-sdk/blob/master/src/FBLoginDialog.m#L85

具体来说,这是我的 webView:didFailLoadWithError 方法现在在 FBDialog.m 中的样子:

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
// 102 == WebKitErrorFrameLoadInterruptedByPolicyChange
NSLog(@"FBDialog webView didFailLoadWithError:%@ %d",error.domain,error.code);
if ([error.domain isEqualToString:@"NSURLErrorDomain"] && error.code == -999)
    return;

if ([error.domain isEqualToString:@"WebKitErrorDomain"] && error.code == 102)
    return;

[self dismissWithError:error animated:YES];
}

【讨论】:

    【解决方案3】:

    在 FBDialog.m 中,改变这个:

    UIWindow* window = [UIApplication sharedApplication].keyWindow;
    if (!window) {
        window = [[UIApplication sharedApplication].windows objectAtIndex:0];
    }
    

    到这里:

    UIWindow* window = [[UIApplication sharedApplication].windows objectAtIndex:0];
    

    问题解决了!至少对我来说。

    【讨论】:

    • 我认为这是一个不同的问题。我在另一个线程上看到了这个答案,并且已经尝试过没有效果。我们在这里看到的错误是来自 Facebook 的服务器的 webview 渲染错误(请参阅原始发布者发布的日志中的错误)。嗯,你是原始海报。好奇。
    • 我通过将 FBDialog.m 的第 413 行更改为: if (!(([error.domain isEqualToString:@"WebKitErrorDomain"] && error.code == 102) || 错误。代码 == -999)),现在它可以工作了。
    • 我猜它从来没有工作过——你只是没有看到问题,因为你已经登录了 Facebook。在我的测试中,只有在首次登录时才会出现问题。
    • 我测试得很彻底;我有一个偷偷摸摸的怀疑,这是一个竞争条件。当我尝试启动对话框时,我的应用程序屏幕上有一个 UIWebView,然后 Facebook 使用 UIWebView 显示它的对话框,所以它们可能存在冲突。
    • 我指的是您上面的 UIWindow 更改,而不是您对 error.code == -999 的测试。我也在考虑某种竞赛,或者 iPhone 应用程序正在尝试在 facebook 服务器上的登录完成之前显示信息或其他什么,但这就是为什么我延迟测试它但仍然没有成功的原因。我还没有尝试过你的 -999 过滤器。
    【解决方案4】:

    在 facebook 修补他们的 SDK 之前,我没有找到比这个更好的解决方案:

    - (void)dialog:(FBDialog *)dialog didFailWithError:(NSError *)error{
    
        if([error code] == -999){
            DLog(@"Error -999 found re-open webview");
    
            [facebook dialog:@"apprequests"
                   andParams:_dialogParams
                 andDelegate:self];
    
        }else{
            DLog(@"Error opening facebook dialog : %@", [error description]);
        }
    }
    

    【讨论】:

    • 这种方法似乎不起作用,因为它再次将我重定向到相同的登录对话框,因此它最终陷入无限循环
    【解决方案5】:

    3.0 SDK 已经解决了这个问题,所以我将结束这个问题。解决方案:将SDK升级到3.0。

    【讨论】:

      【解决方案6】:

      我尽可能在 dialog.m 中追溯它,即第 414 行--dialog.m 正在为 web 视图中的对话框发送 URLRequest,但 web 视图显然返回错误来自 Facebook 的服务器。

      我尝试在身份验证后延迟 10 秒后调用我的 [facebook dialog:@"feed"...] 代码,但没有骰子——同样的错误。

      然后只是为了笑,我从 -dialog:didFailWithError... 中调用了我的提要代码,然后检查了它是否是错误 -999。从那个电话开始,它工作得很好。 ????

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-02
        • 1970-01-01
        • 2020-03-23
        • 1970-01-01
        • 2011-09-30
        • 2012-09-25
        • 2013-07-27
        相关资源
        最近更新 更多