使用 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 时没有显示换行符...?
【问题讨论】:
当你NSLog
data
在`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的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 如何使用 phoneGap / Cordova 中的参数调用 writeJavascript
PhoneGap / Cordova 将 appdelegate 变量传递给 JS
变量 NSString anos 与 NSLocalizedString Xcode 一起使用