我在从UIWebView调用javascript函数时遇到了一些麻烦。
这是我的工作流程:
第1步:在UIWebView中加载网页
步骤2:用户点击网页中的按钮,从而启动对应用功能的调用 -
window.location=("native-function-call:getSessionID:"+session);
步骤3:应用程序功能拦截位置更改,并在应用程序中设置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;
}
步骤4:设置sessionID后,调用javascript - generateToken(session)
步骤5:在javascript函数generateToken中,再次调用上面的函数,因此 -
window.location="native-function-call:getTokenID:"+token;
步骤6:根据上面的代码,在javascript中创建的tokenID被传递给app。该应用程序然后继续调用另一个函数,称为sendRequest(会话)。
步骤6:生成通知并发送到另一个包含上述sessionID的设备。另一个设备获取通知,执行的功能是:
-(void) requestReceived:(NSNotification *) pushNotification
{
NSDictionary *notification = [pushNotification userInfo];
sessionID = [notification objectForKey:@"session"];
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@%@%@", @"generateToken(\"",sessionID,@"\")"]];
}
第7步:这是打破的步骤。根据上面的代码,我正在设置调试点,并在另一台设备上输入最后一个通知功能。但是,对generateToken(session)的javascript调用不起作用。位置变化的截距永远不会发生,因此其他设备不会继续进行该过程。
关于为什么最后一个请求没有被发送到页面,或者什么是破坏的任何想法?谢谢。
答案 0 :(得分:0)
弄清楚出了什么问题。对window.location的所有调用都混淆了,有些没有执行。我通过将javascript分成不同的服务器端文件并分别调用每个文件而不是对同一个webview进行所有调用来解决问题。