読者です 読者をやめる 読者になる 読者になる

file://localhost/directory/といったURL文字列にstringByAppendingPathComponent:を使うと・・・

やっちゃ駄目って書いてあるからやるほうが悪いんですが・・


stringByAppendingPathComponent:のリファレンスには下記のように書いてあります。

Note that this method only works with file paths (not, for example, string representations of URLs).

file pathsでだけ動くと書いてありますが、表題のようにfile://localhost/....となっている文字列で実行してみると・・・

NSString *baseURLString = @"file://localhost/directory/";
NSString *fullPath = [baseURLString stringByAppendingPathComponent:@"index.html"];
NSLog(@"%@",fullPath);
// file:/localhost/directory/index.html

file:/localhost/... というように、file:の後の//が/に削られてしまいます。
stringByAppendingPathComponent:は使用せず、stringByAppendingString:を使うとか、

NSString *baseURLString = @"file://localhost/directory/";
NSString *fullPath = [baseURLString stringByAppendingString:@"index.html"];
NSLog(@"%@",fullPath);
// file://localhost/directory/index.html

ただ、stringByAppendingString:を使った場合だと、当然ながらpathを考慮されているわけではないです。
例えばpathComponentsを格納した配列から取り出して、個別に連結するといった場合には"/"を自前処理する必要があります。
文字列に%20であるとかが含まれれば、stringByReplacingPercentEscapesUsingEncoding:も必要です。

NSURLのインスタンスにして処理したほうがいいでしょう。

NSString *baseURLString = @"file://localhost/directory/";
NSURL *baseURL = [NSURL URLWithString:baseURLString];
NSString *fullPath = [[baseURL URLByAppendingPathComponent:@"index.html"] absoluteString];
NSLog(@"%@",fullPath);
// file://localhost/directory/index.html