我有一个测试应用程序我正在用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(经测试)下运行,但在iOS 7中运行应用程序时我仍然可以
dyld:未找到符号:_OBJC_CLASS _ $ _ UIUserNotificationSettings 参考自:/var/mobile/Applications/AC73969D-1A4C-45AC-99CA-0B3982C1EE36/Timely.app/Timely 预期在:/System/Library/Frameworks/UIKit.framework/UIKit 在/var/mobile/Applications/AC73969D-1A4C-45AC-99CA-0B3982C1EE36/Timely.app/Timely
我认为这是因为二进制文件包含iOS 7中不存在的api符号,但我该如何解决?
答案 0 :(得分:2)
不幸的是,我认为你遇到了当前的限制,请看这个
What is the Swift preprocessor equivalent to iOS version check comparison?
解决这个问题的唯一方法是添加一个Objective-C文件,然后使用#if
宏并制作两个你从Swift调用的辅助函数(一个用于iOS8,一个用于iOS7)。我希望这会在某个时候得到解决。
答案 1 :(得分:1)
在Beta6中,似乎已经修复了一些(全部?)链接问题。与UIAlertAction和UIAlertController链接的应用程序曾经无法在7.1上启动,但现在将启动。您仍然无法在7.1中使用它们,但您可以测试iOS版本并使用旧版本的对象。
答案 2 :(得分:0)
我遇到了类似的问题,所以对于任何有此问题的人来说,这是另一种可能的解决方案:
如果你去你的目标>一般>链接的框架和库,你应该看到UIKit(如果没有,添加它)。确保它旁边显示“可选”而不是“必需”...
答案 3 :(得分:0)
这是一种肮脏的黑客,但它适用于我:
if(UIApplication.sharedApplication().respondsToSelector("isRegisteredForRemoteNotifications")){ println("is iOS8") }
答案 4 :(得分:0)
very good answer 有一个Prasath,但它是用 Objective-C 编写的, 所以我在 swift 中写了类似的东西:
(在 Xcode 6 中测试)
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
}
希望有所帮助