Невозможно загрузить NSURL с пробелами или хэштегами в приложении iPhone - PullRequest
14 голосов
/ 06 апреля 2011

Твиттер имеет приятную функцию, которая позволяет предварительно загружать сообщения о состоянии, используя следующий формат:

http://twitter.com/?status=@HelloWorld Hello World

или альтернативно:

http://twitter.com/?status=%40HelloWorld%20Hello%20World

Я пытаюсь добавить кнопку в свойПриложение для iPhone, которое откроет Safari для вышеуказанного предварительно заполненного твита.

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

Вот код, который я пробовал:

Первый пример того, что работает

NSString* urlText = @"http://www.twitter.com/home?status=@HelloWorld";
NSURL *url = [NSURL URLWithString: urlText];
if (![[UIApplication sharedApplication] openURL:(NSURL*)url])
        NSLog(@"%@%@",@"Failed to open url:",[url description]);

Этот код работает как брелок и выводит:

http://twitter.com/?status=%40HelloWorld

Код, который не работает

NSString* urlText = @"http://www.twitter.com/home?status=@HelloWorld Hello World";
NSURL *url = [NSURL URLWithString: urlText];
if (![[UIApplication sharedApplication] openURL:(NSURL*)url])
        NSLog(@"%@%@",@"Failed to open url:",[url description]);

Это создает нулевой NSURL.Это я могу предположить только потому, что URLWithString не принимает текст с пробелами в нем.

Поэтому я попробовал этот код:

NSString* urlText = @"http://www.twitter.com/home?status=@HelloWorld%20Hello%20World";
NSURL *url = [NSURL URLWithString: urlText];
if (![[UIApplication sharedApplication] openURL:(NSURL*)url])
   NSLog(@"%@%@",@"Failed to open url:",[url description]);

Однако при этом создается URL:

http://twitter.com/?status=%40HelloWorld%2520Hello%2520World

Итак, я избежал моего процента в процентах, что, конечно, не то, что я хотел.

Конечно, люди говорили об использовании функции: stringByAddingPercentEscapesUsingEncoding

Итак, я написал этот код:

NSString* urlText = @"http://www.twitter.com/home?status=@HelloWorld%20Hello%20World";
urlText = [urlText stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL *url = [NSURL URLWithString: urlText];
if (![[UIApplication sharedApplication] openURL:(NSURL*)url])
    NSLog(@"%@%@",@"Failed to open url:",[url description]);

Однако у вас снова возникает проблема двойного побега:

http://twitter.com/?status=%40HelloWorld%2520Hello%2520World

Я надеюсь, что кто-то может знать какую-то работу вокруг.В идеале я хотел бы также включить хэштеги, но сейчас просто получить пробелы - это огромный шаг вперед.

Ответы [ 3 ]

21 голосов
/ 08 апреля 2011

Получается, что проблема вызвана не объектом NSURL, а самим Твиттером.

Это правильный код для использования:

NSString* urlText = @"http://twitter.com/home?status=@HelloWorld Hello World";
urlText = [urlText stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL *url = [NSURL URLWithString: urlText];
if (![[UIApplication sharedApplication] openURL:(NSURL*)url])
    NSLog(@"%@%@",@"Failed to open url:",[url description]);

Одна вещь, которую я не сделалВы не можете понять, что это за твиттер, используя этот адрес:

http://www.twitter.com/home?status=

автоматически покинет ваш статус.

Пока:

http://twitter.com/home?status=

не выйдет автоматически.

1 голос
/ 06 апреля 2011

Я создал эту категорию на NSString для кодирования строк в виде URL-адресов:

@interface NSString (URLEncoding)
@property (readonly) NSString *URLEncodedString;
@end

@implementation NSString (URLEncoding)
- (NSString*)URLEncodedString
{
    NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR("?=&+"), kCFStringEncodingUTF8);
    return [result autorelease];
}
@end

В вашем случае вы бы использовали его так:

NSString *urlText = @"http://www.twitter.com/home?status=@HelloWorld Hello World";
NSURL *url = [NSURL URLWithString:[urlText URLEncodedString]];
1 голос
/ 06 апреля 2011

Попробуйте это:

    NSString* urlText = @"http://www.twitter.com/home?status=@HelloWorld Hello World";  
    NSString* newText = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)urlText,NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8);
    NSURL* url = [NSURL URLWithString: urlText];
    if (![[UIApplication sharedApplication] openURL:(NSURL*)url])
    NSLog(@"%@%@",@"Failed to open url:",[url description]);
...