Swift 3和Xcode 8.2中用户通知的条件编译

我们有一个支持iOS 9+的应用程序,它正在Swift 3和Xcode 8.2.x中开发。 iOS 10引入了一种注册推送通知的新方法, 在本文中有详细描述。 由于iOS 9不了解用户通知框架,因此我们希望在设备为iOS 9时使用iOS 9方法,并在iOS 10上使用UserNotifications.framework 。在目标C中,我们将通过条件编译实现此目的(例如#ifdef语句)。

在Swift 3中,有一些条件编译工具#available#if 。 我们尝试将通知注册码的分支包含在这些指令中的任何一个中,并且应用程序将不会编译。 编译错误 #available生成类似的结果

在针对通用/真实设备时就是这种情况。 该应用程序将针对模拟器进行编译。

根据您上面的评论,您需要运行时检查,而不是条件编译,而#available就是这样。

这对我来说很好:

 if #available(iOS 10.0, *) { UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound]) { (granted, error) in } } else { UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil)) } 

UIUserNotificationSettings在iOS 10中已弃用,但它实际上仍然存在。 Apple通常不会删除API,直到它们被弃用了很长时间。

我怀疑你还有其他一些构建问题。 我的头脑:您是否正确设置了Base SDK和部署目标?