Estou procurando uma maneira de determinar se, por meio de configurações, o usuário ativou ou desativou as notificações por push do meu aplicativo.
207
Estou procurando uma maneira de determinar se, por meio de configurações, o usuário ativou ou desativou as notificações por push do meu aplicativo.
Ligue enabledRemoteNotificationsTypes
e verifique a máscara.
Por exemplo:
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone)
// blah blah blah
iOS8 e superior:
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]
iOS 8
superiores e superiores está errada porque verifica apenas se o usuário se registrou para notificação remota. De acordo com a documentação:This method reflects only the successful completion of the remote registration process that begins when you call the registerForRemoteNotifications method. This method does not reflect whether remote notifications are actually available due to connectivity issues. The value returned by this method takes into account the user’s preferences for receiving remote notifications.
[[UIApplication sharedApplication] currentUserNotificationSettings];
questão de quantumpotato:
Onde
types
é dado porpode-se usar
ao invés de
permitirá que você verifique apenas se as notificações estão ativadas (e não se preocupe com sons, selos, central de notificações etc.). A primeira linha do código (
types & UIRemoteNotificationTypeAlert
) retornaráYES
se "Estilo de alerta" estiver definido como "Banners" ou "Alertas" eNO
se "Estilo de alerta" estiver definido como "Nenhum", independentemente de outras configurações.fonte
grantedSettings.types.contains(notificationType)
Na versão mais recente do iOS, este método está obsoleto. Para oferecer suporte ao iOS 7 e iOS 8, use:
fonte
UserNotifications
. Infelizmente não tenho uma resposta completa agora.Código atualizado para swift4.0, iOS11
Código para swift3.0, iOS10
fonte
Abaixo, você encontrará um exemplo completo que abrange iOS8 e iOS7 (e versões inferiores). Observe que, antes do iOS8, não é possível distinguir entre "notificações remotas desativadas" e "apenas a Visualização no bloqueio de tela ativada".
fonte
Swift 3+
Versão observável do RxSwift para iOS10 +:
fonte
getNotificationSettings(...)
é assíncrona para que o interior de retorno será ignorarAo tentar oferecer suporte ao iOS8 e inferior, não tive muita sorte usando o
isRegisteredForRemoteNotifications
que Kevin sugeriu. Em vez disso, useicurrentUserNotificationSettings
, o que funcionou muito bem nos meus testes.fonte
isEnabled = NO;
em seusif
casos não é necessário, uma vez que foi inicializado comoNO
Infelizmente, nenhuma dessas soluções realmente resolveu o problema, porque no final das contas as APIs estão seriamente ausentes quando se trata de fornecer as informações pertinentes. Você pode fazer algumas suposições, no entanto, o uso do
currentUserNotificationSettings
iOS8 + não é suficiente em sua forma atual para realmente responder à pergunta. Embora muitas das soluções aqui pareçam sugerir que isso ouisRegisteredForRemoteNotifications
é é uma resposta definitiva, na verdade não é.Considere isto:
com os
isRegisteredForRemoteNotifications
estados da documentação:No entanto, se você incluir um
NSLog
delegado simplesmente no seu aplicativo para observar o comportamento, é claro que isso não se comporta da maneira que esperamos que funcione. Na verdade, ele diz respeito diretamente às notificações remotas ativadas para este aplicativo / dispositivo. Uma vez ativado pela primeira vez, isso sempre retornaráYES
. Mesmo desativá-los nas configurações (notificações) ainda resultará nesse retornoYES
, porque, a partir do iOS8, um aplicativo pode se registrar para receber notificações remotas e até mesmo enviar para um dispositivo sem que o usuário tenha as notificações ativadas, elas simplesmente não podem fazer alertas, Emblemas e sons sem o usuário ativá-lo. As notificações silenciosas são um bom exemplo de algo que você pode continuar fazendo, mesmo com as notificações desativadas.Na medida em
currentUserNotificationSettings
que indica uma das quatro coisas:Os alertas estão ativados Os emblemas estão ativados O som está ativado Nenhum está ativado.
Isso não fornece absolutamente nenhuma indicação sobre os outros fatores ou sobre a própria opção de notificação.
De fato, um usuário pode desativar crachás, sons e alertas, mas ainda assim aparecer na tela de bloqueio ou no centro de notificações. Esse usuário ainda deve estar recebendo notificações por push e pode vê-las na tela de bloqueio e no centro de notificações. Eles estão com a notificação ativada. MAS
currentUserNotificationSettings
retornará:UIUserNotificationTypeNone
nesse caso. Isso não é realmente indicativo das configurações reais dos usuários.Algumas suposições podem ser feitas:
isRegisteredForRemoteNotifications
forNO
, você pode assumir que este dispositivo nunca foi registrado com êxito para notificações remotas.application:didRegisterUserNotificationSettings:
é feito um retorno de chamada contendo configurações de notificação do usuário no momento, já que é a primeira vez que um usuário é registrado, as configurações devem indicar o que o usuário selecionou em termos de solicitação de permissão. Se as configurações equivalerem a algo diferente de: aUIUserNotificationTypeNone
permissão push foi concedida, caso contrário, ela foi recusada. A razão para isso é que, a partir do momento em que você inicia o processo de registro remoto, o usuário só pode aceitar ou recusar, com as configurações iniciais de uma aceitação sendo as que você define durante o processo de registro.fonte
Para completar a resposta, poderia funcionar algo como isto ...
editar: isso não está certo. como essas são coisas pouco inteligentes, ele não funcionará com um switch, então acabei usando isso:
fonte
Para iOS7 e versões anteriores, você deve realmente usar
enabledRemoteNotificationTypes
e verificar se é igual (ou não, dependendo do que você deseja)UIRemoteNotificationTypeNone
.No entanto, para o iOS8, nem sempre é suficiente verificar apenas com o
isRegisteredForRemoteNotifications
estado acima. Você também deve verificar seapplication.currentUserNotificationSettings.types
é igual (ou não é igual, dependendo do que você quiser)UIUserNotificationTypeNone
!isRegisteredForRemoteNotifications
pode retornar verdadeiro mesmo quecurrentUserNotificationSettings.types
retorneUIUserNotificationTypeNone
.fonte
fonte
Aqui temos o UIRemoteNotificationType de UIApplication. Ele representa o estado da notificação por push deste aplicativo na configuração, do que você pode verificar seu tipo facilmente
fonte
Eu tento dar suporte ao iOS 10 e superior usando a solução fornecida por @Shaheen Ghiassy, mas encontro um problema de privação
enabledRemoteNotificationTypes
. Portanto, a solução que eu encontrei usando emisRegisteredForRemoteNotifications
vez deenabledRemoteNotificationTypes
que foi preterida no iOS 8. Abaixo está minha solução atualizada que funcionou perfeitamente para mim:E podemos chamar essa função facilmente e estar acessando seu
Bool
valor e podemos convertê-lo no valor da string por este:Espero que ajude os outros também :) Feliz codificação.
fonte
Embora a resposta de Zac estivesse perfeitamente correta até o iOS 7, ela mudou desde que o iOS 8 chegou. Como enabledRemoteNotificationTypes foi descontinuado do iOS 8 em diante. Para o iOS 8 e posterior, você precisa usar isRegisteredForRemoteNotifications .
fonte
Esta solução Swifty funcionou bem para mim ( iOS8 + ),
Método :
Uso :
Ref.
fonte
ré:
isto está certo
mas seguir também está correto! (como UIRemoteNotificationTypeNone é 0)
veja o seguinte
fonte
Veja como fazer isso no Xamarin.ios.
Se você suporta o iOS 10 ou superior, use apenas o método UNUserNotificationCenter.
fonte
No Xamarin, todas as soluções acima não funcionam para mim. Isto é o que eu uso em vez disso:
Ele também recebe uma atualização ao vivo depois que você altera o status da notificação em Configurações.
fonte
Código fácil de copiar e colar, completo, criado a partir da solução da @ ZacBowling ( https://stackoverflow.com/a/1535427/2298002 )
isso também trará o usuário às configurações do seu aplicativo e permitirá que ele ative imediatamente
Também adicionei uma solução para verificar se os serviços de localização estão ativados (e também traz configurações)
GLHF!
fonte