对于那些在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 JavaScriptNSLog(@"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+11002014-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之前强制更大的日期1000x并在退出时除以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 JavaScriptNSLog(@"myDate = %@",[dateFormatter stringFromDate:myDate]);myDate = [NSDate dateWithTimeIntervalSince1970:[myDate timeIntervalSince1970]*1000]; // Workaround BUGself.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 BUGNSLog(@"JavaScriptDate = %@",[dateFormatter stringFromDate:JavaScriptDate]);
更新日志:
2014-01-24 14:43:44.156 yhere[70180:70b] myDate = Fri Jan 24 2014 14:43:44 GMT+11002014-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).有谁认为这不是一个错误,我做错了什么?
解决方法 我将此问题标记为已关闭,因为我已针对此问题(15920754)向Apple提出了错误报告 – 在JavaScript转换之前乘以1000,在从JavaScript转换回来之后除以1000以获得正确的值很明显Apple在这里有一个BUG.如果Apple听到他们的话,我会重新发帖.
更新:
Apple在iOS 8中纠正了这个问题
总结以上是内存溢出为你收集整理的与IOS 7一起引入的JavaScriptCore.framework Objective-C API给出了一个糟糕的NSDate转换(BUG?)全部内容,希望文章能够帮你解决与IOS 7一起引入的JavaScriptCore.framework Objective-C API给出了一个糟糕的NSDate转换(BUG?)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)