Aplicativo de depuração quando lançado pela notificação por push

135

Atualmente, estou desenvolvendo um aplicativo que recebe notificações por push. Eu tenho tudo isso funcionando 100% através de uma página PHP. Existem vários tipos diferentes de notificações por push que meu aplicativo pode receber. O PHP lida com isso e envia diferentes pacotes de informações para o meu aplicativo, todos recebidos muito bem.

No entanto, quando os usuários "visualizam" a notificação e meu aplicativo é iniciado, eu obviamente quero tomar uma ação diferente da que faria se o usuário tivesse iniciado o aplicativo manualmente - e, além disso, ações diferentes, dependendo do tipo de notificação por push. Eu tenho isso funcionando bem ... estruturalmente.

Um dos meus tipos de push deve abrir um UIView que faça várias conexões com vários servidores diferentes e negocie dados entre si. Esse UIView funciona bem quando, por exemplo, é acionado no menu principal - no entanto, quando minha notificação por push está acionando esse UIView para aparecer, as conexões do soquete não estão funcionando conforme o esperado.

Agora, minha pergunta não é sobre os soquetes, mas mais ainda - Como você depura esse problema? Pelo que posso dizer (sou relativamente novo) quando o aplicativo foi iniciado a partir de uma notificação por push, não há como vincular essa execução ao depurador / console / etc ... Estou tendo muita dificuldade em tentar depurar o código usando UIAlertViews, pois existem muitas linhas de comunicação entre os vários servidores.

Qualquer conselho que você tiver para mim seria muito apreciado.

Dutchie432
fonte

Respostas:

147

No XCode <4.0 (para XCode> = 4, consulte a resposta por delírus abaixo), agora você pode configurar o Xcode para anexar o depurador ao aplicativo depois de iniciá-lo, em vez de iniciá-lo através do depurador. Isso permite depurar coisas que variam com base no estado de inicialização do seu aplicativo, como esquemas de URL, pastas e notificações por push.

  1. No Xcode, procure na barra Origem e, abaixo de Destinos, haverá Executáveis.
  2. Exiba o inspetor do seu aplicativo nos executáveis.
  3. Clique na guia guia Depuração no inspetor.
  4. Desmarque a opção "Iniciar executável após iniciar o depurador"
  5. Marque a opção "Aguardar próxima notificação de ativação / envio"

Agora, quando você clica em debugar no Xcode, em vez de iniciar o aplicativo, uma janela será exibida informando que está aguardando o lançamento do aplicativo. Em seguida, você inicia o aplicativo normalmente no telefone e o Xcode se conecta a ele.

Louis Gerbarg
fonte
37
Eu sei que isso pode não ser apropriado, mas eu amo você. :)
Dutchie432 6/08/09
17
Quando você inicia dessa maneira o stdin, stdout, stderr do seu aplicativo não é roteado para o console do GDB, eles são apontados para onde estão em um lançamento normal do aplicativo. Você pode ver NSLog () s no console do sistema do dispositivo, olhando para o dispositivo no organizador.
Louis Gerbarg
1
Você me ensinou alguns pontos muito valiosos aqui. OBRIGADO. Passei os últimos dois dias tentando depurar algo que consegui corrigir dentro de 20 minutos da sua postagem.
Dutchie432 6/08/09
1
O @stigi trabalha no simulador para testar esquemas de URL. Eu estou usando o Xcode 4.5 se o que importa
dreyln
1
@ Dreyln meu comentário foi de 2009 :) muito mudou desde então. Mas obrigado pela atenção!
313 stigi
124

Para o Xcode 4, você precisa:

  1. Edite seu esquema ativo através do menu suspenso "Esquemas". ( + <)
  2. Em seguida, escolha o seu produto - 'Run MyApp.app' à esquerda.
  3. Selecione a guia 'Informações' à direita.
  4. E, finalmente, escolha a opção "Aguarde o lançamento do MyApp.app".

Mais aqui na seção "Personalizar executáveis ​​no Editor de esquema".

EDIT:
Caso você perca registros no GDB, consulte o comentário de Louis Gerbarg em sua resposta.

matm
fonte
1
Estou com o Xcode 4.2 para Lion e, embora o aplicativo seja iniciado corretamente a partir do esquema de URLs e a execução do depurador não seja interrompida, o console não mostra nada. Estou esquecendo de algo?
LoDani
@ LoDani mesmo aqui, você já descobriu o porquê?
davis 4/12
3
@LoDani, Davis G .: Você viu o comentário de Louis sobre a resposta aceita? stackoverflow.com/questions/1239000/… Quando iniciado dessa maneira, stdin / out / err não é redirecionado para o console.
Ivan Vučica
Obrigado, você salvou o meu dia! Tentando corrigir um bug que só ocorre quando meu aplicativo é iniciado por um manipulador de URL.
Eliot
@delirus - Obrigado por atualizar isso para XCode 4.
Dutchie432
112

Para XCode 10, 9, 8, 7 e 6:

  1. Selecione o esquema na barra de ferramentas (à esquerda do dispositivo com o qual você está depurando)
  2. Escolha Editar esquema
  3. Selecione Executar no painel esquerdo
  4. Para a opção Iniciar , selecione Aguardar o lançamento do executável
  5. Feche o Editor de esquema e execute seu projeto XCode

Agora você pode depurar ao iniciar a partir de uma notificação, URL personalizado ou tocando no ícone do aplicativo.

bgolson
fonte
9
Essa resposta me causou muitos problemas, embora geralmente me colocasse no caminho certo. O passo 3 é um pouco enganador. Você tem que fazer isso, é claro; selecione Executar no painel esquerdo. Mas também deve haver uma etapa 5 com uma redação conceitual muito semelhante: Clique no botão Executar do xcode, antes de esperar os resultados ... Como no começo não funcionou para mim, pedi conselhos a outros colegas de trabalho ... eles perguntaram se fiz a coisa Run, à qual respondi que sim, pensando na opção não. 3 ... Não deve realmente, realmente, realmente ser um passo 5 para isso ...
Florin Odagiu
@FlorinOdagiu Good call. Adicionado o passo 5. Obrigado!
precisa saber é o seguinte
Caso o Xcode restaure uma guia de esquema diferente, a opção Iniciar está localizada na guia Informações.
Nate Whittaker
3
Não estou obtendo nenhuma saída na janela do depurador quando inicio o aplicativo manualmente.
Dvdblk 7/10
3

Como não estou trabalhando com notificações por push, não sei o funcionamento exato das notificações por push. No entanto, eu tentaria imitar o recebimento de uma notificação por push, deixando o método principal do seu programa fingir que uma notificação foi postada, se possível, ou chamando o aplicativo: didFinishLaunchingWithOptions: UIApplicationDelegate no método applicationDidFinishLaunching:.

HTH - Saúde, Daan

drvdijk
fonte
Também é uma boa idéia, mas imitar é sempre o segundo melhor para depurar a coisa real! Feliz codificação!
Dutchie432
3

No Xcode 6:

  1. conectar o iPhone ao Macbook com USB
  2. inicie o aplicativo no iPhone tocando no ícone
  3. No menu de Xcode, Debug> Attach to Process> Escolha seu App
Ali Saeed
fonte
1
Você não poderá depurar o caminho crítico de inicialização com essa abordagem.
Zorayr
2

Para o XCode 11 e 10, você pode fazer o seguinte:

  1. Selecione a opção Esquema.
  2. Escolha Editar esquema.

  3. Selecione a opção Executar no painel esquerdo

  4. Na parte de inicialização, selecione aguardar o lançamento do executável e feche a caixa de diálogo.

  5. Crie e execute o projeto. Agora você pode iniciar o aplicativo tocando no ícone do aplicativo ou na mensagem de notificação.

Ramy Rizkalla
fonte