首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HomeKit崩溃的原因:'-[__NSDate length]:但是发送了布尔值

HomeKit崩溃的原因:'-[__NSDate length]:但是发送了布尔值
EN

Stack Overflow用户
提问于 2017-02-08 06:59:10
回答 1查看 96关注 0票数 1

tl;dr -问题中的代码是正确的。在另一个聚会上崩溃的原因。

挑战是控制Elgato Eve Energy HomeKit的插座。直到代码开始的地方,一切都正常,所以选择了正确的房间、附件等。代码确实关闭了电源插座,但随后应用程序崩溃。

代码语言:javascript
复制
guard let services = accessory?.services else {
    print("No Service")
    return
}
for service in services {
    if service.serviceType == HMServiceTypeOutlet {
        for characteristic in service.characteristics {
            print(characteristic.characteristicType)
            if characteristic.characteristicType == HMCharacteristicTypePowerState {
                print(characteristic.metadata!)
                dump(characteristic)
                // Turning off the outlet
                characteristic.writeValue(false, completionHandler: { (error: Error?) -> Void in
                    if error == nil {
                        print("Yep")
                    } else {
                        print("Nop")
                    }
                })
            }
        }
    }
}

日志

代码语言:javascript
复制
00000023-0000-1000-8000-0026BB765291
00000025-0000-1000-8000-0026BB765291
[%@ Format: bool, Manufacturer Description: Power State ]
- <HMCharacteristic: 0x1702c23e0> #0
  - super: NSObject
00000026-0000-1000-8000-0026BB765291
E863F10A-079E-48FF-8F27-9C2605A29F52
E863F126-079E-48FF-8F27-9C2605A29F52
E863F10D-079E-48FF-8F27-9C2605A29F52
E863F10C-079E-48FF-8F27-9C2605A29F52
2017-02-07 23:19:59.725340 POS[499:100178] -[__NSDate length]: unrecognized selector sent to instance 0x170007710
2017-02-07 23:19:59.725767 POS[499:100178] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDate length]: unrecognized selector sent to instance 0x170007710'
*** First throw call stack:
(0x188a291b8 0x18746055c 0x188a30268 0x188a2d270 0x18892680c 0x1895be458 0x1895be350 0x1895be698 0x1006328f8 0x1a249ac8c 0x199674f34 0x19966c588 0x1a249d194 0x101951258 0x101951218 0x10195eaec 0x101954ce0 0x10195f088 0x101960e2c 0x101960b78 0x187abb2a0 0x187abad8c)
libc++abi.dylib: terminating with uncaught exception of type NSException

Sym

代码语言:javascript
复制
2017-02-08 10:17:47.804825 POS[602:171994] -[__NSDate length]: unrecognized selector sent to instance 0x1740169c0

iZettlePayments`-[NSDictionary(Fractionized) dateForKey:]:
0x100973d88 <+0>: stp x22, x21, [sp, #-48]!
0x100973d8c <+4>: stp x20, x19, [sp, #16]
0x100973d90 <+8>: stp x29, x30, [sp, #32]
0x100973d94 <+12>: add x29, sp, #32 ; =32
0x100973d98 <+16>: mov x19, x0
0x100973d9c <+20>: nop
0x100973da0 <+24>: ldr x20, #861056 ; (void *)0x00000001ad8966b8: NSDateFormatter
0x100973da4 <+28>: nop
0x100973da8 <+32>: ldr x21, #851248 ; "izDateFormatterUsingISO8601"
0x100973dac <+36>: mov x0, x2
0x100973db0 <+40>: bl 0x1009e9b54 ; symbol stub for: objc_retain
0x100973db4 <+44>: mov x22, x0
0x100973db8 <+48>: mov x0, x20
0x100973dbc <+52>: mov x1, x21
0x100973dc0 <+56>: bl 0x1009e9b30 ; symbol stub for: objc_msgSend
0x100973dc4 <+60>: mov x29, x29
0x100973dc8 <+64>: bl 0x1009e9b78 ; symbol stub for: objc_retainAutoreleasedReturnValue
0x100973dcc <+68>: mov x20, x0
0x100973dd0 <+72>: nop
0x100973dd4 <+76>: ldr x1, #849044 ; "valueForKey:"
0x100973dd8 <+80>: mov x0, x19
0x100973ddc <+84>: mov x2, x22
0x100973de0 <+88>: bl 0x1009e9b30 ; symbol stub for: objc_msgSend
0x100973de4 <+92>: mov x19, x0
0x100973de8 <+96>: mov x0, x22
0x100973dec <+100>: bl 0x1009e9b48 ; symbol stub for: objc_release
0x100973df0 <+104>: mov x0, x19
0x100973df4 <+108>: bl 0x1009e9b78 ; symbol stub for: objc_retainAutoreleasedReturnValue
0x100973df8 <+112>: mov x19, x0
0x100973dfc <+116>: nop
0x100973e00 <+120>: ldr x1, #851168 ; "dateFromString:"
0x100973e04 <+124>: mov x0, x20
0x100973e08 <+128>: mov x2, x19
0x100973e0c <+132>: bl 0x1009e9b30 ; symbol stub for: objc_msgSend
0x100973e10 <+136>: mov x29, x29
0x100973e14 <+140>: bl 0x1009e9b78 ; symbol stub for: objc_retainAutoreleasedReturnValue
0x100973e18 <+144>: mov x21, x0
0x100973e1c <+148>: mov x0, x19
0x100973e20 <+152>: bl 0x1009e9b48 ; symbol stub for: objc_release
0x100973e24 <+156>: mov x0, x20
0x100973e28 <+160>: bl 0x1009e9b48 ; symbol stub for: objc_release
0x100973e2c <+164>: mov x0, x21
0x100973e30 <+168>: ldp x29, x30, [sp, #32]
0x100973e34 <+172>: ldp x20, x19, [sp, #16]
0x100973e38 <+176>: ldp x22, x21, [sp], #48
0x100973e3c <+180>: b 0x1009e9ac4 ; symbol stub for: objc_autoreleaseReturnValue

浏览Elgato Eve services and characteristics,发现数组中的第一个特征是包含名称的特征,第二个特征是我需要操作的特征。打印的元数据显示其布尔值,并确认其电源状态,以及其可读和可写,如前面链接的表中所述。由于我在正确的特征中写了一个false,插座关闭了,但几秒钟后,应用程序崩溃了。我已经删除了任何可能会干扰的观察者和委托方法。这真的让我莫名其妙。此外,代码不会在iOS 9上崩溃,只会在iOS 10.2以及10.3测试版上崩溃

解决方案

对不起,经过一大堆脏话,脚趾擦伤,头发也少了很多,24小时后,我找到了罪魁祸首。我使用的是iZettle,一种支付设备,一旦将库添加到项目中,它就崩溃了。iZettle的人承认他们在NSDictionary上有一个分机

代码语言:javascript
复制
@interface NSDictionary (Fractionized)
    - (NSDate *)dateForKey:(id)aKey;
@end

这与HomeKit中的一个扩展冲突,所以这就是问题的原因。结果是他们不得不在他们的扩展名上添加一个前缀,然后重新编译库。

EN

回答 1

Stack Overflow用户

发布于 2017-02-08 07:55:07

虽然使用符号化的堆栈跟踪会有所帮助,但您的日志中有一个符号可能会提供有用的提示:有东西试图向NSDate请求长度。根据我的经验,当一个库期望某个东西是一个NSString,而它又要解析它或打印它时,就会发生这种情况。

也许您知道NSDates在哪里被使用。它还将有助于了解崩溃是否在执行上述代码的同一线程上。考虑到您遇到了轻微的延迟,很难说这是否与该代码有关!也许在你的应用程序的其他地方,你是在响应设备本身,给你一个状态更新,或者打印一个你认为是字符串但实际上是日期的值?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42101609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档