Быстрый, писать код для 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, но как это решить?
Ответы
Ответ 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
}
Надеюсь, что поможет