You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

类型'WatchManager'未遵循协议'WCSessionDelegate'问题求助

解决WatchManager不遵守WCSessionDelegate协议的问题

这问题我维护老项目时也碰到过,新项目能正常构建但老项目死活报协议不兼容,试过各种清理都没用,大概率是项目配置或者协议实现的细节没注意到,咱们一步步来排查:

1. 先确认核心实现细节有没有漏

WCSessionDelegate协议有几个必须实现的方法,而且不同Xcode/Swift版本对必需方法的要求可能有差异,你得确保这些方法都写全了:

  • 首先,你的WatchManager必须继承自NSObject,因为WCSessionDelegate是基于Objective-C的协议,声明要写成:
    class WatchManager: NSObject, WCSessionDelegate {
        // 你的代码
    }
    
  • 然后必须实现激活完成的方法:
    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
        // 这里写你的激活逻辑,比如处理错误或者状态变更
    }
    
  • 如果是iOS端的实现,还必须实现sessionDidDeactivate方法(watchOS端部分版本也要求):
    func sessionDidDeactivate(_ session: WCSession) {
        // 处理会话失活,比如重新激活会话
        session.activate()
    }
    

2. 检查文件的Target Membership

老项目的Target配置往往比较复杂,你要确认WatchManager.swift文件是否同时添加到了iOS主TargetwatchOS Extension Target里:

  • 在Xcode中选中WatchManager.swift,打开右侧的File Inspector面板,看Target Membership部分,确保对应的两个Target都被勾选了。如果只勾了一个,另一个Target里的代码就会因为缺少协议方法实现而报错。

3. 确认框架导入和项目配置

  • 确保在WatchManager.swift文件顶部导入了WatchConnectivity框架:
    import WatchConnectivity
    
  • 检查项目的Capabilities:在iOS主Target和watchOS Extension Target的Capabilities面板里,确认Watch Connectivity已经开启(开关是绿色的)。老项目可能没开启这个权限,导致协议相关的编译检查异常。

4. 检查Swift版本和编译设置

  • 对比新项目和老项目的Swift版本:在Xcode中打开老项目的Build Settings,搜索Swift Language Version,改成和新项目一致的版本(比如都是Swift 5.7)。不同Swift版本对协议的必需方法判定可能不同,老版本的可选方法在新版本可能变成必需的。
  • 如果老项目有Objective-C混编,试试给协议方法加上@objc标记,确保Swift方法能被Objective-C runtime识别:
    @objc func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
        // 实现代码
    }
    

5. 最后试试重置Xcode全局缓存

有时候Xcode的全局缓存会有奇怪的问题,你可以试试:

  • 关闭Xcode,删除~/Library/Caches/com.apple.dt.Xcode文件夹(这是Xcode的全局缓存,比派生数据更彻底)
  • 重新打开项目,用快捷键Cmd+Shift+Option+K清理Build Folder后再构建

如果以上步骤都试过还是不行,你可以把老项目的WatchManager代码和新项目的做逐行对比,看看有没有细微的差异(比如方法参数的拼写、大小写,或者有没有遗漏的协议方法)。

内容的提问来源于stack exchange,提问作者TyM6JIep

火山引擎 最新活动