在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吗?
答案 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没有任何关系。