Portanto, como o AnyObject é o sucessor espiritual do id, você pode chamar qualquer mensagem que desejar no AnyObject. É o equivalente a enviar uma mensagem para id. Ok, é justo. Mas agora adicionamos o conceito de que todos os métodos são opcionais em AnyObject e temos algo com o qual podemos trabalhar.
Dado o exposto, esperava-me que pudesse converter UIApplication.sharedApplication () para AnyObject, criar uma variável igual à assinatura do método, definir essa variável para o método opcional e testar a variável. Isso não pareceu funcionar. Meu palpite é que, quando compilado no iOS 8.0 SDK, o compilador sabe onde ele acha que esse método deve estar, otimizando tudo isso em busca de memória. Tudo funciona bem até eu tentar testar a variável; nesse momento, recebo um EXC_BAD_ACCESS.
No entanto, na mesma palestra da WWDC em que achei a jóia sobre todos os métodos opcionais, eles usam o Encadeamento opcional para chamar um método opcional - e isso parece funcionar. A parte ruim é que você precisa realmente chamar o método para saber se ele existe, o que, no caso de se registrar para receber notificações, é um problema, porque você está tentando descobrir se esse método existe antes de criar um Objeto UIUserNotificationSettings. Parece que chamar esse método com nada é bom, então a solução que parece estar funcionando para mim é:
var ao: AnyObject = UIApplication.sharedApplication()
if let x:Void = ao.registerUserNotificationSettings?(nil) {
// It's iOS 8
var types = UIUserNotificationType.Badge | UIUserNotificationType.Sound | UIUserNotificationType.Alert
var settings = UIUserNotificationSettings(forTypes: types, categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
} else {
// It's older
var types = UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound | UIRemoteNotificationType.Alert
UIApplication.sharedApplication().registerForRemoteNotificationTypes(types)
}
Após muita pesquisa relacionada a isso, as principais informações vieram desta conversa da WWDC https://developer.apple.com/videos/wwdc/2014/#407 bem no meio, na seção sobre "Métodos opcionais em protocolos"
No Xcode 6.1 beta, o código acima não funciona mais, o código abaixo funciona:
if UIApplication.sharedApplication().respondsToSelector("registerUserNotificationSettings:") {
// It's iOS 8
var types = UIUserNotificationType.Badge | UIUserNotificationType.Sound | UIUserNotificationType.Alert
var settings = UIUserNotificationSettings(forTypes: types, categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
} else {
// It's older
var types = UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound | UIRemoteNotificationType.Alert
UIApplication.sharedApplication().registerForRemoteNotificationTypes(types)
}