我正在开发一个 iOS 应用程序,它使用 webview 显示 HTML 内容,并结合在两个级别实现的 facebook 功能。
- 本机应用程序级别 - 通过 ios 本机应用程序 facebook sdk 执行单点登录 (SSO)(即获取访问令牌)
- UI 内容级别 - 获取的访问令牌被传递给 webview 的 javascript 以处理 UI 显示
所以我的问题是SSO调用成功后,后续的javascript调用失败。更准确地说,当 facebook 应用程序 / Safari 在 SSO 完成后返回我的应用程序时,我的 javascript 应该显示一个弹出警报。但是,当我的应用程序返回(或从后台恢复)时,不会显示警报框,但我可以看到它正在尝试在屏幕变暗时弹出窗口(就像显示正常警报框之前的方式一样)。
到目前为止,该应用程序看起来已冻结,但是当我尝试按下 iphone 主页按钮然后返回我的应用程序时,会显示弹出警报。
我已经建立了一个带有单例实例的 facebookUtil 类来处理所有与 FB 相关的活动,而 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 没有完全恢复(或准备好)有关,或者 webview(在 fbDidLogin 方法中)没有在主 UI 线程中运行,因为似乎是由 FB SDK 完成的 SSO 机制在一个新线程中完成。
我一直在谷歌搜索并查看 stackoverflow 中的其他帖子,但似乎我的情况并不常见。我现在的想法不多了,希望有人可以为我分享一些信息!
提前致谢。