Правильно декодировать строковый url для литья в NSURL
Я создаю плеер, который будет поддерживать Google DFP adserver. На Ad-сервере есть ссылка VAST, которая является типом XML и содержит медиа файл, ссылки на дорожки, clickLink и т.д.
ClickLinks включает перенаправляющий url к исходному URL-адресу, который я не мог правильно декодировать.
Ссылка выглядит так:
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
?
Ответы
Ответ 1
Проблема заключалась в том, что url полагается на CDATA, поэтому он не может правильно декодировать/кодировать. Я использовал метод делегирования (void) parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock{
и закодировал строку следующим образом:
NSString *string = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];
Чем я назначен NSURL без каких-либо проблем.
Ответ 2
Снова прочитайте свой вопрос, осторожно. Вы говорите, что хотите декодировать URL-адрес и вызывать метод, называемый
stringByAddingPercentEscapesUsingEncoding
^^^^^^
Попробуйте использовать stringByRemovingPercentEncoding
. Это должно расшифровать ваш URL.
К другому вопросу, как "передать" его NSURL: "Кастинг" означает, что вы вынуждаете отладчик обрабатывать переменную типа определенного типа. Это означает, что вы не можете бросить объект и превратить его в экземпляр другого типа.
Вам нужно создать экземпляр NSURL с помощью строки:
NSURL *URL = [NSURL URLWithString:[URLString stringByRemovingPercentEncoding]];
Ответ 3
Вы можете использовать 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
, чтобы удалить все escape-последовательности.