initWithString和stringByAddingPercentEscapesUsingEncoding中断URL iOS

initWithString和stringByAddingPercentEscapesUsingEncoding中断URL iOS,ios,objective-c,Ios,Objective C,正在尝试创建URL,以便在iOS浏览器中打开,如下所示: NSString *urlStr = [[NSString alloc] initWithFormat:@"http://example.com/#location,data={longitude:%f,latitude:%f}", self.map.userLocation.location.coordinate.longitude, self.map.userLocation.location.coordinate.latitude]

正在尝试创建URL,以便在iOS浏览器中打开,如下所示:

NSString *urlStr = [[NSString alloc] initWithFormat:@"http://example.com/#location,data={longitude:%f,latitude:%f}", self.map.userLocation.location.coordinate.longitude, self.map.userLocation.location.coordinate.latitude];
NSURL *url = [[NSURL alloc] initWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];

但是,这会将URL作为打开,从而中断浏览器中的URL加载。我能做些什么来缓解这个问题吗?用不同的方式编码?

试试这个。在我的应用程序中,我通常在一个单独的类中使用它,它对我很有用

+(NSString *)urlEncodedStringUsingString:(NSString *)string {

    NSString *escapedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, (__bridge CFStringRef)string, NULL, CFSTR("!*'();:@&=+$,/?%#[]\" "), kCFStringEncodingUTF8));

    return escapedString;
}
首先,为什么要使用
+stringbyaddingpercentescapesusingencode:
?我不认为该URL中有任何内容需要转义。别打那个电话了

通常,不能对整个URL字符串进行百分比转义。URL字符串具有结构。不同的字符在不同的组件中是合法的。您需要从it组件组成一个URL,并使用适当的允许和不允许字符集对每个组件进行转义

如果您可以针对iOS 7及更高版本,我建议您使用
NSURLComponents
来构建URL:

NSURLComponents* components = [[NSURLComponents alloc] init];
components.scheme = @"http";
components.host = @"example.com";
components.path = @"/";
components.fragment = [NSString stringWithFormat:@"location,data={longitude:%f,latitude:%f}", self.map.userLocation.location.coordinate.longitude, self.map.userLocation.location.coordinate.latitude];
NSURL* url = components.URL;
如果您不能仅针对iOS7+,则在将其与URL结果连接之前,您应该仅对片段进行%转义:

NSString* fragment = [[NSString alloc] initWithFormat:@"location,data={longitude:%f,latitude:%f}", self.map.userLocation.location.coordinate.longitude, self.map.userLocation.location.coordinate.latitude];
fragment = [fragment stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString* urlString = [[NSString alloc] initWithFormat:@"http://example.com/#%@", fragment];
NSURL *url = [[NSURL alloc] initWithString:urlStr];

如果我省略它,最后一行没有效果(即浏览器没有打开),我认为它使
initWithString
返回nil