- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在通过 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/
在开始之前,我想指出的是,我已经通过Google进行了一次诚实而真实的搜索,涉及范围很广,无法找到。 我需要(对于我正在开发的项目)所有Delphi(从2007年到最新发布的版本,我不再支持任何早于2
我正在使用 RPM 将 Liquibase 数据库迁移添加到我们当前的产品部署中,并正在寻找一些有关如何实现我的预期目标的建议/技巧。 最好,RPM 能够安装在全新且 Shiny 的开发人员环境以及现
我目前正在使用一本书学习 UITableViewCell。为了在滚动时重用单元格,作者要求修改原始代码以包含一个if()。检查特定重用标识符的单元格是否存在的语句。但是,在添加 if() 之后语句,X
在 C++ 中引入 protected 访问说明符背后的基本原理是什么。举个例子会有帮助。 最佳答案 对于这类问题,我推荐 Bjarne Stroustrup 的The Design And Evol
我正在尝试使用模板参数中给定的维度和类型创建一个可重用的矩阵类。结构本身就是: template struct Matrix { T elements[N* M]; }; 当我尝试实现矩阵乘
我有一个简单的查询: $query1="SELECT * FROM wp_users WHERE now() < (last_login + INTERVAL 6 month)"; $resu
在 Ioke doc 中,ISpec 测试包含在文档中,参见 ioke.org/dok/index.html 这如何用 Ruby 的 RSpec 和 RDoc(或 SDoc)来完成?我找不到任何命令行
在客户端/服务器通信中,我看到来自客户端的 TCP ZeroWindow。 在这种情况之后预期的场景是什么(设置和发送什么标志)? 以下是我可能得到的日志。在这种情况下,服务器发送 RST 数据包来终
来自wikipedia关于 Lambda 函数和表达式的文章: users will often wish to define predicate functions near the place w
我有一个由父 POM 和几个子模块组成的 Maven 项目。它在 Intellij 中编译和运行良好(我假设它使用 javac 而不是 Maven)。 当我运行 maven clean install
所以我刚开始使用 d3.js,但我一直收到 JavaScript 错误,我不知道为什么。我刚刚用 svg 创建了三个圆圈,想用 d3 选择它们。这是我的代码:
Objective C 引入了一种称为 ARC 的技术,以将开发人员从内存管理的负担中解放出来。听起来不错,如果g++也有这个功能,我想C++开发者会很高兴的。 ARC allows you to p
在 package.json 添加 "font-awesome": "^4.7.0" 执行 npm install 在 main.js 引入
为什么 WSDL 引入 wsdl:message?和消息部分? 与在操作参数(输入、输出、故障)中直接使用 XSD 相比,他们可以带来什么优势? 它们(带有 wsdl 消息部分的 wsdl 消息)如何
I already read doc here : https://github.com/laravel/framework/pull/25997 我想知道的是使用 withCount()我们只是加载
我已经为此苦苦挣扎了一段时间,但不太明白发生了什么。我有一个包含 Sides(通常是 2 个)的 Card 实体 - 并且 Cards 和 Sides 都有一个 Stage。我正在使用 EF Code
下面的 swiftUI 代码在 iOS13 上运行良好,但是在使用 iOS14 进行测试时,我在尝试显示模式表时遇到了由强制解包选项引起的 fatal error 。据我所知,工作表不应该尝试为 se
出于个人原因,我需要记忆一下 jsp 上的一些事情 :) 我有一个简单的登录页面: Login First name:
据我了解,PYTHONCASEOK 选项允许通过不区分大小写的匹配来导入模块。但是,由于 python 中的几乎所有内容都区分大小写,为什么它必须启用此选项以实现更惰性的写入。 还有什么介绍的理由吗?
全新的早午餐(和 bower )。我通过 bower 安装了 Bootstrap,我有以下早午餐配置文件: exports.config = # See http://brunch.io/#doc
我是一名优秀的程序员,十分优秀!