gpt4 book ai didi

iphone - UIWebView shouldStartLoadWithRequest 仅在从内部调用模态视图时触发一次

转载 作者:行者123 更新时间:2023-12-01 16:49:11 25 4
gpt4 key购买 nike

我的应用程序的一部分是用 JS 编写的,并在 WebView 中运行。我正在使用 UIWebView shouldStartLoadWithRequest 方法来捕获 http 请求,作为 JS 和 obj-c 之间通信的一种方式。这很好用,直到我尝试从 shouldStartLoadWithRequest 方法内部通过我的 webview 加载模态视图 Controller 。一旦发生这种情况,就不再调用 shouldStartLoadWithRequest。有时我需要关闭这个模态视图 Controller 并返回到 webview 并做一些事情,然后重新呈现模态 Controller 。模态 Controller 第一次出现就好了,然后我将其关闭并尝试通过从 javascript 导航到 URL 再次呈现它,它不再会出现。 shouldStartLoadWithRequest 中的 NSLogs 永远不会运行。

在我的javascript中,我做了这样的事情:

 window.location='myapp:whateverMethod';

objective-c 代码如下所示:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *requestString = [[request URL] absoluteString];
NSLog(@"REQUEST URL: %@", requestString);
if([requestString hasPrefix:@"myapp:"]) {
NSArray *components = [requestString componentsSeparatedByString:@":"];
NSString *function = [components objectAtIndex:1];
if([self respondsToSelector:NSSelectorFromString(function)]) {
[self performSelector:NSSelectorFromString(function)];
}
return NO;
}
return YES;
}

-(void) whateverMethod {
NSLog(@"whateverMethod called!");
// This is a quick way to grab my view controller from the storyboard, so assume it exists
UIViewController *splash = [self.storyboard instantiateViewControllerWithIdentifier:@"splashViewController"];
[self presentModalViewController:splash animated:NO];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
[self dismissModalViewController:splash animated:NO];
});
}

此时我的 webview 仍然可见。我在我的 web 应用程序中从一个页面导航到另一个页面,并且所有 javascript 在其中都运行良好,但是不再调用 webview 的“shouldStartLoadWithRequest”委托(delegate)方法。我不知道为什么。有没有人有任何想法?

最佳答案

我注意到 Cordova不设置 window.location 属性。相反,它有两个选项:它要么创建一个 iframe 并将 iframe 的 src 设置为该 url,要么它创建一个 XMLHttpRequest 对象,例如在 iOSExec() 函数中:

    if (bridgeMode) {
execXhr = execXhr || new XMLHttpRequest();
// Changeing this to a GET will make the XHR reach the URIProtocol on 4.2.
// For some reason it still doesn't work though...
execXhr.open('HEAD', "file:///!gap_exec", true);
execXhr.setRequestHeader('vc', cordova.iOSVCAddr);
if (shouldBundleCommandJson()) {
execXhr.setRequestHeader('cmds', nativecomm());
}
execXhr.send(null);
} else {
execIframe = execIframe || createExecIframe();
execIframe.src = "gap://ready";
}

话虽如此,使用 Cordova 之类的东西可能会有所帮助。而不是试图自己滚动它(即使它只是嵌入他们的 View Controller ),因为他们处理了很多与 webview 委托(delegate)有关的问题。

关于iphone - UIWebView shouldStartLoadWithRequest 仅在从内部调用模态视图时触发一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17627838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com