历时8个月,Do.Fun终于上线了。可是上线后第二天,一个测试的同事,用自己的iPhone5手机,测出飞机时间不对的问题。而使用5s、6、6s时间正常。
先来谈谈这个bug发生的场景,Do.Fun是为一款为小型口袋无人机DOBBY服务的应用。飞机开机释放WiFi,手机连接飞机热点。因为飞机没有时间,所以打开APP,APP会获取手机系统时间,然后发送设置时间指令,为飞机设置时间。
因为给飞机设置时间的指令数据包中,时间占8个字节。因此我就选用了long来接受从手机获取的当前系统时间。代码如下:
NSDate *datenow = [NSDate date];//现在时间
//转换时区
NSTimeZone *zone = [NSTimeZone systemTimeZone];
NSInteger interval = [zone secondsFromGMTForDate:datenow];
NSDate *localeDate = [datenow dateByAddingTimeInterval: interval];
NSTimeInterval time=[localeDate timeIntervalSince1970]*1000;
long i=time; //NSTimeInterval返回的是double类型
因为没有4和4s的测试机,所以设置时间这个功能一直没出问题。直到iPhone5的出现。。。
用iPhone5连接飞机设置时间后,飞机时间并不是当前时间,而是1989年。Fuck,这是什么bug。刚开始怀疑是飞机的问题(我的代码怎么会出问题,肯定是飞机那边又出什么幺蛾子了),可是在查看代码的时候,突然想到iPhone5是32的架构,那么long在32位系统下占多少个字节?一查,懵逼了,32位下long占4个字节。好吧,肯定是数据溢出了。当将long 改为 long long一试,OK了。
NSTimeInterval time=[localeDate timeIntervalSince1970]*1000;
long long i=time; //NSTimeInterval返回的是double类型