0

Facebook iOSのログインフローが完了した直後にJSスクリプトをUIWebViewに挿入しようとすると、高速アプリ切り替え(Safariからアプリへ)中にiOSアプリがフリーズすることがあります。
XCodeコンソールで、次のエラーメッセージが表示されます。

10秒待っても戻れませんでした。メイン実行ループモード:kCFRunLoopDefaultMode .. ..

アプリがフリーズしない場合もありますが、エラーメッセージはまったく同じように表示されます。

これを回避するには、1秒間隔でJSインジェクションコードを実行しました。私はそれを次のように実装しました:

NSObjectFBセッション変更のコールバックでは、のメソッドを使用して1秒でJSコールバックを呼び出しますperformSelector:withObject:afterDelay:。これが私のコードサンプルです:

/*
 * 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
}

UIApplicationDelegateのメソッドapplicationDidBecomeActive:

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