有时,当我在 Facebook iOS 登录流程完成后尝试将 JS 脚本注入 UIWebView 时,我的 iOS 应用程序在快速应用程序切换(从 Safari 到我的应用程序)期间冻结。
在 XCode 控制台中,我收到以下错误消息:
等待 10 秒后未能返回。主运行循环模式:kCFRunLoopDefaultMode...
有时应用程序不会被冻结,但错误消息仍然显示。
我通过在 1 秒间隔后运行 JS 注入代码来解决这个问题。我实现它如下:
在 FB 会话更改的回调中,我使用NSObject
'sperformSelector:withObject:afterDelay:
方法在 1 秒内调用了我的 JS 回调。这是我的代码示例:
/*
* Callback for session changes.
*/
- (void)sessionStateChanged:(FBSession *)session state:(FBSessionState) state error:(NSError *)error
{
switch (state) {
case FBSessionStateOpen:
if (!error) {
// We have a valid session
[self performSelector:@selector(jsCallback:) withObject:session afterDelay:1];
}
break;
// the rest of the method is omitted
}
- (void)jsCallback:(FBSession *)session {
UIWebView *webView = ...
NSString *jsScript = ...
[webView stringByEvaluatingJavaScriptFromString:jsScript];
}
它有效,但我担心它不是一个可靠的解决方案。例如,在某些情况下,1 秒可能不够。
任何想法如何以更可靠的方式实现相同的效果?