使用 NSString 变量在 PhoneGap 中从 Objective C 编写 JavaScript

Posted

技术标签:

【中文标题】使用 NSString 变量在 PhoneGap 中从 Objective C 编写 JavaScript【英文标题】:Writing JavaScript from Objective C in PhoneGap using NSString variables 【发布时间】:2013-09-17 15:37:15 【问题描述】:

在 PhoneGap 应用程序中,我试图从我的 .m Objective C 文件中返回一行 javascript。我可以对一个变量毫无问题地这样做,但另一个变量会默默地失败。 NSString 变量 *text 的声明方式似乎有些矛盾,但我是 Objective C 的新手,无法判断代码有什么问题。请参阅下面的代码。

- (void)umSwipe_receivedSwipe:(NSNotification *)notification 
    NSLog(@"umSwipe_receivedSwipe called");
    NSData *data = [notification object];
    NSString *text = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

    // FAIL: This fails silently
    NSString* orig = [NSString stringWithFormat:@"alert('%@')", text];
    [super writeJavascript:orig];

    // This works great
    NSString* someVar = @"B1234221012341234^LAST/FIRST^151710100000000099000000?;1234221012341234=15171010000000099?";
    NSString* concat = [NSString stringWithFormat:@"alert('%@')", someVar];
    [super writeJavascript:concat];

作为背景,这是在 iPad 上使用UniMag Magnetic Strip scanner。

当一个变量包含相同的字符数据时,为什么一个变量会起作用而另一个不起作用?如何将此变量合并到我在 ios PhoneGap 应用程序中发送到 JavaScript 的字符串中?

顺便说一句,如果答案中有更正的代码,而不仅仅是指向某物的链接,我更有可能欣赏和理解答案。

谢谢。

编辑:所以我发现该错误是 JavaScript 错误。仍然不确定到底是什么问题,但是 NSString 变量中必须有某种不可见的字符,这会扼杀 JS 体验。也许当我 NSLog 时没有显示换行符...?

【问题讨论】:

当你NSLogdata在`NSData *data = [通知对象];`之后得到什么? 它崩溃了:2013-09-17 13:00:59.254 HelloWorld[490:707] -[NSConcreteMutableData getCharacters:range:]:无法识别的选择器发送到实例 0x271780 2013-09-17 13:00 :59.256 HelloWorld[490:707] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSConcreteMutableData getCharacters:range:]: 无法识别的选择器发送到实例 0x271780” 如果我 NSLog(text) 我得到以下信息:B1234221012341234^LAST/FIRST^151710100000000099000000?;1234221012341234=15171010000000099? ...虽然是真实的 CC 数据。当然,我不会在这里发布。 【参考方案1】:

这是换行符。我更改了这段代码:

NSString* orig = [NSString stringWithFormat:@"alert('%@')", text];

到这里:

NSString *nolinebreaks = [[text componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] componentsJoinedByString:@" "];
NSString* orig = [NSString stringWithFormat:@"alert('%@')", nolinebreaks];

...一切都很好。

FWIW,要查看所有 JS console.log 脚本以及查看登录到 xcode 控制台的 JS 错误,我在 JS 代码的顶部添加了以下脚本:

<script type="text/javascript">
    // Make the console debugger work properly
    console = new Object();
    console.log = function(log) 
      var iframe = document.createElement("IFRAME");
      iframe.setAttribute("src", "ios-log:#iOS#" + log);
      document.documentElement.appendChild(iframe);
      iframe.parentNode.removeChild(iframe);
      iframe = null;    
    
    console.debug = console.log;
    console.info = console.log;
    console.warn = console.log;
    console.error = console.log;
    debug.log = console.log;

    window.onerror = function(message, url, lineNumber)
    
        console.log("[Javascript Error]: "+message+" in "+url+" at line "+lineNumber);
    

</script>

【讨论】:

以上是关于使用 NSString 变量在 PhoneGap 中从 Objective C 编写 JavaScript的主要内容,如果未能解决你的问题,请参考以下文章

phonegap ios的奇怪错误

iOS - 如何使用 phoneGap / Cordova 中的参数调用 writeJavascript

PhoneGap / Cordova 将 appdelegate 变量传递给 JS

变量 NSString anos 与 NSLocalizedString Xcode 一起使用

在 Windows 7 上调整环境变量时是不是破坏了 phonegap?

使用表单插入 PhoneGap 数据库