Redefinir as configurações de notificação por push do aplicativo

173

Estou desenvolvendo um aplicativo com notificações por push. Para verificar todas as formas possíveis de interação do usuário, eu gostaria de testar meu aplicativo quando um usuário se recusar a ativar as notificações por push no meu aplicativo durante a primeira inicialização.

A caixa de diálogo (iniciada por registerForRemoteNotificationTypes), no entanto, aparece apenas uma vez por aplicativo. Como redefinir a memória do meu aplicativo no iPhone OS. Excluir o aplicativo e reinstalar não ajuda.

hanno
fonte

Respostas:

300

Nota técnica TN2265: Solucionando problemas de notificações push

Na primeira vez em que um aplicativo ativado por push se registra para receber notificações por push, o iOS pergunta ao usuário se ele deseja receber notificações para esse aplicativo. Depois que o usuário responde a esse alerta, ele não é apresentado novamente, a menos que o dispositivo seja restaurado ou o aplicativo tenha sido desinstalado por pelo menos um dia.

Se você deseja simular uma execução inicial do seu aplicativo, pode deixá-lo desinstalado por um dia. Você pode obter esse último sem realmente esperar um dia, ajustando o relógio do sistema um dia ou mais, desligando o dispositivo completamente e ligando o dispositivo novamente.

Atualização: conforme observado nos comentários abaixo, esta solução parou de funcionar desde o iOS 5.1. Gostaria de encorajar o arquivamento de um bug na Apple para que eles possam atualizar sua documentação. A solução atual parece estar redefinindo o conteúdo e as configurações do dispositivo.

Atualização: a nota técnica foi atualizada com novas etapas que funcionam corretamente a partir do iOS 7.

  1. Exclua seu aplicativo do dispositivo.
  2. Desligue o dispositivo completamente e ligue-o novamente.
  3. Vá para Configurações> Geral> Data e hora e defina a data com antecedência de um dia ou mais.
  4. Desligue o dispositivo completamente novamente e ligue-o novamente.

ATUALIZAÇÃO a partir do iOS 9

Simplesmente excluir e reinstalar o aplicativo redefinirá o status da notificação para notDetermined(o que significa que os prompts serão exibidos).

Graças à resposta de Gomfucius abaixo: https://stackoverflow.com/a/33247900/704803

ianolito
fonte
16
Alguém já tentou isso com iOS 5.1? Eu segui essas etapas exatamente e ainda não consigo o dispositivo para redefini-lo ... Eu até tentei acertar o relógio no meu Mac antes de instalá-lo via Xcode.
Nrj 21/03
1
Idem ... Eu não recebi um aviso.
Rob
2
A Apple adicionou um novo requisito às diretrizes de envio da AppStore, que dependem do aplicativo para mostrar o prompt. Isso pode sugerir que o prompt automático foi removido no iOS 5.1. No entanto, não há API para consultar as configurações da central de notificações, portanto, não tenha certeza de qual seria o objetivo do prompt. Veja minha resposta a um problema semelhante: stackoverflow.com/questions/10191006/…
Greg
10
Isto é ridículo. A Apple não percebe que desenvolvedores ou mesmo usuários podem querer redefinir essas coisas sem usar uma solução realmente ruim?
Sudo
2
Quando eu tentar isso no simulador, eu estou recebendo o erro código = 3010 "notificações remotas não são suportados no simulador"
Thomas Zimmer
48

Outra solução para testar isso é simplesmente alterando seu ID do pacote. Só não se esqueça de mudar de volta quando terminar!

capikaw
fonte
12
Você também não precisa criar um certificado para o novo ID do aplicativo para testá-lo?
Tony
1
Isso só funcionaria se você estivesse usando perfis de provisionamento baseados em curinga - caso contrário, seria necessário criar um perfil para o novo pacote.
Zorayr 18/05/19
Mesmo se você precisar criar um novo perfil, basta clicar no botão "Corrigir" e aguardar alguns segundos - muito mais rápido do que passar por todos esses ciclos de reinicialização.
Ilya
esta é a solução mais rápida! Funciona muito bem para mim! Ao alterar seu bundle_id, você não poderá assinar o aplicativo com os mesmos "perfis de provisionamento". Mas não se preocupe, no xCode (minha versão 7.1.1), você pode clicar em "corrigi-lo" e ele faz o trabalho. Além disso, não esqueça o onglet "Capacidades", onde você pode ter vários itens para "consertar" (clicando no botão "consertar") e, em seguida, funcionará muito bem!
Dam Fa
Esta resposta é uma opção legítima, mas ainda uma correção de hack para uma situação tola da Apple. Não estou modificando o bundleID nem alternando o relógio do dispositivo. Assim como apropriado, qualquer desenvolvedor pode escrever um código curto mostrando um UIAlertView que pergunta "Permitir notificações por push?" .. Sim = chama o método de registro; Não = chame didFailToRegisterForRemoteNotificationsWithError (etc) .. essa é minha própria solução, minha retirada depois de ler estas perguntas e respostas. Tecnicamente, é a melhor maneira de conscientizar os usuários sobre informações de privacidade ... POR QUE o envio deve estar ativado ou opcional.
Tom Pace
36

No iOS 9.0.2, recebo o "alerta de notificação por push de registro" sempre que excluir o aplicativo e reinstalá-lo. Isso ocorre tanto para downloads de produção da AppStore quanto para o modo adhoc.

ATUALIZAÇÃO: está confirmado que está funcionando no iOS 9.x

Genki
fonte
1
Sinto o mesmo comportamento no iOS 9.x. Eu recomendo que você edite a resposta original adicionando uma ATUALIZAÇÃO:
Yevhen Dubinin
3
Finalmente! Chega de excluir aplicativos, desligar o dispositivo, ajustar o relógio para um horário de avanço e algumas coisas tolas como essa.
Mckemkeskin #
19

Como já observado, a abordagem para redefinir o estado de notificação de um aplicativo em um dispositivo foi alterada para iOS5, uma versão mais recente.

Isso funciona para mim no iOS6:

  • Remova o aplicativo do dispositivo
  • Defina o dispositivo como datetime dois dias ou mais à frente
  • Reinicie o dispositivo
  • Defina o dispositivo como datetime dois dias ou mais à frente
  • Reinicie o dispositivo
  • Instale e execute o aplicativo novamente

No entanto, isso fará com que o prompt inicial apareça novamente - ele não removerá nenhum outro material relacionado ao estado de envio.

micmdk
fonte
Trabalhou para mim também em iOS7, você tem que mudar a data duas vezes, uma vez não funciona
Nath
1
Obrigado! Isso funciona até no iOS 8 (eu tive que redefinir as permissões de envio do Twitter.app, porque não tinha a configuração "Emblemas de ícones de aplicativos" no painel de preferências, nas Configurações).
gklka
9

A lista: /private/var/mobile/Library/RemoteNotification/Clients.plist

... contém os clientes registrados para notificações por push. A remoção da entrada do seu aplicativo fará com que o prompt apareça novamente

Erik Johnson
fonte
11
resposta inútil se você desenvolver para a App Store
samvermette
20
Se isso for possível para jailbreakers, deve ser possível que os desenvolvedores o façam em um telefone não jailbroken, certo? E NÃO é uma resposta inútil, porque isso não é algo que você colocaria em um aplicativo para envio à loja. É para os desenvolvedores fazerem enquanto testam.
Oscar
1
Este arquivo não faz parte do iOS 5.x.
Gmogames 26/11/12
Veja uma resposta atualizada como parte desta pergunta: stackoverflow.com/questions/13021066/…
AriX
7

Fazer programaticamente parece funcionar para mim sempre. Eu tenho uma compilação com a seguinte linha não comentada:

 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

Eu o executo sempre que quero cancelar o registro do PN. Pode ser necessário encerrar o aplicativo explicitamente a partir da lista de recentes e brincar com o Centro de Notificação no aplicativo Configurações para acertar.

Além disso, o prompt da interface do usuário solicitando que o usuário se registre na PN pode não aparecer. Não tenho certeza se foi desativado em qualquer uma das versões recentes do iOS.

dagnytaggart
fonte
Trabalhou para mim iOS 10 / iPhone 6S. Observe que cancelei o registro e excluí o aplicativo antes de reinstalar.
Gabriel Jensen
5

Como ianolito disse, definir a data deve funcionar:

Você pode obter esse último sem realmente esperar um dia, ajustando o relógio do sistema um dia ou mais, desligando o dispositivo completamente e ligando o dispositivo novamente.

Percebi no meu dispositivo (iPhone 4, iOS 6.1.2) que o relógio do sistema estava adiantado um dia ou mesmo alguns dias não funcionou para mim. Por isso, adiei a data para um mês e funcionou e meu aplicativo mostrou o prompt de notificações novamente.

Espero que isso ajude a qualquer pessoa, pode ser uma dor de cabeça!

Vincent Cohen
fonte
1
Por favor, não responda com o "SO mais recente" - ele muda o tempo todo. Esse comportamento parece ainda quebrado no 6.1.2, mas talvez tenha funcionado no 6.0.1?
patr1ck 21/02
Editada a resposta, ainda tem isso na 6.1.2 yes e antes na 6.0.1 também. Só funciona para mim se eu definir pelo menos a data +1 mês.
Vincent Cohen
1
Eu também tinha ouvido a coisa de 24 horas, então tentei e não funcionou 2 dias em avançado. Defina como daqui a três meses e o pop-up de permissão aparecerá novamente! Obrigado!
Marcshilling #
Post antigo, mas feliz em ver que ainda é útil! Boa sorte :)
Vincent Cohen
5

Concordo com o micmdk. Eu tinha uma configuração do ambiente de desenvolvimento com o Push Notifications e precisava de uma maneira de redefinir meu telefone para parecer uma instalação inicial ... e apenas essas etapas precisas funcionaram para mim ... requerem DUAS reinicializações do dispositivo:

Do APPLE TECH DOC:

Redefinindo o alerta de permissões de notificações por push no iOS Na primeira vez que um aplicativo ativado por push registra notificações por push, o iOS pergunta ao usuário se deseja receber notificações para esse aplicativo. Depois que o usuário responde a esse alerta, ele não é apresentado novamente, a menos que o dispositivo seja restaurado ou o aplicativo tenha sido desinstalado por pelo menos um dia.

Se você deseja simular uma execução inicial do seu aplicativo, pode deixá-lo desinstalado por um dia. Você pode conseguir o último sem realmente esperar um dia seguindo estas etapas:

  1. Exclua seu aplicativo do dispositivo.

  2. Desligue o dispositivo completamente e ligue-o novamente.

  3. Vá para Configurações> Geral> Data e hora e defina a data com antecedência de um dia ou mais.

  4. Desligue o dispositivo completamente novamente e ligue-o novamente.

lepert
fonte
Isso foi mencionado como não funcionando mais em outra resposta.
Beau Nouvelle
Funciona muito bem. O que parou de funcionar no iOS 5.1 foi a versão antiga dessa outra resposta, que deixou de fora a reinicialização entre excluir o aplicativo e definir o relógio com antecedência.
Dgatwood
3

Eu me perguntei sobre isso no passado e cheguei à conclusão de que não era realmente um caso de teste válido para o meu código. Não acho que o código do seu aplicativo possa realmente dizer a diferença entre alguém recusar notificações na primeira vez ou depois desativá-lo nas configurações de notificação do iPhone. É verdade que a experiência do usuário é diferente, mas está oculta dentro da chamada para registerForRemoteNotificationTypes.

A chamada unregisterForRemoteNotifications não remove completamente o aplicativo das configurações de notificações - embora remova o conteúdo das configurações desse aplicativo. Portanto, isso ainda não fará com que o diálogo seja apresentado uma segunda vez ao usuário na próxima vez em que o aplicativo for executado (pelo menos não na v3.1.3 com a qual estou testando atualmente). Mas como eu disse acima, você provavelmente não deveria se preocupar com isso.

Kharrison
fonte
Eu esperava uma resposta melhor, mas acho que simplesmente não há uma. Obrigado mesmo assim!
hanno
3

A mesma nota técnica mencionada na resposta aceita ( TN2265 - Solucionando problemas de notificações push) foi atualizada com uma solução para iOS 5 e superior.

Em resumo: crie um backup e restaure-o sempre.

No iOS 5 e posterior, redefina o alerta de permissões de notificações por push restaurando o dispositivo a partir de um backup (r. 11450187). Aqui estão as etapas para fazer isso com eficiência:

  1. Use o Xcode Organizer para instalar seu aplicativo no dispositivo. A chave é instalar o aplicativo pela primeira vez sem executá-lo.
  2. Use o iTunes para fazer backup do dispositivo.
  3. Execute o aplicativo. O alerta de permissões de notificações por push será apresentado.
  4. Quando você deseja redefinir o alerta de permissões de notificações por push, restaure o dispositivo a partir do backup que você criou na primeira etapa.
David Rönnqvist
fonte
Pode ter recomendado isso ao mesmo tempo, mas não o faz mais. A recomendação atual é excluir o aplicativo, reiniciar, ajustar o relógio, reiniciar, opcionalmente, ajustar o relógio para a data e hora corretas e executar o aplicativo.
Dgatwood
2

A Nota técnica da Apple também descreveu que você pode restaurar o dispositivo para redefinir a caixa de diálogo Push Notification.

Não diz que você também pode usar a opção "Geral -> Redefinir -> Apagar todo o conteúdo e configurações" no próprio dispositivo (iOS 5.x).

Mr. Zystem
fonte
1
Pelo que vale a pena: eu apenas tentei 'apagar todas as configurações', e isso não funcionou. Tentando todo o conteúdo e todas as configurações ...
Groxx 25/05
8
E "todo o conteúdo e configurações" realmente funciona, obrigado! Mas santa opção nuclear, Batman! Isso é absolutamente insano.
Groxx
94
Ouvi dizer que comprar um novo dispositivo também limpa o aviso de notificação por push!
31512 Samwellmette
Tentei comprar um novo dispositivo, mas isso também não funcionou. Depois de levar o novo dispositivo para a barra genial, eles trabalharam um pouco de mágica e consertaram mais dinheiro ... Estou surpreso depois de tantos anos que a Apple ainda não forneceu uma maneira prática e simples de redefinir as permissões de envio. É ridículo
Chris
1

Além da resposta de ianolito.

Tive o mesmo problema com um aplicativo que baixei um ano atrás e negando a notificação por push inicialmente. Agora, querendo notificações push de volta, essas etapas funcionaram para mim no iOS 7 beta. Não tenho certeza de quais pontos o acionaram exatamente.

  • Feche e exclua o aplicativo.
  • Vá para as configurações do iCloud e exclua o aplicativo do iCloud. Faça isso em todos os outros dispositivos em que o backup do iCloud para aplicativos está ativado. Depois de desativar e excluir, faça um novo backup. O aplicativo não deve mais ser listado nos backups. (Talvez por isso, a Nota técnica da Apple descrita por ianolito parou de funcionar no iOS 5, pois o iCloud foi introduzido no iOS 5 e muitos têm o backup do iCloud para aplicativos habilitados.)
  • Vá para as configurações de hora e defina a hora com mais de um mês de antecedência.
  • Desligue o iPhone (sem redefinição).
  • Espere um minuto, ligue-o novamente e faça o download do aplicativo novamente.
  • Inicie o aplicativo e fui apresentado o diálogo novamente.
  • Ative o backup do aplicativo novamente, pois ele ainda está desativado. Corrija a hora.

Graças a Deus eu não precisei "Apagar todo o conteúdo e configurações". Talvez isso ajude alguém.

Masa
fonte
1

Recentemente, deparei-me com um problema semelhante com o aplicativo react-native. A versão do iPhone OS era 13.1. Desinstalei o aplicativo e tentei instalar o aplicativo e notei que as permissões de localização e notificação não eram solicitadas.

Ao verificar as configurações, pude ver que meu aplicativo estava ativado para localização (da instalação anterior), mas não havia entrada correspondente na notificação. Tentei desinstalar e reiniciar sem definir o horário, pois não funcionou. Btw, eu também tentei baixar o aplicativo Appstore, ainda o mesmo comportamento.

O problema foi resolvido somente após a configuração da hora do dispositivo.

RUppal
fonte
0

Após horas de pesquisa e sem sorte com as sugestões acima, isso funcionou como um encanto para 3.x +

override func viewDidLoad() {
        super.viewDidLoad()


            requestAuthorization()

}

func requestAuthorization() {

        if #available(iOS 10.0, *) {

            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
                print("Access granted: \(granted.description)")
            }

        } else {
            // Fallback on earlier versions
        }

    }
Felecia Genet
fonte