Erro: _handleNonLaunchSpecificActions no iOS9

157

Estou recebendo o seguinte erro no iOS 9:

    -[UIApplication_handleNonLaunchSpecificActions:
      forScene:
      withTransitionContext:
      completion:] unhandled action -> 
      <FBSSceneSnapshotAction: 0x150b2aef0> 
       {
            handler          = remote;
            info = <BSSettings: 0x15333f650> 
            {
                (1) = 5;
            };
        }

Alguém mais se deparou com esse erro ou suas implicações? O que está errado?

Roddy
fonte
6
Ainda está no iOS9 pós versões beta. Seria bom entender qual é o problema e as implicações dele.
Roddy
11
Tenho o mesmo problema ao bloquear meu iPhone quando meu aplicativo está sendo executado. iOS 9.0, XCode 7.0.
NKorotkov 18/09/2015
5
Parece um bug da Apple, já que um novo projeto criado com o Xcode 7 também tem esse problema exato.
Hongfei 21/09/2015
12
Alguma coisa de mérito já foi discutida nos fóruns de desenvolvedores da Apple? Parece que qualquer tipo de bug é encerrado com "por que você faria isso se a Apple não quer?" É a última parada do desespero ao tentar resolver problemas.
Roddy
11
Consulte a pergunta stackoverflow.com/questions/32658037/… - isso discute o mesmo problema.
iPhone Guy

Respostas:

10

Não há nada errado com o seu código. Esta é uma mensagem de registro interna da Apple e você deve registrar um radar sobre isso.

Há duas dicas que mostram que esse é provavelmente o código da Apple:

  1. O sublinhado que leva ao nome do método _handleNonLaunchSpecificActions:forScene:withTransitionContext:completioné uma convenção que indica que o método é privado / interno para a classe em que está declarado. (Veja este comentário .)

  2. É razoável adivinhar que o prefixo de duas letras FBSSceneSnapshotActioné uma abreviação de FrontBoard, que, de acordo com Rene Ritchie em "Lista de desejos do iOS 9: Modo Convidado", faz parte de toda a família de softwares relacionados ao lançamento de aplicativos:

Com o iOS 8, a Apple refatorou seu gerenciador de sistema, SpringBoard, em vários componentes menores e mais focados. Além do BackBoard, que já foi desenvolvido para lidar com tarefas em segundo plano, eles adicionaram o Frontboard para tarefas em primeiro plano. Eles também adicionaram o PreBoard para lidar com a tela de bloqueio em condições seguras e criptografadas. [...]

Não faço ideia para que serve o BSprefixo BSSettings, mas uma análise dessa mensagem de log indicaria que não foi nada que você fez e você deve arquivar um radar com etapas para reproduzir a mensagem de log.

Se você quiser tentar pegar um rastreamento de pilha, poderá implementar a categoria vinculada aqui . Alguns argumentam que substituir a API privada é uma péssima idéia, mas nesse caso uma injeção temporária para capturar um rastreamento de pilha não pode ser muito prejudicial.

EDITAR:

Mas ainda queremos saber o que é essa ação. Então, coloquei um ponto de interrupção -[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion]e comecei a imprimir valores de registro e encontrei uma classe chamada FBSceneImplque tinha um monte de informações sobre meu aplicativo:

Cena

Podemos descobrir qual método privado é chamado a seguir (armazenado no contador do programa, registro 15.)

Contador de programa

Eu tentei encontrar o não tratado FBSceneSnapshotActionreferenciado no log, mas nenhum dado. Subclassifiquei UIApplication e substituí-o _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion. Agora eu pude entrar na ação diretamente, mas ainda não sabemos o que é.

Então, olhei para o FBSceneSnapshotAction novamente. Acontece que tem uma superclasse chamada BSAction.

Então, escrevi uma ferramenta semelhante ao RuntimeBrowser e procurei todas as subclasses de BSAction. Acontece que há uma lista completa deles:

Lista de Ação

Os dois nomes de métodos que temos (um do log e outro do contador de programas nos dispositivos) indicam que essas ações são usadas sob o capô para transmitir ações pelo sistema.

Algumas ações provavelmente são enviadas para os retornos de chamada do delegado do aplicativo, enquanto outras são tratadas internamente.

O que está acontecendo aqui é que existe uma ação que não foi tratada corretamente e o sistema está notando. Aparentemente, não deveríamos vê-lo.

Moshe
fonte
Desculpe, mas isso não é realmente uma resposta; mais de um comentário a seguir. O código é muito erro interno da Apple, isso não está em questão. As suposições não são realmente uma resolução e a explicação do iOS8 fornecida não é relevante, pois o erro apareceu apenas no iOS9 (isso não acontece no iOS8).
Roddy
2
A resposta para "o que está errado" é que algo dentro do SpringBoard não lidou com uma ação de instantâneo. É o que a mensagem de registro diz. Há pouco mais que alguém fora da Apple possa lhe dizer.
Moshe
O fato de esta mensagem de log não aparecer no iOS 8 não é realmente relevante. É uma mensagem de log perdido que deve ser arquivada com radar.
Moshe
Notei esta manhã que alguém atualizou minha pergunta e não foi isso o que eu originalmente fiz, e é por isso que há um pouco de desconexão. Nem sabia que era possível que uma pergunta fosse atualizada por mais alguém.
Roddy
Para responder à sua pergunta original: não há outras implicações além de arquivar um radar.
Moshe