Подтвердить что ты не робот

Быстрый, писать код для ios 7 и 8

У меня есть тестовое приложение, которое я пишу с помощью 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/AC 73969D-1A4C-45AC-99CA-0B3982C1EE36/Timely.app/Timely

Я предполагаю, потому что двоичный код содержит символ api, который не существует в iOS 7, но как это решить?

4b9b3361

Ответ 1

К сожалению, я думаю, что вы используете текущее ограничение, см. это

Что такое препроцессор Swift, эквивалентный сопоставлению проверки версий iOS?

Единственный способ обойти это - добавить файл Objective-C, а затем использовать макросы #if и сделать две вспомогательные функции, которые вы вызываете из Swift (один для iOS8 и один для iOS7). Я ожидаю, что это будет исправлено в какой-то момент.

Ответ 2

В Beta6 кажется, что некоторые (все?) проблемы связывания были исправлены. Приложения, связанные с UIAlertAction и UIAlertController, не запускались на 7.1, но теперь будут запущены. Вы все еще не можете использовать их в 7.1, но вы можете проверить версию iOS и использовать старые объекты.

Ответ 3

У меня возникла аналогичная проблема, поэтому для любого, кто имеет это, вот еще одно возможное решение:

Если вы перейдете к своей цели > Общие > Связанные структуры и библиотеки, вы должны увидеть UIKit (если нет, добавьте ее). Убедитесь, что рядом с ним указано "Необязательно", а не "Обязательно"...

Ответ 4

Это своего рода грязный хак, но он работает для меня:

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

Ответ 5

Существует очень хороший ответ Prasath, но он написан в Objective-C,
поэтому я написал что-то подобное в быстрой:

(проверено в 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
}

Надеюсь, что поможет