4

我正在加载一个本地 html 页面,并在 shouldStartLoadWithRequest: 中使用以下 url:

... /Library/Application%20Support/CDS/%3Fpid=27ce1ef8-c75e-403b-aea1-db1ae31e05cc/...

在该页面中,如果用户单击链接以转到外部网站,则他们单击后退按钮,我的代码将处理它:

if ([self.webView canGoBack])
    [self.webView goBack];

但是,当由于调用 [self.webView goBack] 而再次调用 shouldStartLoadWithRequest: 时,传递给 shouldStartLoadWithRequest: 的 URL 已更改为:

`... /Library/Application%20Support/CDS/?pid=27ce1ef8-c75e-403b-aea1-db1ae31e05cc/..`.

即操作系统已将 URL 中的“%3F”更改为“?”。

我从 shouldStartLoadWithRequest 中返回 YES:但由于“%3f”变成“?” 结果是 didFailLoadWithError: 被 WebKitErrorDomain 102 调用并且页面无法加载。

该文件实际上有 ? 在其名称中,但在构建传递给 UIWebView:loadRequest: 的 NSURL 对象的过程中,是 iOS 系统调用将其转换为 %3F:如下

NSURL *fullURL = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory                                                                                 inDomain:NSUserDomainMask
                                                                          appropriateForURL:nil 
                                                                                           create: YES
                                                                                               error:&err];

fullURL = [fullURL URLByAppendingPathComponent:folderLocation isDirectory:YES];
fullRUL = [fullURL URLByAppendingPathComponent: pageToLoad isDirectory:NO];
NSURLRequest *requestObj = [NSURLRequest requestWithURL: fullURL];      
[self.webView loadRequest:requestObj];

folderLocation 是一个包含 ? 的 NSString,对 URLByAppendingPathComponent 的调用会自动将其转换为 %3F,如果没有该转换,页面加载将失败。

有人见过这个吗?

4

3 回答 3

1

查询参数必须使用 relativeToURL 方法添加。尝试以下代码;

NSURL *baseUrl = [self.baseURL URLByAppendingPathComponent:[NSString stringWithFormat:@"/api_url"]];

NSString *urlString = [[NSString stringWithFormat:@"?param1=%@&param2=%@", param1, param2] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL *url = [NSURL URLWithString:urlString relativeToURL:baseUrl];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
于 2015-04-11T20:22:56.573 回答
1

我没有使用文件网址,但我遇到了同样的问题。看来这是最好的处理方式。

NSString *newURLString = [[origurl absoluteString] stringByAppendingPathComponent:appendedString];
NSURL *url = [NSURL URLWithString:newURLString];
于 2013-07-05T02:39:54.780 回答
0

我以这种方式解决了同样的问题:

let baseRequest = "yourURLString"

let URLRequest = NSMutableURLRequest(URL: NSURL(string: baseRequest)!)

最重要的是将 URLRequest 作为由 String 创建的 URL 传递。

于 2016-06-30T16:04:51.063 回答