- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
em viewDidLoad
de uma extensão iOS 8 . a NSLog
saída não é nada no Xcode. NSLog
funciona normalmente no aplicativo de contêiner.
Como posso obter saída de mensagens de depuração de uma extensão?
ios
ios8
xcode6
ios-app-extension
Oh Ho
fonte
fonte
Respostas:
Etapas para depurar uma extensão de aplicativo:
Execute o aplicativo de contêiner. Nesta etapa, o Xcode carrega o aplicativo de contêiner e a extensão de aplicativo para o dispositivo ou simulador.
Pare o aplicativo do contêiner. Esta etapa é importante quando você depura no simulador. Se você não fizer isso, o Xcode informará que o simulador está em uso.
No Xcode, pressione o menu Depurar -> Anexar ao Processo -> Por Identificador de Processo (PID) ou Nome ..., insira o identificador do ext do aplicativo, por exemplo, com.abc.ContainerApp.MyExtension, para iniciar a depuração. Não se esqueça de definir pontos de interrupção. (Atualização em 25 de agosto de 2014: você pode inserir MyExtension (o nome da sua extensão) diretamente.)
No dispositivo ou simulador, abra sua extensão de aplicativo.
Atualizações em 23 de agosto de 2014:
Descobri que as etapas de depuração acima não funcionam bem no Xcode 6 beta 6 com iOS 8 SDK beta 5 no simulador.
Solução:
Os pontos de interrupção funcionam. Mas não sei por que os logs não aparecem na janela de saída.
fonte
Eu também estou tendo esse problema. Funciona para mim se você acessar seu Simulador no menu Depurar -> Abrir Log do Sistema ...
A partir daqui, você pode ver todos os logs do Simulador do iPhone (incluindo os logs de sua extensão).
fonte
NSLog
está funcionando perfeitamente .Você simplesmente não vê o que está sendo registrado na área de depuração do Xcode porque o depurador Xcode não está conectado à sua extensão. As extensões são quase completamente independentes do aplicativo que as contém. Eles têm identificadores de pacote separados, por exemplo, e também são processos separados no SO.
Tive sucesso variado em fazer com que o Xcode fosse anexado a extensões. Supostamente, parece que ele seria anexado automaticamente e aparece no navegador de depuração como "Aguardando anexar", mas nunca é anexado.
Às vezes, consigo executar meu destino de extensão no Xcode:
E então tenho a opção de escolher em qual aplicativo executar minha extensão. Nesse caso, eu escolheria sua recomendação de "hoje", que é a central de notificações.
E às vezes ele anexava o depurador à minha extensão. Observe que este método só funciona em dispositivos físicos, ao que parece.
Se não anexar, você pode usar o método de anexação manual na resposta de @VinceYaun,
Também tive sucesso variado usando outros métodos de fixação. A maioria não teve êxito e parece que são apenas bugs que serão corrigidos posteriormente.
Para visualizar suas mensagens de log, vá para
Window
->Devices
na barra superior e selecione seu dispositivo. Você pode abrir o registro do dispositivo na parte inferior dessa janela. Se você estiver testando em um simulador, pode usar a resposta de @BalestraPatrick .Alguns dos bugs foram corrigidos no Beta 2, e meu palpite é que, eventualmente, o depurador será anexado automaticamente ao iniciar a extensão.
Atualização: nas notas de lançamento do iOS 8 Beta 4 :
fonte
Eu também estou tendo esse problema. O Xcode nunca anexa meu depurador à extensão ou exibe mensagens NSLog. Se você anexar o depurador Xcode manualmente ao processo de extensão, pelo menos os pontos de interrupção funcionam perfeitamente:
fonte
Ele funciona para mim :)
fonte
NSLog
só funcionará se você estiver executando o aplicativo de contêiner. Ele não vai funcionar se você estiver executando o aplicativo de extensão em vez do recipiente.O Xcode 8 é capaz de depurar extensões:
Resultado: pontos de interrupção e log funcionam normalmente.
fonte
O que finalmente me permitiu ver o log na área de depuração, com base na sugestão de Michael e na documentação da Apple , foi:
Crie e execute a extensão de aplicativo no simulador e, quando solicitado por um aplicativo host, escolha o aplicativo específico do qual você vai chamar a extensão . No meu caso, eu estava lançando minha extensão Action do Safari puxando uma folha de compartilhamento em um PDF.
O que não funcionava antes era seguir as sugestões de outras pessoas de usar o Today como host, mas depois deixar o aplicativo e ir para o Safari para ligar para o meu ramal. Não preciso mais executar meu aplicativo de conteúdo antes de executar a extensão.
Da documentação da Apple:
fonte
Na verdade, fiz os logs rodarem de forma bastante simples no Xcode 6.3. Em primeiro lugar, crie e execute o aplicativo que o contém. Assim que o aplicativo contido estiver em execução no dispositivo, crie e execute a extensão do aplicativo alterando o esquema para a extensão do aplicativo.
A Apple tem documentação diretamente relacionada à depuração, criação de perfil e teste de extensão de aplicativo.
fonte
Um truque que funciona para mim (embora seja bastante feio) é colocar um manequim
UILabel
em algum lugar no canto inferior da minha extensão. Eu geralmente chamo issologLabel
. Então, é possível atualizar o texto desse rótulo com qualquer declaração de log que você deseja registrar. Essa abordagem não é muito boa se você precisar registrar instruções de instâncias de classes diferentes. E, obviamente, isso confunde sua IU.No entanto, se você tiver um widget bastante simples e não se importar com uma pequena desordem da IU, isso resolverá o problema. Tentei todas as outras soluções descritas nesta discussão e, infelizmente, nenhuma delas funcionou para mim.
fonte
A única maneira de depurar funciona para mim é selecionando Depurar-> Anexar ao processo por PID ou nome Em seguida, insira o PID, não o nome da extensão. Você pode encontrar o PID executando a extensão em um dispositivo, vá para Janela-> Dispositivos. Encontre o seu dispositivo e visualizando o console. Quando você vir o nome do seu ramal, ele será seguido por um número de 5 dígitos. Esse é o PID
Eu também coloquei um monte de NSLogs na extensão para encontrar o PID também. Isso está no xCode 7
fonte
Encontre o mesmo problema sobre a extensão
NSLog
e os pontos de interrupção. Lutei contra isso por muitos dias.Device log
pode ser encontrado como imagem a seguir. É àsXCode -> Window -> Devices and Simulators
.Depois de inserir o
Open Console
, há um campo de pesquisa no canto superior direito da caixa de diálogo. Posso aplicar a regra do filtro lá. Por exemplo, um nome de processo contémNotification
uma palavra-chave ou o nome do processo deve ser igual ao nome do destino da extensão, ex: igual aoMyNotificationServiceExtension
nome do processo.fonte
É claro que algo está quebrado no Xcode6-B5.
Se tento executar uma extensão do Photo no Simulador, não consigo ver nenhum Photos.app como uma opção para o processo de anexação da extensão.
O mesmo, rodando em um dispositivo real, me dá o comportamento correto.
No primeiro caso, qualquer ponto de interrupção não é honrado. No último caso, os pontos de interrupção funcionam perfeitamente.
fonte
Você deve saber que o aplicativo de contêiner e a extensão são processos totalmente diferentes no iOS, enquanto o LLVM depura apenas um thread por vez, portanto, quando você está depurando, o console nunca registra a extensão e nunca para no ponto de interrupção.
Você pode resolver a maioria dos problemas pelo método de @Vince Yuan.
No entanto, meu problema é que o depurador Xcode dificilmente engancha na minha extensão de teclado no simulador iOS e dispositivos, como 1 vez em 7-8 execuções, é totalmente uma questão de probabilidade. O método de @Vince Yuan também funciona apenas algumas vezes.
Minha pouca experiência é que quando você executa o esquema de depuração, se a sessão de depuração no painel esquerdo mostra que 'Sem sessão de depuração', não há necessidade de abrir sua extensão e testá-la, o depurador não conectou, apenas execute novamente com sorte.
mas quando você vir com.xxx.xxx.xxx esperando para anexar, a extensão pode definitivamente ser depurada.
Este é um pequeno truque para quem não pode depurar a extensão do iOS, especialmente a extensão do teclado.
fonte
A partir do Xcode 6 Beta 5, fui capaz de usar um dispositivo real executando iOS8 para depurar minha extensão. Tente executá-lo em um dispositivo e selecione Safari para iniciar em
fonte
Para superar todos os estados causados pela mudança constante do IDE, estou usando o iOS Console da lemonjar.com - ele exibe uma janela de console para qualquer dispositivo iOS conectado que renderiza mensagens syslog, independentemente da ID do processo. Você pode ver as mensagens de log de depuração de aplicativos e extensões ao mesmo tempo aqui.
fonte
Eu poderia depurar minha extensão da maneira que descrevo abaixo:
Debug
->Attach to process by PID or Name
. Seu nome de esquema de extensão.main app target
e execute.Espero que também funcione para vocês.
fonte