最近2天,我在我的iOS应用程序中找到了一个奇怪的行为。当你开始怀疑一切时,这是其中一个时刻。我发现了问题并修复了它。但是我想在这里写这个来搜索答案并获得有关系统背后的知识。
我是HomeKit" Controller的开发者,这是一款控制HomeKit设备的应用程序。在HomeKit中,你有 HMActionSet 来一次执行许多更改。 E.g。打开所有灯。
执行 HMActionSet 是一项基本功能,并且始终。这里只需轻扫UITableViewCell。
let performAction = UIContextualAction(style: .normal, title: AppStrings.Actions.perform, handler: { (ac: UIContextualAction, view: UIView, success: @escaping (Bool) -> Void) in
self.home?.executeActionSet(selectedActionSet, completionHandler: { (error: Error?) in
if let err = error {
UIApplication.printToConsole(text: err)
success(false)
return
}
success(true)
})
})
但是突然间它停止了一个新的开发版本的完美运行。当我没有执行动作集时,我花了一些时间来重现这种情况。
控制台记录此错误:
Error Domain=HMErrorDomain Code=2 "Object not found." UserInfo={NSLocalizedDescription=Object not found.}
我向后退了每一次提交,直到问题解决了。在一次太大的提交中深陷挖掘之后,我找到了根本原因。
但为什么我没有收到编译错误?为什么要进入主屏幕会破坏它?
对于新功能,我需要一种在多个设备上识别HomeKit对象的新方法,因为.uniqueIdentifier
参数在每台设备上都有盐渍。
import Foundation
import HomeKit
protocol Identifyable {
func getUniqueIdentifier() -> String?
}
extension HMActionSet: Identifyable {
func getUniqueIdentifier() -> String? {
return self.name.toBase64()
}
}
我创建了一个swift协议并对HMActionSet进行了扩展。当然,现在我发现它看起来很愚蠢的错误,将方法命名为getter 。但这不应该是现在的讨论。看起来这个方法覆盖了 HMActionSet的属性。执行actionSet内部函数时,意外使用了错误的uniqueIdentifier,因此错误是正确的。 (没有找到对象)。
/*!
* @brief A unique identifier for the action set.
*/
@available(iOS 9.0, *)
open var uniqueIdentifier: UUID { get }
如果我将方法命名为func uniqueIdentifier() -> String?
,Xcode会立即向我显示警告。
Method 'uniqueIdentifier()' with Objective-C selector 'uniqueIdentifier' conflicts with getter for 'uniqueIdentifier' with the same Objective-C selector
据我所知,HomeKit是用Objective-C编写的。我正在使用swift 4。
getUniqueIdentifier()
)?期待阅读关于偷走我睡眠的问题的解释。 :)