WatchKit + Swift 3.1:无法覆盖' handleAction'已被标记为不可用

时间:2017-03-28 20:40:44

标签: swift3 xcode8 watchkit

在Swift 3.1之前,以下代码编译和工作没有任何问题:

import WatchKit
import WatchConnectivity
import Foundation
import UserNotifications

class InterfaceController: WKInterfaceController, WCSessionDelegate {

    override func handleAction(withIdentifier identifier: String?, for notification: UNNotification) {

    // Do something

    }
}

但是,在使用Swift 3.1和WatchKit 3.0版在Xcode 8.3中编译时,我收到以下编译器错误:

  

无法覆盖' handleAction'已被标记为不可用

从代码中删除override会产生另一个编译器错误:

  

覆盖声明需要'覆盖'关键字

根据documentation,带handleAction的方法UNNotification仍然是WKInterfaceController的有效非弃用方法,因此上面的代码应该是有效且可编译的。将WatchKit版本设置为3.1或3.2不会改变任何内容。

有任何想法可以使用Swift 3.1吗?

2 个答案:

答案 0 :(得分:3)

与感谢Nycen,谁把我推到在UNUserNotificationCenterDelegate再看看,我结束了我的WatchKit项目ExtensionDelegate实施UNUserNotificationCenterDelegate,处理UNNotifications根控制器,类似这样的:

import WatchKit
import UserNotifications

class ExtensionDelegate: NSObject, WKExtensionDelegate, UNUserNotificationCenterDelegate {

    func applicationDidFinishLaunching() {
        UNUserNotificationCenter.current().delegate = self
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        if let controller = WKExtension.shared().rootInterfaceController as? InterfaceController {
            // Call to a custom method in the root interface controller to handle the notification
            controller.handleAction(notification: response.notification)
            completionHandler()
        }
    }
}

答案 1 :(得分:2)

TL; DR:您需要使用“UNUserNotificationCenterDelegate”

落后两步,Apple的API Reference目前落后一步。

当前的在线API参考mentions

  

已过时

     

使用handle Action(带标识符:for :)代替。

但是这也被弃用了,如果你打开WKInterfaceController类定义,你会发现以下内容(第238行):

// deprecated
@available(watchOS 2.0, *)
@available(watchOS, deprecated: 3.0, message: "use UNUserNotificationCenterDelegate")
open func handleAction(withIdentifier identifier: String?, forRemoteNotification remoteNotification: [AnyHashable : Any])

@available(watchOS 2.0, *)
@available(watchOS, deprecated: 3.0, message: "use UNUserNotificationCenterDelegate")
open func handleAction(withIdentifier identifier: String?, for localNotification: UILocalNotification)

正如您所看到的,这也被弃用了,但它指向了正确的方向:“使用UNUserNotificationCenterDelegate”。 换句话说,你可以从API参考中想到你正在使用一种不被弃用的方法,但它是。

这与XCode更新有关,我认为它与Swift 3.1没有任何关系。