0

有时,当我在 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 秒可能不够。

任何想法如何以更可靠的方式实现相同的效果?

4

1 回答 1

0

好吧,事实证明这很简单。我使用了UIApplicationState,像这样:

/*
 * 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
        UIApplicationState appState = [[UIApplication sharedApplication] applicationState];

        NSLog(@"We have a valid session, app state: %u",appState);

        if (UIApplicationStateActive == appState){
            [self jsCallback:session];
        } else {
            self.fbSessionJustOpened = YES;
        }
      }
    break;

    // the rest of the method is omitted
}

In方法UIApplicationDelegateapplicationDidBecomeActive

- (void)applicationDidBecomeActive:(UIApplication *)application
{  
    if (self.isFbSessionJustOpened){
        self.fbSessionJustOpened = NO; // reset flag to NO        
        [self jsCallback:[FBSession activeSession]];
    }
}
于 2012-11-19T13:52:03.543 回答