迅速,编写代码为ios 7和8

我有一个testing应用程序,我正在用Swift编写,我想要iOS 7的目标。但启用本地通知,我需要添加

application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Alert | UIUserNotificationType.Badge, categories: nil)) 

但是这个调用在iOS 7中不可用,所以我补充说

 var version:NSString = UIDevice.currentDevice().systemVersion as NSString; if version.doubleValue >= 8 { // ios 8 code } 

ios 8代码块只在iOS 8(Tested)下运行,但是在iOS 7中运行应用程序时,我仍然可以得到

dyld:找不到符号:_OBJC_CLASS _ $ _ UIUserNotificationSettings引用自:/var/mobile/Applications/AC73969D-1A4C-45AC-99CA-0B3982C1EE36/Timely.app/Timely预计位于:/System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/AC73969D-1A4C-45AC-99CA-0B3982C1EE36/Timely.app/Timely

我认为这是因为二进制文件包含了iOS 7中不存在的API的符号,但是我如何解决这个问题?

不幸的是,我认为你正在遇到目前的局限,看到这个

什么是Swift预处理器相当于iOS版本检查比较?

解决这个问题的唯一方法是添加一个Objective-C文件,然后使用#ifmacros,并创build两个从Swift调用的帮助函数(一个用于iOS8,一个用于iOS7)。 我预计这个问题会在某个时候被修正。

在Beta6中,似乎有一些(全部)的链接问题已经修复。 与UIAlertAction和UIAlertController链接的应用程序曾经无法在7.1上启动,但现在将启动。 您仍然无法在7.1中使用它们,但是您可以testingiOS版本并使用较旧的对象。

我遇到了类似的问题,所以对于任何人有这个,这里是另一个可能的解决scheme:

如果你去你的目标>常规>链接框架和库,你应该看到UIKit(如果没有,添加它)。 请确保它旁边显示“可选”而不是“必需”…

这是一种肮脏的黑客攻击,但它适用于我:

 if(UIApplication.sharedApplication().respondsToSelector("isRegisteredForRemoteNotifications")){ println("is iOS8") } 

Prasath有一个非常好的答案 ,但它是用Objective-C编写的,
所以我写了类似的东西:

(在Xcode 6中testing)

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // ... // Set Notification if UIApplication.sharedApplication().respondsToSelector(Selector("registerUserNotificationSettings:")) { // Notifications for iOS 8 let notificationSettings = UIUserNotificationSettings(forTypes: .Alert | .Sound, categories: nil) UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings) } else { // Notifications for iOS < 8 UIApplication.sharedApplication().registerForRemoteNotificationTypes(.Alert | .Sound) } // ... return true } 

希望有所帮助