与IOS 7一起引入的JavaScriptCore.framework Objective-C API给出了一个糟糕的NSDate转换(BUG?)

 手机用户2502922177 发布于 2023-01-31 17:05

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

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

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

我遇到的问题是我的NSDate对象(通过args和直接设置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年以来的毫秒数而不是自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).有谁认为这不是一个错误,我做错了什么?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有