2013-08-16 3 views
0

По какой-то причине это работает на эмуляторе, работающем под управлением iOS 6+, но не на реальном iPad с iOS 5+. Когда я запускаю это приложение на iPad, он дает мне эту ошибку (и другие).Проблемы с iOS JSON на самом устройстве

Error parsing JSON: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Badly formed object around character 316.) UserInfo=0x650260 {NSDebugDescription=Badly formed object around character 316.} 

JSON used is this (which is passed from Javascript): {"functionname":"setItem","args":{"key":"http://localhost:3000/assets/tasks/task.js","value":"function Task(){this.steps=new Array,this.completed=!1,this.loaded=!1,this.stepCount=-1,this.points=0,this.newpoints=0,this.prevpoints=0,this.circleGesture=!1,this.customGesture=!1,this.subtaskCounter=0,this.className=/"/"}(goes on for a while since it is a js script)"}} 

Код для преобразования JSON строку JSON в прошивкой

if ([[urlStr lowercaseString] hasPrefix:protocolPrefix]) 
{ 
    //strip protocol from the URL. We will get input to call a native method 
    urlStr = [urlStr substringFromIndex:protocolPrefix.length]; 

    //Decode the url string 
    urlStr = [urlStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

    NSError *jsonError; 

    //parse JSON input in the URL 
    NSDictionary *callInfo = [NSJSONSerialization 
           JSONObjectWithData:[urlStr dataUsingEncoding:NSUTF8StringEncoding] 
           options:0 
           error:&jsonError]; 

    //check if there was error in parsing JSON input 
    if (jsonError != nil) 
    { 
     NSLog(@"Error parsing JSON: %@",[jsonError debugDescription]); 
     NSLog(@"%@", urlStr); 
     return NO; 
    } 

    .... 
} 

CoffeeScript

callNativeFunction: (func, args, callback)-> 
    if global_phone_os == 'ios' 
    url = "js2native://" 
    callInfo = {} 
    callInfo.functionname = func 
    if args? 
     callInfo.args = args 
    if callback? 
     cid = Math.random().toString(36).substr(2,10) 
     @callback[cid] = callback 
     callInfo.callback_id = cid 
    url += JSON.stringify callInfo 
    @openCustomURLinIFrame url 

Любые идеи, как заставить это работать как на эмуляторе и фактического устройства?

UPDATE

До сих пор я думаю, что я установил его. Если бы я это сделал, это будет отмечено как ответ. Я должен был сделать следующее в coffeescript:

url += encodeURIComponent JSON.stringify callInfo 

Это имело значение.

Спасибо.

+0

_Yo dawg, Я слышал, что вам нравится JSON._ Почему у вас есть строка JSON в вашей строке JSON? Символ 42 вашей строки - это первая экранированная строка '' 'находится в этой встроенной строке JSON, поэтому проблема явно связана с вашей отменой этих данных. –

+0

@AlexWayne, так это проблема в коде CoffeeScript или Object C? –

+0

Выглядит как и код object-c, так как я просто сделал тест в coffeescript.org, и я могу сделать JSON.stringify в json и подкрепить это. Я могу вернуть все правильно. –

ответ

0

Это действительно решить проблему.

url += encodeURIComponent JSON.stringify callInfo 
0

Мне кажется, что вы пытаетесь проанализировать строку url вместо разбора содержимого URL-адреса. Вы уверены, что это работает в эмуляторе?

Ваш код:

//parse JSON input in the URL 
NSDictionary *callInfo = [NSJSONSerialization 
          JSONObjectWithData:[urlStr dataUsingEncoding:NSUTF8StringEncoding] 
          options:0 
          error:&jsonError]; 

Я думаю, что должно быть:

//parse JSON input in the URL 
NSDictionary *callInfo = [NSJSONSerialization 
          JSONObjectWithData:[NSData dataWithContentsOfURL: 
       urlStr], 
          options:0 
          error:&jsonError]; 
+0

Когда я это пробую, он дает мне WebKit отброшенное нечеткое исключение в webView: solvePolicyForNavigationAction: request: frame: decisionListener: delegate: