2016-10-10 46 views
0

當我嘗試構建我的NSURL以打開另一個應用程序時,我一直在收到(null)錯誤。帶有JSON的NSURL返回null

URL應該

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

,但是當我嘗試建立我的網址,它總是空。

起初我認爲它與URL本身有關,但它與我從示例here中得到它是一樣的。

另一個想法是,IOS在JSON中的雙引號引起了一些問題,但我用%22取代了它們,但這也不起作用。

下面是代碼,我在那裏建立的網址:

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

感謝您的快速回復。我發現我的錯誤。大括號和我必須用'[jsonString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]''替換encodedQueryString'的問題。通過這種方式,所有大括號和雙引號都被編碼,從而創建一個有效的URL。但我仍然遇到問題,其他應用程序並未真正處理URL。 – Syrinscaper

回答

0

你真的應該使用NSURLComponents創建網址,而不是嘗試將它們格式化爲字符串。

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