Подтвердить что ты не робот

Правильно декодировать строковый 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?

4b9b3361

Ответ 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-последовательности.