2 つのレベルで実装された facebook 機能と組み合わせて、webview で HTML コンテンツを表示する iOS アプリを開発しています。
- ネイティブ アプリ レベル - ios ネイティブ アプリ facebook sdk によるシングル サインオン (SSO) の実行 (つまり、アクセス トークンの取得)
- UI コンテンツ レベル - 取得したアクセス トークンは webview の JavaScript に渡され、UI 表示を処理します
したがって、私の問題は、SSO 呼び出しが成功した後、後続の javascript の呼び出しが失敗することです。より正確には、SSO が完了した後に facebook アプリ / safari がアプリに戻ると、javascript はポップアップ アラートを表示するはずです。ただし、アプリが返される (またはバックグラウンドから再開される) と、アラート ボックスは表示されませんが、画面が暗くなったときにポップアップを実行しようとしていることがわかります (通常のアラート ボックスが表示される前と同じように)。
ここまではアプリがフリーズしているように見えますが、iPhone のホームボタンを押してアプリに戻ると、ポップアップ アラートが表示されます。
すべての FB 関連のアクティビティを処理するシングルトン インスタンスを使用して facebookUtil クラスを作成しました。webView は実際には別の rootViewController クラスで開始され、facebookUtil インスタンスに渡されます。
RootViewController viewDidLoad メソッド内:
[[FacebookUtil instance] setWebView:(webView)];
FacebookUtil.h の内部
@interface FacebookUtil : NSObject<FBSessionDelegate,FBRequestDelegate>{
Facebook* _facebook;
UIWebView *webView;
}
@property(readonly) Facebook *facebook;
@property (nonatomic, retain) UIWebView *webView;
FacebookUtil.m の内部
- (void)fbDidLogin {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSLog(@"fbDidLogin facebook.accessToken: %@",_facebook.accessToken);
NSLog(@"fbDidLogin facebook.expirationDate: %@",_facebook.expirationDate);
[defaults setObject:[_facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[_facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
NSString *jsFullString = @"javascript:myFacebookProtocol({\"access_token\":\"BAAGPxqGDC7cBAOAUaf0jtAEXXXXXXlAAAA5QZD\",\"action\":\"getWallPost\",\"facebookId\":\"SomeTestingPage\"})";
NSLog(@"fbLoginAppActiveNotificationFired jsFullString hardcode-- %@",jsFullString);
[webView stringByEvaluatingJavaScriptFromString:jsFullString];
//dispatch_async(dispatch_get_main_queue(), ^{[webView stringByEvaluatingJavaScriptFromString:jsFullString]; });
}
getWallPost の Javascript 関数:
<script src="jquery-1.4.4.min.js" type="text/javascript"></script>
<script type="text/javascript">
function getWallPost(access_token,facebookId){
//document.write("Write after SSO");
alert("Alert after SSO");
}
私が試したことと私の推測:
- SSO の直後でない場合は、javascript を実行できます (アラートがポップアップ表示されます)。たとえば、facebookUtil の request:didLoad メソッドで stringByEvaluatingJavaScriptFromString を実行すると、javascript アラート ボックスがすぐにポップアップするシナリオがあります。
- SSO 直後に document.write("Write after SSO") でページに何かを表示することができます。
- これは、アプリが戻ったときに webview が完全に再開されていない (または準備ができていない) ことに関連しているのか、または FB SDK によって行われた SSO メカニズムのように見えるため、メイン UI スレッドで (fbDidLogin メソッドで) webview が実行されていないことに関連しているのかどうかを考えていました。新しいスレッドで行われます。
私はグーグルでスタックオーバーフローの他の投稿を見てきましたが、私のシナリオはあまり一般的ではないようです。私は今アイデアを使い果たしています.誰かが私のためにこれについていくつかの光を共有できることを願っています.
前もって感謝します。