【发布时间】:2017-03-03 20:22:37
【问题描述】:
我们有一个支持 iOS 9+ 的应用程序,它正在 Swift 3 和 Xcode 8.2.x 中开发。 iOS 10 引入了一种注册推送通知的新方法,很好地描述了in this post。由于 iOS 9 不知道 User Notifications 框架,所以我们想在设备是 iOS 9 时使用 iOS 9 方法,而在 iOS 10 上使用 UserNotifications.framework。在 Objective C 中,我们将通过条件编译来实现(例如#ifdef 语句)。
在 Swift 3 中,有一些条件编译工具 #available 和 #if。我们尝试将通知注册代码的分支包装在这两个指令中,应用程序将无法编译。
#available 产生相似的结果
这是针对通用/真实设备的情况。该应用程序将针对模拟器进行编译。
【问题讨论】:
-
这很有趣...无法重现此编译问题。如果您还没有尝试清理项目并删除派生数据?
-
我会在星期一试一试。您是为“通用 iOS 设备”还是实际设备构建?这就是问题发生的地方。正如我提到的,它针对模拟器进行编译。
-
条件编译真的是你想要的吗?你有 iOS 9 和 iOS 10 的单独版本吗?
-
另请注意,
#available不是条件编译,它是运行时检查。 -
是的,在#available 上理解。条件编译是我能想到的最接近的东西。我们想要 iOS 10 上的新框架和 iOS 9 上的旧框架。如果您尝试在 iOS 10 设备(或通用设备)上构建,它不会构建,因为它不知道 UIUserNotificationSettings。当引入 IOS 7 注册方法时,我们进行了类似的检查。我们在 Objective C 中做了类似的事情并且没有问题。我们没有遇到问题,因为 7 仍然知道 6 方法。在这种情况下,似乎 10 并没有识别出 9 路。