Encontre arquivos perdidos em vários destinos do Xcode

Olá, sou Sanya - desenvolvedor de iOS e, neste artigo, compartilharei meu caminho para solucionar a dor de cabeça que ocorre ao trabalhar em um projeto com vários destinos.



Prevejo a pergunta "por que você precisa de vários alvos no projeto, Sanya?" Eu respondo: no projeto em que trabalhei, havia um alvo vinculado à conta do cliente, de modo que:


  • não tivemos acesso a esta conta;
  • não havia possibilidade de gerar perfis de provisão e certificados de distribuição;
  • a pior parte era que não era possível adicionar novos dispositivos aos perfis de provisão.

Assim, ao comprar novos dispositivos no estúdio, toda uma série de negociações com o lado do cliente estava esperando por nós para adicioná-los à conta e ter a oportunidade de testá-los.


A solução foi óbvia - criar um segundo destino, que será semelhante ao principal, mas tenha um ID de pacote diferente e que estará completamente e completamente vinculado à nossa conta do estúdio. Mal disse o que fez! O segundo objetivo nos permitiu realizar um desenvolvimento completo, independentemente dos desenvolvedores do lado do cliente, o que salvou o processo de desenvolvimento mais de uma vez, por exemplo, quando os desenvolvedores do cliente removeram todos os nossos dispositivos no perfil de fornecimento do alvo principal e não pudemos executar o aplicativo em seus dispositivos.


Vários destinos ainda podem aparecer no seu projeto quando necessário, por exemplo:


  • Colete vários aplicativos de uma base de código, mas com recursos diferentes;
  • Mantenha várias instâncias do aplicativo em um dispositivo.

Mas o trabalho em vários destinos leva a seus inconvenientes, o principal é a necessidade de controlar rigorosamente o processo de adição de novos arquivos ao projeto. Os dois são idênticos, respectivamente, ao adicionar um novo arquivo ao projeto, é necessário colocar uma marca na frente dos dois destinos.



Isso é muito difícil quando se trabalha em uma grande equipe multinível, tanto em habilidade quanto em boa fé.


Se você não seguir esta regra simples, após a próxima mesclagem, poderá descobrir que um dos alvos parou de colecionar e o Xcode jura que não consegue encontrar uma ou outra classe. Mas o mais interessante é que, se alguém não incluiu um arquivo de Copy Bundle Resources nos dois destinos (por exemplo, células xib), você poderá encontrar apenas esse erro no tempo de execução.


Após outro problema com o destino de depuração, decidimos dar controle sobre a consistência dos destinos de script. Escolhemos a linguagem Ruby como uma ferramenta, pois ela possui uma excelente jóia xcodeproj , que é quase o padrão para ferramentas de escrita para o desenvolvimento do iOS (consulte fastlane, generamba etc.).


Como resultado, desenvolvemos um script que implementa a seguinte lógica de trabalho:


  • o caminho para o arquivo do projeto e os nomes dos destinos testados são alimentados na entrada;
  • no caminho para o projeto, o script encontra o próprio projeto;
  • seleciona os destinos desejados, coleta arquivos deles (fontes de compilação, recursos do pacote de cópias e estruturas);
  • procurando a diferença entre listas de arquivos;
  • jogamos arquivos da nossa lista de permissões fora dessa diferença. Por exemplo, arquivos com constantes que diferem dependendo do destino (baseUrl, se você decidir organizar o projeto para que aplicativos de destinos diferentes acessem servidores diferentes) ou arquivos GoogleService-Info.plist, que serão diferentes para destinos diferentes.

Se o script encontrar uma diferença, temos um problema. Isso significa que este ou aquele arquivo / estrutura foi adicionado a um destino, mas não adicionado a outro.


Assim, o script permite:


  • verifique se todos os arquivos do Compile Sources e Copy Bundle Resources foram adicionados corretamente aos dois destinos;
  • a identidade das listas de estruturas adicionadas também é verificada, o que é muito importante se o seu projeto tiver arquitetura com vários módulos;
  • a integração do script na fase de criação permitirá identificar o problema antes mesmo da fase de criação do projeto;
  • e se anteriormente você coletou os dois destinos no IC para isso, agora você pode deixar o assembly para apenas um, reduzindo o tempo de montagem no IC pela metade.

Em caso de erro, no Xcode, você pode observar a seguinte mensagem:



Em caso de sucesso, você encontrará unicórnios:



Instruções detalhadas para adicionar ao projeto, configurações, bem como Exemplo de projeto no repositório .


O utilitário resultante mostra perfeitamente que, mesmo como desenvolvedor iOS, você pode criar um pequeno pedaço de criatividade no seu trabalho diário e automatizar e criar scripts que simplificarão sua vida!


Obrigado pela atenção!

Source: https://habr.com/ru/post/pt480960/


All Articles