
Então, maio de 2018. Foram feitas 7 tentativas em 7 anos para começar a programar algo para iOS. E cada vez a mesma coisa: Objective-C é algo assustador e incompreensível, então não há idéia. E então Olá Mundo, uma vez por ano, em geral, as coisas não corriam ...
Desta vez, um novo Xcode e um novo idioma para mim, Swift ... E uma nova idéia, quero enviar notificações para o meu servidor Zabbix. não há estoque oficial e não havia clientes naquele momento ...
Antes disso, o bot enviou um pushgram para o push, mas começou a afundar e Roskomnadzor chegou a tempo ... O bloqueio do carrinho não desempenha um papel especial, porque existe o Mikrotik e foi imediatamente "consertado".
Foi decidido escrever uma notificação do Zabbix, que não será apenas para notificações.
Como se viu, apenas enviar notificações não funcionará. Você precisa escrever um aplicativo, instalá-lo, obter um token, elevar seu servidor para enviar notificações push ...
A experiência de programação foi apenas em PHP. Swift é diferente, mas não parecia tão intimidador quanto o Objective-C na época. E o próprio Xcode é bom como um IDE que converte código do antigo para o novo, faz sugestões.
Primeiro, vídeos de treinamento, aprendendo a própria API do Zabbix. Mas então, um artigo após o outro, como o NSURLSession funciona, quais estruturas existem.
A primeira versão só conseguiu fazer login no servidor Zabbix e fornecer acionadores e hosts. Adicionadas visualizações de gráficos, valores etc.
Vou me debruçar sobre alguns pontos que encontrei ao escrever o aplicativo.
Frameworks
As estruturas não entraram. Eles são "legais", confortáveis, mas não quero consertar o projeto mais tarde devido ao fato de que algo mudou. E isso já aconteceu. Por mim, decidi não usá-las, e é melhor inventar minha bicicleta para entender como tudo funciona. Para solicitações JSON, existe o Alamofire, mas eu uso o NSURLSession interno porque é o suficiente para tudo.
Testes
Mais de um ano se passou até então, quando eu decidi adicionar testes :)
Eu pensei que essa coisa fascinante salvaria o mundo ... Mas ... eu escrevi vários testes diferentes, cutuquei aqui ... E a preguiça veio. Até agora, não vejo tarefas em um projeto tão pequeno para alocar tanto tempo para testes ... E isso é apenas tempo para testes de código, sem mencionar os testes de interface do usuário.

Criptografia
Havia vários pontos na criptografia.
A Apple, de acordo com seus manuais, deseja que todos os pedidos sejam criptografados. E isso está certo. Mas, como a prática demonstrou, nem todo mundo queria fazer https para o seu Zabbix. No começo, eu não tinha a opção (Configurações de segurança de transporte de aplicativos) que permitia tráfego http puro, para o qual fui crucificado nos comentários na AppStore. Então liguei-o não sem aventura. O Xcode não percebeu minha linha até eu recriar todo o arquivo Info.plist.
Além disso, a Apple quer saber tudo sobre o seu aplicativo, o tráfego https usual não se enquadra nisso. Mas se você quiser criptografar algo "de maneira complicada", informe as autoridades dos EUA.

Ao se comunicar com um dos usuários do aplicativo, houve uma solicitação de criptografia de mensagens PUSH de ponta a ponta. A mensagem deve ser criptografada no servidor Zabbix e descriptografada apenas no telefone. Para tal, a Apple tem notificações "mutáveis". I.e. se "conteúdo mutável" chegou, então, no impulso, você precisa alterar algo de acordo com o que escreve. Eu tinha que descriptografar a mensagem.
A política da Apple aqui não é contrária ao uso de tipos padrão de criptografia. Você quer algo seu, como escrevi acima, me dê um pedaço de papel e possa me mostrar a chave? ...
Eu usei o CommonCrypto lib interno, portanto esse é considerado o tipo padrão de criptografia. Eu tive que mexer com o código, porque a maioria dos exemplos está muito desatualizada ou o Xcode gritou que não era seguro, não tinha nada para trabalhar com bytes e dados diretamente ou se divertiu com o IV OpenSSL-a, o deslocamento não estava certo, então outra coisa não estava certa. Como resultado, foi possível criar código não juramentável e funcionar corretamente com o OpenSSL ao criptografar mensagens.
Curto-circuito
E o tópico mais emocionante para mim ... eu não conseguia escrever código assíncrono .... Até agora, pelo menos eu não entendi muito bem como esses fechamentos funcionam.

Por padrão, o NSURLSession é assíncrono e não consegui entender como trabalhar com ele mais tarde ... Eu usei o DispatchSemaphore para tornar o código síncrono ... Naturalmente, houve muitas reclamações dos usuários de que ele travava e travava ...
Mesmo assim, percebi o que e como funcionava no circuito, o tempo limite no NSURLSession e o que é o quê. O código foi completamente substituído pelo normal, manipuladores de erro foram adicionados. E a vida se tornou melhor, a vida se tornou mais divertida.
Layout

Sim, eu tenho tudo em um Storyboard. Eu sei que isso não é muito, mas até agora existem poucas telas. Talvez eu coloque no xibs mais tarde.
O iOS 13 trouxe mudanças para as telas. Anteriormente, todas as novas telas eram mostradas como PUSH, ou seja, tela cheia. Agora, esta tela pode ser baixada e fechará.
Em geral, houve um erro se você clicar em Logout e simplesmente recolher o formulário de login novamente. Isso só acontece se o último Xcode for montado 11. É corrigido simplesmente configurando a opção de visualização para exibir somente em tela cheia.
Também no iOS 13, o SwiftUI apareceu, mas se você refazer o aplicativo agora, significa esquecer aqueles que o usam em dispositivos antigos com firmware antigo ...
Layout da AppStore
Embora tenha escrito o aplicativo para mim, decidi publicá-lo na AppStore. Tudo é pago apenas US $ 100 por ano e divulgado. A verdade ainda está verificando o aplicativo, explique por que esse aplicativo etc.
Porque aplicação para o Zabbix, no logotipo eu queria usar algo que diz sobre o Zabbix. Mas não estava lá. Escrevi uma carta para o Zabbix pedindo que fosse possível usar o formato da letra Z ... Mas não. Por isso, pintei meu ícone, uma curva inclinada, mas a minha)
Finanças
A aplicação tem quase 2 anos. Gastou US $ 200 apenas para ter o aplicativo na AppStore. Além do desenvolvimento e do servidor push.

O aplicativo possui um anúncio do Google ... que trouxe ... ... $ 5
A desativação da publicidade gerou US $ 88 ... Mas o limite de retirada é de US $ 150.
Em seguida, excluirei os anúncios em geral assim que atingir o limite de retirada.
Servidor push
Sim, sim, tudo começou para ele ... As notificações por push estão sendo solicitadas. Uma vez feito, para que você possa criptografar agressivamente, muitos mudaram para criptografados.
Existem 2 servidores, Moscou e Holanda, a 2 rublos / dia. Balanceamento de DNS, Nginx c Let's Encrypt, script PHP para recebimento e envio.
Inicialmente, havia um servidor gratuito na Amazon (15 GB de tráfego ...), mas quando chegou a hora, comprei um VPS-ku para mudar para lá. E descobri o momento em que o DDOS estava indo para o provedor de hospedagem e o vps não estava disponível por 12 horas ... 2 rublos dos quais quero mais. Bem, eu ainda estava na Amazônia e ainda não me afetou. Portanto, outro foi tomado por 2 rublos por dia, mas em um local diferente. Pelo menos alguma tolerância a falhas e tráfego de 15 gigabytes ... As principais preocupações para o tráfego da Amazon, microddos e você conseguiu o dinheiro.
Eu queria usar o Cloudflare como um balanceador, mas eles querem a delegação de todo o domínio para eles, e não para o domínio.
Algumas estatísticas
Quase 6 mil downloads no total. E o Brasil está no topo ... quem teria pensado)

Conclusões
- Swift não é nada disso)
- A abundância de artigos e a conveniência do IDE no mundo moderno permitem que você inicie rapidamente.
- O aplicativo foi escrito inicialmente para mim, mas acabou sendo uma boa experiência com o desenvolvimento e o layout na AppStore com críticas positivas e negativas.
- O desenvolvimento limpa bem o cérebro.
- É melhor ler as docas e não tornar síncronas a partir do código assíncrono :)
- Geralmente escreva, copie, estude. Somente assim é possível entender na prática o que é o quê.
- * Comunique-se mais com os usuários, eles definitivamente dirão por que precisam e como querem vê-lo. Eu adicionei um terço da funcionalidade no aplicativo precisamente de acordo com os desejos dos usuários.