是否有一种简单的方法可以更改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传递给此方法。
答案 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];
[注] 为简单起见,删除与端口和其他字段处理相关的代码。