迅速,编写代码为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文件,然后使用#if
macros,并创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 }
希望有所帮助