Ошибка кодировки URL iOS NSURL
URL, который открывается в Firefox, браузерах Chrome на рабочем столе, не открывается в WebView на iPhone. Этот URL предположительно обращается к GET-запросу. При создании NSURL без процентирования url не генерируется. При использовании процентной надписью URL-адрес перенаправляется на содержимое с плохой ссылкой.
Есть ли другая кодировка, используемая в настольных браузерах, а не на iPhone? или мобильный сафари? Существуют ли другие способы кодирования URL в iOS, кроме использования
-stringByAddingPercentEscapesUsingEncoding
-CFURLCreateStringByAddingPercentEscapes
который генерирует неверные страницы содержимого запроса с сервера.
Любая помощь будет очень полезна, спасибо.
РЕДАКТИРОВАТЬ:
URL был создан как показано нижеhttp://something.test.com/iostest/index.html?{"a":"b"}
Удалось понять, что не кодировка фигурных скобок вызывает проблему в iOS. как в
NSString *tempUrlSting = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)tempURLA,CFSTR("{}"), CFSTR("\""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)));
NSURL *tempUrl=[NSURL URLWithString:tempUrlSting];
Если не кодировать фигурные скобки в URL, а кодировать остальные, используя [ответ Роба] [1], как указано выше. При создании NSURL, URL-адрес пуст.При кодировании фигурных скобок URL генерируется нормально, но сервер выдает исключение.этоВопрос предлагает использовать CFNetworking.
РЕДАКТИРОВАТЬ
Используется CFNetworking, как показано ниже
-(void)getDataFromUrl{
CFStringRef tempURLA = CFSTR("http://my.test.server/iostest/index.html?{\"a\":\"b\"}");
CFStringRef tempUrlSting = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)tempURLA,CFSTR("{}"), CFSTR("\""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, tempUrlSting, NULL);
CFStringRef requestMethod = CFSTR("GET");
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL,kCFHTTPVersion1_1);
CFStringRef headerFieldName = CFSTR("Accept");
CFStringRef headerFieldValue = CFSTR("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
CFHTTPMessageSetHeaderFieldValue(myRequest, headerFieldName, headerFieldValue);
[self performHTTPRequest:myRequest];
}
-(void)performHTTPRequest:(CFHTTPMessageRef)request {
CFURLRef gotdatab = (__bridge CFURLRef)(CFBridgingRelease(CFHTTPMessageCopyRequestURL(request)));
// NSLog(@"(CFHTTPMessageRef request %@",gotdatab);
CFReadStreamRef requestStream = CFReadStreamCreateForHTTPRequest(NULL, request);
CFReadStreamOpen(requestStream);
NSMutableData *responseBytes = [NSMutableData data];
NSError *error;
while (TRUE) {
if (CFReadStreamHasBytesAvailable(requestStream)) {
UInt8 streambuffer[1024];
int readBytes = CFReadStreamRead (requestStream,streambuffer,sizeof(streambuffer));
NSLog(@"Read: %d",readBytes);
[responseBytes appendBytes:streambuffer length:readBytes];
}
if (CFReadStreamGetStatus(requestStream) == kCFStreamStatusError) {
error = (NSError*)CFBridgingRelease(CFReadStreamCopyError (requestStream));
if ([error code] == 61) {
// connection refused
NSLog(@"Error occured: %d",[error code]);
}
break;
}
if (CFReadStreamGetStatus(requestStream) == kCFStreamStatusAtEnd) {
NSLog(@"Stream reached end!");
error = nil;
break;
}
}//
CFHTTPMessageRef response = (CFHTTPMessageRef)CFReadStreamCopyProperty(requestStream, kCFStreamPropertyHTTPResponseHeader);
if (response==NULL) {
NSLog(@"response is null");
return;
}
}
Выше было сделано с использованием примеров изВот а такжеВот
Выше метод все еще имеет ту же проблему. То есть: если {} не закодировано, URL не генерируется. Если {} закодированы, сервер не возвращает правильное значение.
Какие-либо предложения, пожалуйста?