更改NSURL的计划

时间:2013-01-18 05:37:09

标签: ios

是否有一种简单的方法可以更改NSURL的方案?我确实意识到NSURL是不可变的。我的目标是在链接Security.framework时将URL方案更改为“https”,如果框架未链接则将“http”更改为“http”。我知道如何检测框架是否链接。

如果URL没有参数(例如“?param1 = foo& param2 = bar”),此代码可以很好地工作:

+(NSURL*)adjustURL:(NSURL*)inURL toSecureConnection:(BOOL)inUseSecure {
    if ( inUseSecure ) {
        return [[[NSURL alloc] initWithScheme:@"https" host:[inURL host] path:[inURL path]] autorelease];
    }
    else {
        return [[[NSURL alloc] initWithScheme:@"http" host:[inURL host] path:[inURL path]] autorelease];
    }    
}

但是如果URL确实有参数,[inURL path]会删除它们。

任何建议都不能自己解析URL字符串(我可以做但我想尝试不做)?我做了什么能够将http或https的URL传递给此方法。

6 个答案:

答案 0 :(得分:41)

更新回答

NSURLComponents是你的朋友。您可以使用它来替换{​​{1}}的{​​{1}}方案。唯一需要注意的是http使用RFC 3986,而https使用较旧的RFC 1738和1808,因此边缘情况存在一些行为差异,但您极不可能遇到这些情况({{{} 1}}无论如何都有更好的行为。)

NSURLComponents

原始答案

为什么不做一点字符串操作?

NSURL

答案 1 :(得分:29)

如果您使用的是iOS 7及更高版本,则可以使用NSURLComponents,如展示here

NSURLComponents *components = [NSURLComponents new];
components.scheme = @"http";
components.host = @"joris.kluivers.nl";
components.path = @"/blog/2013/10/17/nsurlcomponents/";

NSURL *url = [components URL];
// url now equals:
// http://joris.kluivers.nl/blog/2013/10/17/nsurlcomponents/

答案 2 :(得分:4)

Swift5

extension URL {
    func settingScheme(_ value: String) -> URL {
    let components = NSURLComponents.init(url: self, resolvingAgainstBaseURL: true)
    components?.scheme = value
    return (components?.url!)!
}

}

用法

if nil == url.scheme { url = url.settingScheme("file") }

答案 3 :(得分:1)

也许使用resourceSpecifier会有所帮助:

return [[[NSURL alloc] initWithString:[NSString stringWithFormat:@"https:%@", [inURL resourceSpecifier]]]];

答案 4 :(得分:1)

我是这样做的,使用NSURL中的变量resourceSpecifier

SWIFT

var resourceSpecifier: String? { get } 

目标-C

@property(readonly, copy) NSString *resourceSpecifier Discussion 

此属性包含资源说明符。例如,在网址http://www.example.com/index.html?key1=value1#jumplink中,资源说明符为//www.example.com/index.html?key1=value1#jumplink(冒号后的所有内容)。

  -(NSURL*) URLByReplacingScheme
    {
        NSString *newUrlString = kHttpsScheme;

        if([self.scheme isEqualToString:kEmbeddedScheme])
            newUrlString = kHttpScheme;

        newUrlString = [newUrlString stringByAppendingString:[NSString stringWithFormat:@":%@", self.resourceSpecifier]];

        return [NSURL URLWithString:newUrlString];
    }

答案 5 :(得分:0)

NSString *newUrlString =  [NSString stringWithFormat:@"https://%@%@", 
                          inURL.host, inURL.path];
if (inURL.query) {
    newUrlString = [newUrlString stringByAppendingFormat:@"?%@", inURL.query];
}
return [NSURL URLWithString:newUrl];

[注] 为简单起见,删除与端口和其他字段处理相关的代码。