1

我正在开发一个 iOS 应用程序,它使用 webview 显示 HTML 内容,并结合在两个级别实现的 facebook 功能。

  1. 本机应用程序级别 - 通过 ios 本机应用程序 facebook sdk 执行单点登录 (SSO)(即获取访问令牌)
  2. 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");

    }

我尝试过的和我的猜测:

  1. 如果不是在 SSO 之后,它能够运行 javascript(即弹出警报)。例如,我有一个场景,我在 facebookUtil 的 request:didLoad 方法中运行 stringByEvaluatingJavaScriptFromString,并且 javascript 警告框直接弹出。
  2. 它能够在 SSO 之后使用 document.write("Write after SSO") 在页面上显示某些内容。
  3. 我在想这是否与应用程序返回时 webview 没有完全恢复(或准备好)有关,或者 webview(在 fbDidLogin 方法中)没有在主 UI 线程中运行,因为似乎是由 FB SDK 完成的 SSO 机制在一个新线程中完成。

我一直在谷歌搜索并查看 stackoverflow 中的其他帖子,但似乎我的情况并不常见。我现在的想法不多了,希望有人可以为我分享一些信息!

提前致谢。

4

0 回答 0