Estou tentando muito criar um aplicativo iOS simples e simples que possa receber notificações por push. Minha única razão para fazer isso é estabelecer um procedimento para outros membros da equipe usarem e não conseguirem encontrar uma versão de trabalho atualizada dessas instruções em outras partes da Web. Nossa loja é relativamente nova para desenvolvedores iOS, eu pessoalmente sou completamente inexperiente com desenvolvedores iOS e Xcode. Eu tropecei em dezenas de tutoriais, artigos e publicações de problemas da Apple e de outros lugares e sinto que posso estar quase lá ...
Aqui é onde eu tenho que ir (note que estou usando o Xcode 4.3 e tentando inicialmente implantar apenas no iOS 5.1, e concluo que algumas coisas podem ter mudado recentemente em relação às versões anteriores do Xcode, mas, novamente, sou novo em todos isso - e considerando-o completamente confuso e complicado):
1) Eu tenho um perfil de provisionamento no meu iPhone que possui o Push ativado
2) No meu projeto Xcode de teste, selecionei esse perfil de provisionamento como a identidade de assinatura (em Configurações de compilação> Assinatura de código)
3) Tenho meu identificador de pacote configurável em Resumo e Informações> Propriedades personalizadas de destino do iOS definidas corretamente * (acho?)
4) Tenho registerForRemoteNotificationTypes sendo chamado no didFinishLaunchingWithOptions do meu delegado
5) Eu tenho didRegisterForRemoteNotificationsWithDeviceToken e didFailToRegisterForRemoteNotificationsWithError no meu delegado, configurado para registrar o token ou erro do dispositivo, respectivamente
6) Eu tenho Habilitar Autorizações verificadas em Resumo.
7) Logo abaixo do arquivo de direitos selecionado, é Tinker6 (o nome do meu projeto de teste), que foi gerado automaticamente quando eu marquei Habilitar direitos.
8) No arquivo Tinker6.entitlements, obtive o seguinte (que reuni está correto com base em várias postagens diferentes em toda a web, mas que não consigo encontrar nada definitivo da própria Apple):
Atualizada
9) Além disso, tentei a coisa toda sem um arquivo de direitos e obtive essencialmente o mesmo resultado.
10) O conteúdo do meu arquivo mobileprovision inclui direitos corretamente (eu embaralhei o número e o domínio, mas estruturalmente o mesmo):
<key>application-identifier</key>
<string>12355456A7.com.whatever.tinker</string>
<key>aps-environment</key>
<string>development</string>
<key>get-task-allow</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>12355456A7.*</string>
</array>
/ fim de atualização
Quando tento executar isso no meu dispositivo, recebo o seguinte erro na saída do Xcode:
2012-06-11 12:45:23.762 Tinker6[13332:707] Failed to get token, error:
Error Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment'
entitlement string found for application" UserInfo=0x24a3b0
{NSLocalizedDescription=no valid 'aps-environment' entitlement string
found for application}
Eu tentei definir get-task-allow como NO, aps-environment para produção, todas as quatro combinações possíveis, a mesma coisa.
Como posso superar isso? Onde está a documentação definitiva sobre isso?
- mais informações a seguir -
* Quanto ao ID do pacote, ainda não estou claro como isso deve ser definido em relação aos IDs do aplicativo e do perfil no perfil de provisionamento. No portal de aprovisionamento em IDs de aplicativos, eu tenho isso (novamente, embaralhamos o número e o domínio):
E o ID do pacote de dois locais está definido, tenho o seguinte:
Não tenho certeza de que elas estejam corretas ou se um ou ambos devem ser definidos como 12355456A7.com.whatever.tinker, embora eu tenha tentado aqueles no início do processo sem sucesso ...
Note que percebo que existem muitas postagens com títulos semelhantes, mas todas parecem desatualizadas com base nos nomes dos arquivos e outros dados fornecidos, e o fato de que nenhuma das soluções parece ser útil. Espero que o maior nível de detalhe que forneça justifique uma resposta de qualidade. Provavelmente atribuirei uma recompensa o mais rápido possível e, se você der uma resposta de alta qualidade que leve a uma solução, concederei a recompensa e promoverei sua resposta via twitter e meu blog. Especialmente se você postar de forma cruzada um artigo realmente bom "aqui estão as 500 etapas exatas que você precisa para que um aplicativo de notificação por push simples funcione, incluindo aprovisionamento e tudo o mais" no seu blog ou seja o que for.
Primeiro, você não precisa do arquivo de autorizações, a menos que esteja adicionando pares de chave / valor personalizados que não existem no perfil de provisionamento. Quando seu aplicativo é criado, quaisquer direitos do perfil de provisionamento serão copiados para o aplicativo.
Dado que você ainda vê uma mensagem de erro sobre direitos ausentes, só posso assumir que as opções de assinatura de código não estão corretas nas configurações de compilação.
Você precisa garantir que o perfil correto esteja selecionado para a configuração "Debug" e, para garantir, selecionou o perfil correto para o "Debug" e o nó filho chamado "Any iOS SDK":
Embora esta captura de tela mostre o perfil "Desenvolvedor automático" selecionado, escolha o perfil de provisionamento exato desejado na lista suspensa, apenas para fins de teste. Pode ser que o Xcode esteja escolhendo automaticamente um perfil diferente daquele que você deseja.
Além disso, certifique-se de fazer uma compilação limpa, exclua completamente o aplicativo do seu dispositivo etc. Isso é apenas para garantir que você não tenha um cotão velho por aí.
fonte
-
antes do caminho:codesign -d --entitlements - /path/to/my.app
. Nesse momento, também vale a pena verificar se você está no diretório Debug-iphoneos, pois "Show In Finder" às vezes pode levá-lo ao lugar errado.Eu enfrentei esse problema no Xcode 8. Você deve habilitar o Target—> resources—> push notification. Verifique a captura de tela.
fonte
A maneira mais fácil é fazer isso em suas contas com o Xcode:
Vá para o Xcode -> Preferências -> Escolha a guia Contas -> Exibir detalhes -> Clique no botão Atualizar no canto inferior esquerdo -> Concluído.
Construa novamente e deve funcionar.
fonte
Ok, eu já enfrentei o problema antes. Como a notificação por push requer implementação no servidor, recriar o perfil não era uma opção. Então, encontrei esta solução SEM criar um novo perfil de provisionamento.
O Xcode não está selecionando corretamente o perfil de provisionamento correto, embora este seja selecionado corretamente.
Primeiro vá ao organizador. Na guia Dispositivos, perfil de provisionamento da lista Biblioteca, selecione o perfil pretendido que estamos tentando usar. Clique com o botão direito do mouse e depois em "Revelar perfil no Finder".
O perfil correto será selecionado na janela aberta do Finder. Anote o nome.
Agora vá para Xcode> Log Navigator. Selecione o filtro para "Todas" e "Todas as mensagens". Agora, na última fase (Build Target), procure a etapa chamada "ProcessProductPackaging" e expanda-a. Anote o nome do perfil de provisionamento. Eles NÃO devem corresponder se você estiver tendo o erro.
Agora, na janela do Opened Finder, exclua o perfil de provisionamento não autorizado que o Xcode está usando. Agora construa novamente. O erro deve ser resolvido. Caso contrário, repita o processo para encontrar outro perfil não autorizado para removê-lo.
Espero que isto ajude.
fonte
A resposta foi: recomeçar, faça tudo igual, mas crie um novo perfil de provisionamento e instale-o. Isso funcionou. A inspeção de todos os detalhes (direitos na provisão móvel) parece exatamente igual a tudo na minha pergunta aqui. Mas agora funciona. Apple: WAT?
Obviamente, seria óbvio fazer isso se fosse possível excluir perfis de provisionamento. Mas como isso não é possível, eu não queria confundir nossa equipe com vários perfis de teste. Ainda assim, finalmente perdi a paciência e tentei mesmo assim, e acabou funcionando. Whatevs.
fonte
Exclua o antigo perfil de provisionamento do XCode no Organizer.
Em seguida, gere um novo perfil de provisionamento para o mesmo ID de pacote configurável no portal de provisionamento do iOS (depois de ativar o push).
Importe o novo perfil de provisionamento no XCode, defina-o nas configurações de criação do aplicativo.
Construir, correr, funciona.
Eu acabei de fazer isso.
Levei 10 minutos do erro ao sucesso.
fonte
XCode 6.1.1 e várias contas de desenvolvedor da apple
Outra resposta para esse mix já bastante abrangente: eu me deparei com esse problema novamente hoje e, dessa vez, devido ao fato de eu ter várias contas da apple. Precisei primeiro adicionar a segunda conta de desenvolvedor em XCode> Preferências> Contas> +
Verifique se o recurso de notificação por push está ativado
Em seguida, eu precisava ativar explicitamente a compra no aplicativo no aplicativo (não era necessário fazer isso anteriormente). XCode> (a janela do aplicativo)> Alvos> Recursos> Compra no aplicativo ativada (e nesta fase, tive a opção de escolher o certificado correto)
Observe que eu já havia adicionado o certificado ativado por envio por clique duplo no Finder.
fonte
(Xcode 5) Bem, depois de passar uma hora, resolvi meu problema. Mesmo se você gerar novamente o arquivo de provisionamento no Xcode 5, atualize manualmente sua conta. Mudei apenas o arquivo de provisionamento na guia Organizador que não funcionou, o Xcode continuou construindo com o antigo arquivo de provisionamento.
Então vá para
Atualize seus arquivos de provisionamento.
fonte
Meu problema era simplesmente que eu estava assinando com o perfil de provisionamento de curinga gerenciado pelo Xcode.
Depois de criar um perfil específico do aplicativo (e baixá-lo, clicar duas vezes nele e garantir minhas configurações de compilação), recebi com êxito um token de dispositivo APNS.
fonte
Eu tive o mesmo problema que todos os outros e tentei todos os truques acima, nada funcionou. Até excluí e comecei de novo com uma conta de desenvolvedor diferente.
O que funcionou para mim no final foi
Não sei se você pode habilitar isso para um aplicativo curinga, mas depois de tentar pelo menos 12 sugestões diferentes e perder alguns dias, espero que isso ajude alguém
fonte
Você mencionou um perfil de provisionamento, mas não vejo menção a um Apple Push Profile.
Para usar o Push, você deve ter um perfil de push (existem dois, um para desenvolvimento e outro para release). Depois de criá-lo, você precisará verificar se ele contém os certificados relevantes (consulte a seção EDITAR abaixo).
Este é um excelente tutorial que o guiará por todas as etapas:
http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12
Levaria horas, ou qualquer outra pessoa, horas e horas para escrever uma resposta detalhada e detalhada como este tutorial, por isso não tentarei reivindicar a recompensa quando este tutorial já existir.
PS Eu acredito que você não precisa mais de direitos, isso é um legado.
EDIT: Você também deve verificar se possui os perfis necessários no dispositivo - vá para as configurações e, em geral, perfis, verifique se seus perfis estão listados, especialmente o perfil push, é claro. Você também pode verificar isso na seção Organizador do XCode. No Organizer, existem duas seções que dizem Perfis de provisionamento - uma na parte superior esquerda da Biblioteca (esses são os perfis no XCode que você usa para assinar etc.). Você também verá uma seção chamada Perfis de provisionamento para o dispositivo conectado. é o perfil que está instalado no aparelho. Se você não os tiver instalado no aparelho, poderá baixá-los no site do portal de provisionamento e clique no botão Adicionar na parte inferior da janela do Organizer.
Enquanto estiver no portal de provisionamento, verifique também se o Apple Push Profile inclui os certificados: - clique em Provisioning no menu à esquerda - você verá uma lista do seu perfil, selecione EDITAR o perfil push da Apple - você verá uma seção de certificados, com uma lista de desenvolvedores ou testadores etc. que você possui em seu projeto, verifique se a caixa de seleção está marcada para eles. - você também verá uma seção de dispositivos. Verifique se o dispositivo em que você está testando foi adicionado.
Se você tiver perfis antigos no XCode ou no dispositivo, exclua-os e faça o download / atualização / instalação de todos os novos perfis no portal de provisionamento
fonte
Eu me deparei com esse mesmo problema. Para mim, o problema era que o nome do meu produto ($ TARGET_NAME) não estava em maiúsculas da mesma forma que o certificado fornecido pela apple. Por exemplo, eu tinha com.companyid.APNDemo, enquanto o certificado da Apple estava usando com.companyid.apndemo.
Mudei meu alvo para minúsculo e funcionou. Nota: A dica para mim foi que a configuração de assinatura de código nas Configurações de compilação foi definida como meu certificado de desenvolvedor padrão; não o perfil de provisionamento APNTest.
fonte
Muitas das respostas acima estão corretas. No entanto, parece haver mais de um erro possível ao lidar com isso.
O que eu tinha era um problema de letras maiúsculas no meu App ID. Por algum motivo, meu ID do aplicativo não estava em maiúsculas, mas meu aplicativo estava. Depois de recriar o ID do aplicativo com letras maiúsculas corretas, tudo funcionou sem problemas. Espero que isto ajude. Frustrante como o inferno.
PS, se ainda não funcionar, tente editar o campo Identidade de assinatura de código manualmente com "editar". Altere a segunda linha com o nome do nome correto do perfil de fornecimento.
fonte
Levei horas para resolvê-lo. Como alguém usa scripts personalizados para assinar e empacotar enquanto outros usam o próprio xcode, há apenas uma maneira de verificar o que terminou no seu aplicativo. Despejar seus direitos com
codesign --display --entitlements :- path/to/MyApp.app
e verifique
aps-environment
eapplication-identifier
.fonte
Este erro pode ocorrer quando seu certificado expirar.
A solução é renovar o certificado e assinar o aplicativo com ele.
fonte
Você precisa ter em seus perfis de provisionamento ( https://developer.apple.com/account/ios/profile/ ) um perfil de distribuição do iOS.
Ao fazer upload do xCode para a App Store, verifique se você tem o ambiente aps nas autorizações. Caso contrário, faça o download deles em Visualizar contas -> Exibir detalhes -> Baixar tudo.
fonte
Eu tive uma questão semelhante. Estive saltando entre o XCode 7 e 8 por vários motivos. Depois de usar o 8 para construir, você precisará usar o 8. Simplesmente usei o Xcode 8 e apliquei algumas das alterações sugeridas acima e funcionou.
fonte
recriar arquivos provisórios corrigiu todos os meus problemas.
fonte
Parece haver algo peculiar com os direitos 'automáticos' no Xcode 4.6.
Há um arquivo Entitlement.plist para cada SDK em:
Uma solução alternativa que encontrei foi editar este arquivo e adicionar a chave sneaky aps-environment manualmente da seguinte maneira:
Em seguida, o Xcode está gerando o arquivo Xcent correto, que contém a chave aps-environment em:
Você pode localizar onde seu arquivo Xcent é criado usando o Log Navigator do Xcode,
procure "ProcessProductPackaging".
Infelizmente, essa é a única maneira que encontrei que resolve o problema .
(e, finalmente, capaz de obter corretamente o token push agora)
Basta saber se outra solução mais elegante está disponível.
Consulte minha pergunta SO para obter mais detalhes sobre isso:
o direito automático do Xcode 4.6 não está funcionando - "nenhum ambiente aps válido"
fonte
Antes de excluir e regenerar AppIDs / Profiles, verifique se a Biblioteca e o Dispositivo têm os mesmos perfis (e corretos) instalados.
Comecei a ver esse erro depois de migrar para um novo computador. O envio estava funcionando corretamente antes da migração.
O problema era (duh) que eu não havia importado os perfis para a biblioteca Xcode na nova máquina (em Organizador / Dispositivos, em Biblioteca-> Perfis de provisionamento).
A parte confusa foi que o DISPOSITIVO já tinha os perfis certos e eles apareceram conforme o esperado nas configurações de compilação, então tudo parecia correto lá, mas a BIBLIOTECA XCode não os tinha, por isso estava assinando o aplicativo com ... ?? ?
fonte
Foi isso que o corrigiu para mim. (Eu já havia tentado ativar / desativar os recursos, recriar o perfil de provisionamento etc.).
Na guia Configurações de compilação , em Autorizações de assinatura de código , meu arquivo .entitlements não estava vinculado a todas as seções. Depois de adicioná-lo à seção Qualquer SDK , o erro foi resolvido.
fonte
Tentei todas as respostas listadas aqui, mas ninguém resolveu meu problema. No meu caso, esse erro é devido ao meu erro bobo na criação do Appid. Usei o Wildcard App ID em vez de usar o Explicit App ID causou o problema
Se você deseja que um aplicativo receba notificações remotas (notificação por push), precisará usar um ID de aplicativo explícito , como com.tutsplus.push , em vez de com.tutsplus. *
Por favor, encontre o ScreenShot,
fonte