objective-c - IOS 7 引入的 JavaScriptCore.framework Objective-C API 给出了一个错误的 NSDate 转换(BUG?)

标签 objective-c ios7 nsdate javascriptcore

我正在通过 IOS 7 引入的新 JavaScriptCore.framework Objective-C API 将 Javascript 嵌入到我的 IOS 7 应用程序中。

对于那些寻找 Objective-C 和 Javascript 之间这个集成良好的桥梁的介绍的人,请查看 Apple 开发者网络上的 WWDC 介绍“将 JavaScript 集成到 native 应用程序” session :https://developer.apple.com/wwdc/videos/?id=615 .

编辑:WWDC 2013 的视频集现已移至此处:https://developer.apple.com/videos/wwdc/2013/?id=615

我遇到的问题是我的 NSDate 对象(传递的参数和直接设置的 Javascript 变量)似乎被错误地转换为 Javascript 日期。这是我的代码:

self.javascriptContext[@"consoleLog"] = ^(NSString *message) {
    NSLog(@"Javascript log: %@",message);
};
NSDate *myDate = [NSDate date];
NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:@"EEE MMM dd yyyy HH:mm:ss 'GMT'ZZZ"]; // Show in same format as javascript
NSLog(@"myDate = %@", [dateFormatter stringFromDate:myDate]);
self.javascriptContext[@"date1"] = myDate;
[self.javascriptContext evaluateScript:@"var myDateFn = function(dateArg) { consoleLog(\"date1 = \" + date1); consoleLog(\"dateArg = \" + dateArg); return dateArg };"];
JSValue *function = self.javascriptContext[@"myDateFn"];
NSArray *argList = [NSArray arrayWithObjects:myDate, nil];
JSValue *result = [function callWithArguments:argList];
NSDate *javascriptDate = [result toDate];
NSLog(@"javascriptDate = %@", [dateFormatter stringFromDate:javascriptDate]);

产生以下日志:

2014-01-24 14:42:08.019 yhere[70180:70b] myDate = Fri Jan 24 2014 14:42:08 GMT+1100
2014-01-24 14:42:08.019 yhere[70180:70b] Javascript log: date1 = Sat Jan 17 1970 13:15:34 GMT+1100 (EST)
2014-01-24 14:42:08.020 yhere[70180:70b] Javascript log: dateArg = Sat Jan 17 1970 13:15:34 GMT+1100 (EST)
2014-01-24 14:42:08.020 yhere[70180:70b] javascriptDate = Fri Jan 24 2014 14:42:08 GMT+1100

注意 Javascript 中的日期不同。我已经检查过 - Javascript 代码中没有发生异常或其他错误(为清楚起见,我没有在此处包括异常处理)。

请检查我是否做了一些愚蠢的事情,否则在我看来是 JavaScriptCore.framework 中存在错误

就好像框架忘记了这样一个事实,即 Javascript 日期是以 自 1970 年以来的毫秒数 而不是 [NSDate dateWithTimeIntervalSince1970: ]

如果我在传递给 Javascript 之前强制将日期增大 1000 倍并在退出时除以 1000(请参见下面的代码),那么日志中的所有日期都是正确的(即相同的日期):

NSDate *myDate = [NSDate date];
NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:@"EEE MMM dd yyyy HH:mm:ss 'GMT'ZZZ"]; // Show in same format as javascript
NSLog(@"myDate = %@", [dateFormatter stringFromDate:myDate]);
myDate = [NSDate dateWithTimeIntervalSince1970:[myDate timeIntervalSince1970]*1000]; // Workaround BUG
self.javascriptContext[@"date1"] = myDate;
[self.javascriptContext evaluateScript:@"var myDateFn = function(dateArg) { consoleLog(\"date1 = \" + date1); consoleLog(\"dateArg = \" + dateArg); return dateArg };"];
JSValue *function = self.javascriptContext[@"myDateFn"];
NSArray *argList = [NSArray arrayWithObjects:myDate, nil];
JSValue *result = [function callWithArguments:argList];
NSDate *javascriptDate = [result toDate];
javascriptDate = [NSDate dateWithTimeIntervalSince1970:[javascriptDate timeIntervalSince1970]/1000]; // Workaround BUG
NSLog(@"javascriptDate = %@", [dateFormatter stringFromDate:javascriptDate]);

更新日志:

2014-01-24 14:43:44.156 yhere[70180:70b] myDate = Fri Jan 24 2014 14:43:44 GMT+1100
2014-01-24 14:43:44.157 yhere[70180:70b] Javascript log: date1 = Fri Jan 24 2014 14:43:44 GMT+1100 (EST)
2014-01-24 14:43:44.157 yhere[70180:70b] Javascript log: dateArg = Fri Jan 24 2014 14:43:44 GMT+1100 (EST)
2014-01-24 14:43:44.158 yhere[70180:70b] javascriptDate = Fri Jan 24 2014 14:43:44 GMT+1100

我已经为此提出了错误报告 (15920754)。有没有人认为这不是错误,我做错了什么?

最佳答案

我打算将此问题标记为已关闭,因为我已就此问题向 Apple 提出错误报告 (15920754) - 在 Javascript 转换之前乘以 1000,在从 Javascript 转换回来后除以 1000 以获得正确的值很明显表明 Apple 在这方面存在缺陷。

如果 Apple 在收到他们的消息后另有说明,我会重新发布。

更新:

Apple 已经在 iOS 8 中修正了这个问题

关于objective-c - IOS 7 引入的 JavaScriptCore.framework Objective-C API 给出了一个错误的 NSDate 转换(BUG?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21324601/

相关文章:

ios - 即使应用程序被终止并在 ios 中显示本地通知,如何进行服务器调用。

ios - 我是否仍需要注册远程通知才能在我的应用中启用静默通知?

iOS7,有没有办法在 UINavigationViewcontroller 中禁用 UIViewController 的过渡?

objective-c - NSTimer 不会在指定日期被解雇

ios - 将未知格式(任何格式)的字符串转换为日期

ios - 使用 OCMock 期待来自非实例化变量的方法调用

objective-c - 我可以在 NS_SWIFT_NAME 中使用保留关键字吗?

ios - 如何正确删除无处不在的内容?

ios - 可拖动图钉在 map 上没有固定位置

ios - 如何快速记录日期,时间和分数