Подтвердить что ты не робот

NSString stringByAppendingPathComponent: удаляет '/' в http://

Я модифицировал некоторый код для работы между Mac OS X и iPhone OS.

Я наткнулся на какой-то код, который использовал NSURL URLByAppendingPathComponent: (добавлен в 10.6), который, как некоторые могут знать, недоступен в iPhone SDK.

Мое решение заставить этот код работать между ОС - использовать

NSString *urlString = [myURL absoluteString];
urlString = [urlString stringByAppendingPathComponent:@"helloworld"];
myURL = [NSURL urlWithString:urlString];

Проблема заключается в том, что NSString stringByAppendingPathComponent:, кажется, удаляет одну из/из http://части URL.

Является ли это предполагаемым поведением или ошибкой?


Изменить

Хорошо, поэтому я слишком быстро задал вопрос выше. Я перечитываю документацию и делает:

Обратите внимание, что этот метод работает только с файловыми путями (не, например, строковыми представлениями URL-адресов)

Однако он не дает никаких указателей в правильном направлении, что делать, если вам нужно добавить компонент пути к URL-адресу на iPhone...

Я всегда мог просто сделать это вручную, добавив/если необходимо и дополнительную строку, но я старался сохранить ее как можно ближе к исходному коду Mac OS X...

4b9b3361

Ответ 1

Я бы применил метод myURLByAppendingPathComponent: для NSURL, который делает то же самое. Причина в том, чтобы назвать его другим именем, так что он не отменяет предоставленный Apple метод, когда Apple обходится переносить API 10.6 на iPhone (так что "мой" - всего лишь пример - дело в том, что вряд ли кто-то else написал бы метод с этим именем).

Мне кажется, вы просто хотите испортить путь, а не весь URL. Здесь непроверенный пример:

- (NSURL *)myURLByAppendingPathComponent:(NSString *)component {
    NSString *newPath = [[self path] stringByAppendingPathComponent:component];
    return [[[NSURL alloc] initWithScheme: [self scheme] 
                                     host: [self host] 
                                     path: newPath]
                                     autorelease];
}

Он будет корректно работать с URL-адресами, имеющими файловые пути, но я уверен, что метод Apple работает одинаково. Во всяком случае, надеюсь, это поможет вам в правильном направлении.

Ответ 2

URLByAppendingPathComponent

Так как iOS 4, URLByAppendingPathComponent доступен в iOS и правильно обрабатывает две косые черты. (OS X имела это с 10.6., Как указывает Чак)

myURL = [myURL URLByAppendingPathComponent:@"hello world"]
// http://foo/bar/hello%20world

Обратите внимание, что в отличие от stringByAppendingPathComponent, этот метод избегает аргумента.

URLWithString: relativeToURL:

В качестве альтернативы существует URLWithString:relativeToURL:, который не исчезает. Поэтому, если компонент url уже экранирован, используйте:

myURL = [NSURL URLWithString:@"hello%20world" relativeToURL:myURL]
// http://foo/bar/hello%20world

Обратите внимание, что myURL должен заканчиваться косой чертой, а добавленный сегмент не должен иметь косую черту.

Ответ 3

Ссылка NSString говорит об этом stringByAppendingPathComponent:

Обратите внимание, что этот метод работает только с пути к файлу (не, например, строка представления URL-адресов).

Итак, я думаю, что это случай "Не делай этого".

Использовать -stringByAppendingString: вместо этого?

Ответ 4

Простая работа. Используя [NSString stringWithFormat: @ "% @/% @", сервер, файл] отлично работает.

например. server: ftp://www.server.com и файл: file.txt

Ответ 5

+ (NSString *)urlStringPathWithComponents:(NSArray *)paths
{
    NSString *url = @"";
    for( NSString *item in paths)
    {
        if([item isEqualToString:paths.firstObject])
        {
            url = [url stringByAppendingString:[NSString stringWithFormat:@"%@", item]];
        }else{
            url = [url stringByAppendingString:[NSString stringWithFormat:@"/%@", item]];
        }

    }
    return url;
}

Как вы видите, приведенный выше код - это метод класса, и это разрешение можно использовать в любом месте без экземпляра объекта.

Примечание. Всегда первый объект массива должен быть базовым url.