从 UIWebView 调用 javascript 函数

Posted

技术标签:

【中文标题】从 UIWebView 调用 javascript 函数【英文标题】:Calling javascript functions from UIWebView 【发布时间】:2013-03-14 22:13:07 【问题描述】:

我在时遇到了一些问题。

这是我的工作流程:

第 1 步:在 UIWebView 中加载网页

第 2 步:用户点击网页中的按钮,从而启动对应用程序功能的调用 -

window.location=("native-function-call:getSessionID:"+session);

第三步:位置变化被app函数拦截,并在app中设置sessionID——

-(BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

NSString *requestString = [[request URL] absoluteString];

if([requestString hasPrefix:@"native-function-call:"])

    NSArray *components = [requestString componentsSeparatedByString:@":"];
    NSString *function = [components objectAtIndex:1];
    if([function isEqualToString:@"getSessionID"])
    
        sessionID = [components objectAtIndex:2];
        [webView stringByEvaluatingjavascriptFromString:[NSString stringWithFormat:@"%@%@%@", @"generateToken(\"",sessionID,@"\")"]];
    
    if ([function isEqualToString:@"getTokenID"])
    
        tokenID = [components objectAtIndex:2];

        //do stuff to connect to the session with the token

        NSString *javaScriptRequest = [NSString stringWithFormat:@"%@%@%@", @"sendRequest(\"",sessionID,@"\")"];
        [webView stringByEvaluatingJavaScriptFromString:javaScriptRequest];
    
    return NO;

return YES;

第四步:sessionID设置后,调用javascript-generateToken(session)

第五步:在javascript函数中,generateToken,再次调用上面的函数,这样-

window.location="native-function-call:getTokenID:"+token;

第 6 步:根据上面的代码,将在 javascript 中创建的 tokenID 传递给应用程序。然后应用程序继续调用另一个函数,称为 sendRequest(session)。

第 6 步:生成通知并发送到另一个设备,其中包含上面的 sessionID。另一台设备收到通知,执行的函数是:

-(void) requestReceived:(NSNotification *) pushNotification

NSDictionary *notification = [pushNotification userInfo];
sessionID = [notification objectForKey:@"session"];
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@%@%@", @"generateToken(\"",sessionID,@"\")"]];

第 7 步:这是正在中断的步骤。根据上面的代码,我正在设置调试点,并且正在另一个设备上输入最后一个通知功能。但是,对 generateToken(session) 的 javascript 调用不起作用。位置更改的拦截永远不会发生,因此其他设备不会继续进行该过程。

关于为什么最后一个请求没有被发送到页面的任何想法,或者什么是破坏?谢谢。

【问题讨论】:

你说“第6步:生成通知并发送到另一台设备,其中包含上面的sessionID。另一台设备收到通知,执行的功能是:”是什么意思.您如何向另一台设备发送通知? 通过 APNS。我告诉服务器发送一个通知,另一台设备接收到带有包含 sessionID 的有效负载的通知。 【参考方案1】:

找出问题所在。所有对 window.location 的调用都被混淆了,有些没有执行。我通过将 javascript 分成不同的服务器端文件并分别调用每个文件而不是对同一个 webview 进行所有调用来解决了这个问题。

【讨论】:

以上是关于从 UIWebView 调用 javascript 函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ajax 从 UIWebView 调用 Objective C 函数

UIWebview/WKWebView javascript调用处理两个返回值?

如何在 iOS 7 的 UIWebView 中从 JavaScript 调用 Objective-C?

iOS:在 UIWebview 中使用 javascript 调用 obj-c 方法

从后台获取加载 UIWebView

WKWebview 的 javascript 调用返回 nil