Facebook iOSのログインフローが完了した直後にJSスクリプトをUIWebViewに挿入しようとすると、高速アプリ切り替え(Safariからアプリへ)中にiOSアプリがフリーズすることがあります。
XCodeコンソールで、次のエラーメッセージが表示されます。
10秒待っても戻れませんでした。メイン実行ループモード:kCFRunLoopDefaultMode .. ..
アプリがフリーズしない場合もありますが、エラーメッセージはまったく同じように表示されます。
これを回避するには、1秒間隔でJSインジェクションコードを実行しました。私はそれを次のように実装しました:
NSObject
FBセッション変更のコールバックでは、のメソッドを使用して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秒では不十分な場合があります。
より信頼性の高い方法で同じ効果を達成する方法はありますか?