【问题标题】:Using rangeOfString for different links, URL's etc将 rangeOfString 用于不同的链接、URL 等
【发布时间】:2015-01-28 03:15:06
【问题描述】:

感谢 rmaddy 通过回答 THIS 问题让我找到了正确的方向,这让我使用这个公认的答案陷入了其他一些问题。对于我在该线程上的原始问题,它确实解决了我想要做的事情。但现在我在其他一些网站上使用时遇到了问题。

我有一个 web 视图,其中有几个指向不同站点的链接,例如 Media Fire、Copy、Box 等。甚至是直接下载链接。例如,媒体触发链接甚至无需访问该站点即可开始下载,就像它只是下载文本一样。直接下载根本不会触发我的下载器。

使用公认的答案,区分这些的最干净的方法是什么?

这是适用于大多数网站的代码。

- (BOOL)webView:(UIWebView *)awebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if (navigationType == UIWebViewNavigationTypeLinkClicked){
    //External file links
    NSURL* externalURL = [request URL];
    NSString *urlString = [externalURL absoluteString];

    NSSet *supportedFileExtensions = [NSSet setWithObjects:@"mpeg", @"mpg", @"m1s", @"mpa", @"mp2", @"m2a", @"mp2v", @"mv2", @"m2s", @"avi", @"mov", @"qt", @"asf", @"asx", @"wmv", @"wma", @"wmx", @"rm", @"ra", @"ram", @"rmvb", @"mp4", @"3gp", @"3gpp", @"ogm", @"mkv", @"flv", @"mv4", @"srt", @"swf", @"vob", @"aif", @"iff", @"m3u", @"m4a", @"mid", @"mp3", @"mpa", @"wav", @"aac", @"7z", @"cbr", @"deb", @"gz", @"pkg", @"rar", @"rpm", @"sitx", @"tar.gz", @"zip", @"zipx", @"ipsw", @"bin", @"cue", @"dmg", @"iso", @"mdf", @"toast", @"vcd", @"torrent", @"nes", @"rom", @"doc", @"docs", @"msg", @"odt", @"rtf", @"txt", @"wpd", @"wps", nil];

    for (NSString *extension in supportedFileExtensions) {
        if ([urlString rangeOfString:extension].location != NSNotFound) {
            // Found extension somewhere in the URL - process it as needed
            break; // stop looking for more
        }
    }
}

示例链接:https://www.dropbox.com/s/57jcgnbnfhcpw9y/Test.zip?dl=0 http://www.mediafire.com/download/wt77jvm3szwjehm/Test.zip https://copy.com/QFvw3fw4FF2k4foX https://app.box.com/s/fixnvrym13eylcr73njv

直接下载链接:http://download.thinkbroadband.com/5MB.zip

【问题讨论】:

  • 你能举个例子吗?还有什么时候调用上面的代码?
  • 添加了代码和网址示例。

标签: ios url hyperlink nsset


【解决方案1】:

使用正则表达式来搜索这样的匹配:

    NSString *urlString = @"http://www.youtube.co.uk/someVideo.mp2";

    NSSet *supportedFileExtensions = [NSSet setWithObjects:@"mpeg", @"mpg", @"m1s", @"mpa", @"mp2", @"m2a", @"mp2v", @"mv2", @"m2s", @"avi", @"mov", @"qt", @"asf", @"asx", @"wmv", @"wma", @"wmx", @"rm", @"ra", @"ram", @"rmvb", @"mp4", @"3gp", @"3gpp", @"ogm", @"mkv", @"flv", @"mv4", @"srt", @"swf", @"vob", @"aif", @"iff", @"m3u", @"m4a", @"mid", @"mp3", @"mpa", @"wav", @"aac", @"7z", @"cbr", @"deb", @"gz", @"pkg", @"rar", @"rpm", @"sitx", @"tar.gz", @"zip", @"zipx", @"ipsw", @"bin", @"cue", @"dmg", @"iso", @"mdf", @"toast", @"vcd", @"torrent", @"nes", @"rom", @"doc", @"docs", @"msg", @"odt", @"rtf", @"txt", @"wpd", @"wps", nil];


    // Expression to match any your mime types
    NSString *pattern = [NSString stringWithFormat:@"(\\W|^)(%@)(\\W|$)", [supportedFileExtensions.allObjects componentsJoinedByString:@"|"]];

    NSRegularExpression *regx = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                          options:NSRegularExpressionCaseInsensitive
                                                                            error:nil];

    // returns first match in the string
    NSTextCheckingResult *match = [regx firstMatchInString:urlString options:NSMatchingReportProgress range:NSMakeRange(0, urlString.length)];
    NSLog(@"matched type: %@", [urlString substringWithRange:match.range]); 

然后您需要实现一个检查所有 HTTP 响应的custom HTTP URL protocol。 copy.com 链接发送一个 Content-Disposition: 附件; for it 文件,并且 shouldStartLoadWithRequest 在执行请求之前不会对此不做任何处理。

一旦您创建了协议,请使用此方法为您的所有网络通信注册它:

[MyURLProtocol registerClass:[MyURLProtocol class]];

查看此tutorial 以创建自定义协议

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 2020-12-10
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2018-09-13
    相关资源
    最近更新 更多