我一直在修改一些代码,以便在Mac OS X和iPhone OS之间工作。
我遇到了一些使用NSURL
的{{1}}(在10.6中添加)的代码,有些人可能知道,这些代码在iPhone SDK中不可用。
我在OS之间使用此代码的解决方案是使用
URLByAppendingPathComponent:
问题是NSString *urlString = [myURL absoluteString];
urlString = [urlString stringByAppendingPathComponent:@"helloworld"];
myURL = [NSURL urlWithString:urlString];
的{{1}}似乎从网址的http://部分删除了其中一个。
这是预期的行为还是错误?
好的,所以我在问上面的问题时有点太快了。我重新阅读了文档,确实说:
请注意,此方法仅适用于文件路径(例如,不是URL的字符串表示)
但是,如果您需要将路径组件附加到iPhone上的URL,它没有为正确的方向提供任何指示......
我总是可以手动执行,添加/如果需要和额外的字符串,但我希望尽可能接近原始的Mac OS X代码......
答案 0 :(得分:15)
我会在NSURL上实现一个myURLByAppendingPathComponent:
方法来做同样的事情。给它一个不同名称的原因是它不会覆盖Apple提供的方法,当Apple开始将10.6 API移植到iPhone时(所以“我的”只是一个例子 - 重点是它不太可能有人否则会写一个具有该名称的方法)。
在我看来,你只想弄乱路径而不是整个网址。这是一个未经测试的例子:
- (NSURL *)myURLByAppendingPathComponent:(NSString *)component {
NSString *newPath = [[self path] stringByAppendingPathComponent:component];
return [[[NSURL alloc] initWithScheme: [self scheme]
host: [self host]
path: newPath]
autorelease];
}
它只适用于具有类似文件路径的URL,但我很确定Apple方法的工作方式相同。无论如何,希望它能帮助你朝着正确的方向前进。
答案 1 :(得分:12)
自iOS 4起,URLByAppendingPathComponent
在iOS上可用并正确处理两个斜杠。 (OS X从10.6开始就有了它,正如Chuck指出的那样)
myURL = [myURL URLByAppendingPathComponent:@"hello world"]
// http://foo/bar/hello%20world
请注意,与stringByAppendingPathComponent
不同,此方法会转义参数。
或者,有URLWithString:relativeToURL:
,它不会逃脱。因此,如果url组件已经转义,请使用:
myURL = [NSURL URLWithString:@"hello%20world" relativeToURL:myURL]
// http://foo/bar/hello%20world
请注意,myURL需要在此处以斜杠结尾,并且添加的段不得有前导斜杠。
答案 2 :(得分:4)
NSString Reference说明stringByAppendingPathComponent:
请注意,此方法仅适用于 文件路径(例如,不是字符串 网址表示。)
所以,我认为这是“不要那样做”的情况。
改为使用-stringByAppendingString:
?
答案 3 :(得分:2)
有一个简单的工作。 使用[NSString stringWithFormat:@“%@ /%@”,服务器,文件]工作正常。
E.g。服务器:ftp://www.server.com和文件:file.txt
答案 4 :(得分:0)
我已经提供了一些处理此问题的代码:https://gist.github.com/1256354
在我的博客上,我写了一些进一步的解释:http://koolistov.net/blog/2011/10/02/right-path-to-url-parameters/