Ao tentar se registrar para receber notificações push no iOS 8.x:
application.registerForRemoteNotificationTypes(UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound)
Estou tendo o erro a seguir:
registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later.
Alguma idéia de qual é a nova maneira de fazer isso? Funciona quando executo este aplicativo Swift no iOS 7.x.
EDITAR
No iOS 7.x, quando incluo o código condicional que recebo (SystemVersion condicional ou #if __IPHONE_OS_VERSION_MAX_ALLOWED> = 80000)
dyld: Symbol not found: _OBJC_CLASS_$_UIUserNotificationSettings
objective-c
ios8
apple-push-notifications
dyld
Wojtek Turowicz
fonte
fonte
Respostas:
Como você descreveu, será necessário usar um método diferente com base em diferentes versões do iOS. Se sua equipe estiver usando o Xcode 5 (que não conhece nenhum seletor do iOS 8) e o Xcode 6, será necessário usar a compilação condicional da seguinte maneira:
Se você estiver usando apenas o Xcode 6, poderá usar apenas isso:
O motivo é que o modo como você obtém permissões de notificação mudou no iOS 8. A
UserNotification
é uma mensagem mostrada ao usuário, remota ou local. Você precisa obter permissão para mostrar um. Isso é descrito no vídeo da WWDC 2014 "O que há de novo nas notificações do iOS"fonte
__IPHONE_OS_VERSION_MAX_ALLOWED
verificar isso porque é uma verificação em tempo de compilação.registerUserNotificationSettings:
está documentado aquiPara iOS <10
Para iOS10
fonte
systemVersion
, você deve verificar #[[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]
[[UIApplication sharedApplication] registerForRemoteNotifications];
não acessaráapplication:didRegisterForRemoteNotificationsWithDeviceToken:
ouapplication:didFailToRegisterForRemoteNotificationsWithError:
se um usuário desativou "Permitir notificações" em Configurações -> Notificações -> <Meu aplicativo>.Com base na resposta de @ Prasath. É assim que você faz no Swift :
fonte
O iOS 8 alterou o registro de notificações de uma maneira não compatível com versões anteriores. Embora você precise oferecer suporte ao iOS 7 e 8 (e embora os aplicativos criados com o SDK 8 não sejam aceitos), você pode verificar os seletores necessários e chamá-los condicionalmente corretamente para a versão em execução.
Aqui está uma categoria no UIApplication que oculta essa lógica por trás de uma interface limpa para você, que funcionará no Xcode 5 e no Xcode 6.
Cabeçalho:
Implementação:
fonte
Settings
e desativar as notificações,isRegisteredForRemoteNotifications
ainda retornosYES
Eu acho que essa é a melhor maneira de manter a compatibilidade com versões anteriores, se seguirmos essa abordagem, ela está funcionando para o meu caso e espero que funcione para você. Também é muito fácil de entender.
fonte
if ([UIApplication instancesRespondToSelector:@selector(registerForRemoteNotifications)])
como mostrado aquiPara os de inclinação rápida:
fonte
Eu não conseguia descobrir o que a variável NSSet "categorias" deve ser definida, por isso, se alguém puder me informar, terei prazer em editar esta postagem. A seguir, porém, é exibida a caixa de diálogo de notificação por push.
Editar: recebi uma notificação por push para enviar ao meu telefone com esse código, então não tenho certeza se o parâmetro de categorias é necessário.
fonte
categories
é usado para configurar ações de notificação no iOS 8. Você pode ver o vídeo da WWDC 2014 "O que há de novo nas notificações do iOS" para obter mais detalhesPortanto, 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 é:
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:
fonte
Se você deseja adicionar suporte ao IOS7 IOS8, pode aplicar esse código ao seu projeto.
fonte
Após o Xcode 6.1 Beta, o código abaixo funciona, uma leve edição no código Tom S que parou de funcionar com o 6.1 beta (trabalhou com o beta anterior):
fonte
Você pode usar isso
fonte
Swift 2.0
fonte
Se tudo o que você precisa é do código ios 8, isso deve ser feito.
fonte
Esta é a maneira mais limpa de fazer e funciona muito bem
fonte
para iOS 8 e superior
fonte