swift,为ios 7和8编写代码

时间:2014-06-17 05:51:09

标签: ios swift

我有一个测试应用程序我正在用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符号,但我该如何解决?

5 个答案:

答案 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
}

希望有所帮助