正确解码字符串 url 以便在 NSURL 中进行转换

Properly Decoding string url for casting in NSURL

我正在制作支持 Google DFP 广告服务器 的播放器。广告服务器有一个 VAST link,它是 XML 类型,包含媒体文件、轨道 links、clickLink 等...

clickLinks 包括重定向 url 到我无法正确解码的原始 url。

link 看起来像: https://pubads.g.doubleclick.net/aclk?sa=L&ai=B2JSpRFcKVq_SAsifbr-gqPAE9-CGpQcAAAAQASCPsd4lOABY37Owp4gCYJn-noa4IboBCzYyNHgzNTJfeG1syAEF2gEFaHR0cDqpArGOjXR685U-wAIC4AIA6gIULzEzMTMwMjQwNy9Vem1hbl9Ea3n4AvTRHpADhAeYA4QHqAMB0ASQTuAEAZAGAaAGI9gHAQ&num=0&cid=5Ggrgwo88gHDUD7JBb6uTLxZ&sig=AOD64_0xhsqN4jSnVOZ-eKo9KCVTet61iQ&client=ca-pub-3069068742246799&adurl=http://dkykartal.com/%3Futm_source%3DUzmanTV%26utm_medium%3DVideo_PreRoll%26utm_content%3DDKY_Kartal%26utm_campaign%3DDKY_Kartal_IBillBoard

我尝试使用 stringByAddingPercentEscapesUsingEncoding 解码,然后再次编码,但 NSURL 似乎已损坏。

原来的 VastURL 是:

https://pubads.g.doubleclick.net/gampad/ads?sz=624x352&iu=/131302407/Uzman_Dky&impl=s&gdfp_req=1&env=vp&output=xml_vast2&unviewed_position_start=1&url=[referrer_url]&description_url=[description_url]&correlator=1443516172

如何正确地将其转换为 NSURL

您可以使用 componentsSeparatedByString.

示例:

NSString* url = @"https://pubads.g.doubleclick.net/gampad/ads?sz=624x352&iu=/131302407/Uzman_Dky&impl=s&gdfp_req=1&env=vp&output=xml_vast2&unviewed_position_start=1&url=[referrer_url]&description_url=[description_url]&correlator=1443516172";

NSArray* components = [url componentsSeparatedByString:@"&"];
for (NSString* str in components)
{
    NSArray* keyval = [str componentsSeparatedByString:@"="];
    // keyval[0] is your key
    // keyval[1] is your value
    NSLog(@"key: %@ | value: %@", keyval[0], keyval[1]);
}

示例输出:

 key: https://pubads.g.doubleclick.net/gampad/ads?sz | value: 624x352
 key: iu | value: /131302407/Uzman_Dky
 key: impl | value: s
 key: gdfp_req | value: 1
 key: env | value: vp
 key: output | value: xml_vast2
 key: unviewed_position_start | value: 1
 key: url | value: [referrer_url]
 key: description_url | value: [description_url]
 key: correlator | value: 1443516172

您获得的 URL 可以通过 stringByRemovingPercentEscapesUsingEncoding 解码,以删除所有转义序列。

仔细再读一遍你的问题。你说你想解码 URL 并调用一个名为

的方法
stringByAddingPercentEscapesUsingEncoding
        ^^^^^^

尝试使用 stringByRemovingPercentEncoding。这应该解码你的 URL。

关于另一个问题,如何将其"cast" 转换为 NSURL:转换意味着您强制调试器将变量视为特定类型。这意味着您不能强制转换对象并将其变成另一种类型的实例。

您必须使用 字符串创建 NSURL 实例:

NSURL *URL = [NSURL URLWithString:[URLString stringByRemovingPercentEncoding]];

问题是,url 依赖于 CDATA,这就是它不能 decode/encode 正确的原因。我使用了 - (void) parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock{ 委托方法并将字符串编码为:

NSString *string = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];

比我分配给 NSURL 没有任何问题。