0

我有一个包含“#”的 URL 字符串。例如,

NSString* urlStr = @"https://developer.apple.com/library/ios/#/legacy/library/documentation/Xcode/Conceptual/ios_development_workflow/10-Configuring_Development_and_Distribution_Assets/identities_and_devices.html#//apple_ref/doc/uid/TP40007959-CH4-SW";
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL* url = [NSURL URLWithString:urlStr];
[[self.webViewSample mainFrame] loadRequest:[NSURLRequest requestWithURL:url]];

使用 encoding 后,“#”被替换为“%23”。如果不使用 encoding,则 NSURL 将为 nil。我的问题是 webview 加载了与 Browser 不同的错误网页。如何处理这个 url 字符串以便我可以加载正确的网页?

4

4 回答 4

3
NSString* urlStr = @"https://developer.apple.com/library/ios/#/legacy/library/documentation/Xcode/Conceptual/ios_development_workflow/10-Configuring_Development_and_Distribution_Assets/identities_and_devices.html#//apple_ref/doc/uid/TP40007959-CH4-SW";
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL* url = [NSURL URLWithString:urlStr];

使用编码后,将“#”替换为“%23”。

嗯,是的。这就是你告诉它要做的事情。

如果你不想那样,那就不要那样做。

如果您不使用编码,则 NSURL 将为 nil。

那是因为有两个#,所以你的网址是无效的。甚至 NSURL(对狡猾的 URL 非常宽容)拒绝它也是有道理的。

取出第一个,也只有第一个,#:

urlStr = [urlStr stringByReplacingOccurrencesOfString:@"/#"
    withString:@""];

(这种方法有点脆弱;您可以通过找到第一个匹配的范围然后仅在该范围内替换来使其更健壮。)

现在你的 URL 是有效的,所以 NSURL 不会有问题。

于 2013-05-02T20:11:26.303 回答
2

试试这样

替换它就可以#/#

UIWebView *web=[[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
    NSString* urlStr = @"https://developer.apple.com/library/ios//#/legacy/library/documentation/Xcode/Conceptual/ios_development_workflow/10-Configuring_Development_and_Distribution_Assets/identities_and_devices.html/#//apple_ref/doc/uid/TP40007959-CH4-SW";
    urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL* url = [NSURL URLWithString:urlStr];
    [web loadRequest:[NSURLRequest requestWithURL:url]];
    [self.view addSubview:web];

在此处输入图像描述

于 2013-05-02T11:08:09.917 回答
2

所以我认为从你现在的问题来看,根本问题是 Apple 的文档使用了一些相当奇怪的 URL。它们包含多个#字符,这在技术上对 URL 无效。第一个是有效的(并且很重要);任何其他人都应该逃脱。

我认为 Safari 能够处理这个问题,因为它不仅仅是显示/使用原始 URL 字符串。迄今为止我发现的最佳解决方案是移交给WebView' 粘贴板处理,如下所示:

- (NSURL *)URLFromString:(NSString *)string;
{
    static NSPasteboard *pboard;
    if (!pboard) pboard = [[NSPasteboard pasteboardWithUniqueName] retain];

    [pboard clearContents];
    [pboard writeObjects:@[string]];

    NSURL *result = [WebView URLFromPasteboard:pboard];
    return result;
}

更多详情请访问http://www.mikeabdullah.net/webkit-encode-unescaped-urls.html

于 2013-05-03T14:44:39.890 回答
1

问题的根源在于 Apple 的文档链接不是有效的 URL,因此 NSURL 会做它应该做的事情并拒绝从中创建 URL。

如果你用 %23 替换第二个 #,NSURL 会像 "okaaaaaaaaay" 并给你一个 NSURL 对象,你的 webview 将打开到正确的页面。

于 2013-05-02T21:44:13.803 回答