2016-10-10 2 views
0

Я продолжаю получать ошибку (null), когда пытаюсь создать свой NSURL, чтобы открыть другое приложение.NSURL с JSON возвращает null

URL-адрес должен быть

ms-test-app://eventSourceId=evtSrcId&eventID=13675016&eventType=0&json={"meterresults":[{"clean":"2","raw":"2","status":"0"}]}

, но когда я пытаюсь построить мой URL это всегда нуль.

Сначала я думал, что это как-то связано с самим URL-адресом, но это то же самое, что я получил его из примера here.

Другая мысль заключалась в том, что у IOS возникли проблемы с двойными кавычками в JSON, но я заменил их %22, но это тоже не сработает.

Вот код, где я строю URL:

NSString *jsonString = [NSString stringWithFormat:@"{%22meterresults%22:[{%22clean%22:%22%@%22,%22raw%22:%22%@%22,%22status%22:%22%@%22}]}", cleanReadingString, rawReadingString, status]; 

NSLog(@"JSON= %@",jsonString); 

//Send the result JSON back to the movilizer app 
NSString *eventSourceId = @"evtSrcId"; 
NSString *encodedQueryString = [NSString stringWithFormat:@"?eventSourceId=%@&eventID=%d&eventType=0&json=%@", 
           eventSourceId, _eventId, jsonString];[NSCharacterSet URLQueryAllowedCharacterSet]] 
NSString *urlStr = [NSString stringWithFormat:@"%@%@", 
        [_endpointUrls objectForKey:[NSNumber numberWithInt:(int)_selectedEndpoint]], 
        encodedQueryString]; 
NSURL *url = [NSURL URLWithString:urlStr]; 

Я не знаю, где я ошибаюсь, и я был бы рад, если кто-то есть какие-либо идеи.

Заранее спасибо.

+0

Предоставляет ли ваш код предупреждения или ошибки? Потому что 'NSString * encodedQueryString = [NSString stringWithFormat: @"? EventSourceId =% @ & eventID =% d & eventType = 0 & json =% @ ", eventSourceId, _eventId, jsonString]; [NSCharacterSet URLQueryAllowedCharacterSet]]' должен ... – Larme

+0

Можете ли вы действительно отправить JSON как параметр URL? – Droppy

+0

Спасибо за быстрые ответы. Я нашел свою ошибку. Проблема, когда скобки и я должны были заменить 'encodedQueryString' на' [jsonString stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLQueryAllowedCharacterSet]] '. Таким образом кодируются все фигурные скобки и двойные кавычки, что создает допустимый URL. Но у меня все еще есть проблема, что другое приложение действительно не обрабатывает URL-адрес. – Syrinscaper

ответ

0

Вы должны действительно использовать NSURLComponents для создания URL-адресов, а не для их форматирования в строку.

NSDictionary* jsonDict = @{@"clean": @"2", @"raw": @"2", @"status": @"0"}; 
    NSData* jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:0 error:NULL]; 
    NSString* jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
    NSURLComponents* components = [[NSURLComponents alloc] init]; 
    components.scheme = @"ms-test-app"; 
    components.queryItems = @[ 
         [[NSURLQueryItem alloc] initWithName:@"eventSourceId" value:eventSourceId], 
         [[NSURLQueryItem alloc] initWithName:@"eventID" value:@(_eventId).stringValue], 
         [[NSURLQueryItem alloc] initWithName:@"json" value:jsonString] 
         ]; 
    NSURL* url = components.URL; 

После того, как вы строите URL таким образом, становится очевидным, что ваша строка не имеет хозяину части (точнее, один из ваших параметров используются в качестве принимающей части).

Другие комментарии о невозможности отправки JSON в качестве параметра URL неверны. Пока система с другой стороны, которая разбирает строку запроса, может ее обработать, вы можете отправить все, что хотите, в качестве параметра URL.

+0

Большое спасибо. Я нашел ошибку. Проблема заключалась в 'eventSourceId', который должен быть числом, и это стало причиной проблемы. – Syrinscaper

+0

Я получил дополнительную заметку к вашему решению. В URL-адресе, который я построил, отсутствовали две косые черты, поэтому я добавил 'components.host = @" ";', что, по-видимому, необходимо для них. – Syrinscaper

Смежные вопросы