监视应用程序以错误clientIdentifier启动,找不到interfaceControllerID

时间:2016-09-21 07:59:54

标签: ios objective-c watch-os-2

我在watchos2上有一个智能手表应用程序。该应用程序始终有效,但现在启动时我立即收到此错误:

Lop_WatchKit_Extension[17535:7854201] *********** ERROR -[SPRemoteInterface _interfaceControllerClientIDForControllerID:] clientIdentifier for interfaceControllerID:447E0002 not found

我在stackoverflow上找到了一些主题,但没有解决问题。

5 个答案:

答案 0 :(得分:4)

在我的情况下,这是由于我的一个InterfaceController中的保留周期。

如果你得到的日志类似于:

  

[默认] - [SPRemoteInterface   _interfaceControllerClientIDForControllerID:]:0000:ComF:interfaceControllerID的clientIdentifier: XXXXXXXX 未找到

&安培; /或...

  

[default] _SendRecordedValues:000:ComF:< -Plugin controller ID    XXXXXXXX 没有客户端标识符

首先,确定哪个InterfaceController具有控制器ID XXXXXXXX

awake(withContext:)

中有这个
override func awake(withContext context: Any?) {
    //...

    if let id = self.value(forKey: "_viewControllerID") as? NSString {
        let strClassDescription = String(describing: self)

        print("\(strClassDescription) has the Interface Controller ID \(id)")
    }

    //...
}

此日志:

  

[Target.Classname:0xYYYYYYYY]具有接口控制器ID   XXXXXXXX

确定导致这些日志的InterfaceController后,您可以继续进行调试。

在你的情况下可能会有所不同,但在我的情况下,我在我的一个闭包中创建了一个保留周期self,其中需要一段时间才能找到,但我最终用[weak self]打破了保留周期捕获。

基本上,当InterfaceController尝试执行某些代码但已经发布时,会出现错误日志。

我已经拥有的东西:

DispatchQueue.main.async {
    self.doSomethingThatDoesSomethingAsync()
}

我修正了什么:

DispatchQueue.main.async { [weak self] in
    self?.doSomethingThatDoesSomethingAsync()
}

答案 1 :(得分:0)

您是否更改了模块的名称?如果是这种情况,那么您必须浏览故事板并手动更新所有接口。

使用要修复的步骤进行编辑:

转到故事板,为每个界面打开Identity检查器,然后删除Module中的内容并按Enter键,新模块应自动填充。

答案 2 :(得分:0)

如果在任何IBOutlet上使用cryptojs,也会在日志中引发此错误。

didSet

答案 3 :(得分:0)

@nickromano 多么悲伤,当您将 didSetIBOutlets 一起使用时会发生这种情况。因为它在 awake(withContext context: Any?) 之前调用 如果将其包装在 DispatchQueue.main.async

中,我们可以抑制此错误
@IBOutlet var statusLabel: WKInterfaceLabel! {
    didSet {
        DispatchQueue.main.async {
            self.statusLabel.setHidden(true)
        }
    }

答案 4 :(得分:0)

这种情况在我身上发生过几次,而且更多次,这是因为我没有抓住一个计时器,该计时器仍在之前刚刚关闭的 WKInterfaceController 中触发

除了在@staticVoidMan 的回答中比较 ID 之外,最好的做法是读取调用堆栈。就我而言,我能够根据这些提示确定旧计时器仍在触发:

<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.(js|css|jpeg|jpg|gif|png|ico|map)(\?|$) /404error.php     [L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

RewriteRule ^/article/([0-9]*).html$ /article/article.php?id=$1 [NC,L]
RewriteRule ^/relationships/([0-9]*).html$ /article/article.php?id=$1 [NC,L]
</IfModule>

这是原始调用堆栈(供参考):

8   Foundation                          0x00007fff214be867 __NSFireTimer + 67
9   CoreFoundation                      0x00007fff207a8e3f __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
10  CoreFoundation                      0x00007fff207a8912 __CFRunLoopDoTimer + 926