无法在iPhone应用中加载带空格或主题标签的NSURL

时间:2011-04-06 02:46:06

标签: iphone escaping space nsurl

Twitter有一个很好的功能,允许您使用以下格式预加载状态消息:

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 个答案:

答案 0 :(得分:21)

事实证明,问题不是由NSURL对象引起的,而是由Twitter本身引起的。

这是正确的代码:

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 :(得分:1)

试试这个:

    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]);

答案 2 :(得分:1)

我在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]];