L'histoire d'un "développeur" ou comment un nouveau venu pour écrire une application pour iOS



Alors, mai 2018. 7 tentatives ont été faites en 7 ans pour commencer à programmer quelque chose pour iOS. Et à chaque fois la même chose: Objective-C est quelque chose d'effrayant et d'incompréhensible, alors il n'y a aucune idée. Et puis Hello World, une fois par an, en général, les choses ne se sont pas passées ...

Cette fois, un nouveau Xcode et une nouvelle langue pour moi Swift ... Et une nouvelle idée, je veux pousser les notifications pour mon serveur Zabbix. il n'y a pas de stock officiel, et il n'y avait pas de clients à l'époque ...

Avant cela, le bot a envoyé les télégrammes à la poussée, mais il a commencé à junk et Roskomnadzor est arrivé à temps ... Le blocage du chariot ne joue pas un rôle spécial, car il y a Mikrotik et il a été immédiatement «réparé».

Il a été décidé d'écrire une notification Zabbix, qui ne sera alors plus réservée aux notifications.

Il s'est avéré que l'envoi de notifications ne fonctionnera pas. Vous devez écrire une application, l'installer, en prendre un jeton, élever votre serveur pour envoyer des notifications push ...

L'expérience de programmation était uniquement en PHP. Swift est différent, mais il ne semblait pas aussi intimidant qu'Objective-C à l'époque. Et Xcode lui-même est bon en tant qu'IDE qui convertit le code de l'ancien en nouveau, fait des indices.

Tout d'abord, des vidéos de formation, l'apprentissage de l'API Zabbix elle-même. Mais ensuite, un article après l'autre, comment NSURLSession fonctionne, quels cadres existent.

La première version ne pouvait se connecter qu'au serveur Zabbix et donner des déclencheurs et des hôtes. Ajout de vues de graphiques, de valeurs, etc.

Je m'attarderai sur certains points que j'ai rencontrés lors de la rédaction de la candidature.

Cadres


Les cadres ne sont pas entrés. Ils sont «cool», confortables, mais je ne veux pas réparer le projet plus tard car quelque chose a changé. Et c'est déjà arrivé. Pour ma part, j'ai décidé de ne pas les utiliser, et il vaut mieux inventer mon vélo pour comprendre comment tout fonctionne. Pour les requêtes JSON, il y a Alamofire, mais j'utilise la NSURLSession intégrée car c'est assez pour tout.

Les tests


Plus d'un an s'est alors écoulé, quand j'ai décidé d'ajouter des tests :)
Je pensais que cette chose fascinante sauverait le monde ... Mais ... J'ai écrit plusieurs tests différents, je l'ai poussé ici ... Et la paresse est venue. Je ne vois pas jusqu'ici de tâches dans un si petit projet pour allouer autant de temps aux tests ... Et ce n'est que le temps pour les tests de code, sans parler des tests d'interface utilisateur.

image

Cryptage


Il y avait plusieurs points au chiffrement.

Apple par leurs manuels veut que toutes les demandes soient cryptées. Et c'est vrai. Mais comme la pratique l'a montré, tout le monde ne voulait pas faire https pour leur Zabbix. Au début, je n'avais pas l'option (Paramètres de sécurité du transport d'application) permettant le trafic HTTP pur, pour lequel j'ai été crucifié dans les critiques de l'AppStore). Ensuite, je l'ai activé non sans aventure. Xcode n'a pas perçu ma ligne jusqu'à ce que je viens de recréer l'intégralité du fichier Info.plist.

De plus, Apple veut tout savoir sur votre application, le trafic https habituel ne relève pas de cela. Mais si vous souhaitez crypter quelque chose "de manière délicate", veuillez en informer les autorités américaines.

image

Lors de la communication avec l'un des utilisateurs de l'application, il y a eu une demande de chiffrement de bout en bout des messages PUSH. Le message doit être crypté sur le serveur Zabbix et décrypté uniquement sur le téléphone. Pour une telle chose, Apple a des notifications «mutables». C'est-à-dire si le «contenu mutable» est arrivé, alors dans la poussée vous devez changer quelque chose en fonction de ce que vous écrivez. Je l'ai fait déchiffrer le message.

La politique d'Apple n'est pas contre l'utilisation de types de cryptage standard. Voulez-vous quelque chose de vous-même, comme je l'ai écrit ci-dessus, donnez-moi un morceau de papier et pouvez-vous me montrer la clé? ...

J'ai utilisé la bibliothèque CommonCrypto intégrée, c'est donc considéré comme le type de cryptage standard. J'ai dû jouer avec le code, car la plupart des exemples sont soit très obsolètes, soit Xcode a crié que ce n'était pas sûr, n'avait rien pour travailler directement avec les octets et les données, ou s'est amusé avec IV OpenSSL-a, le décalage n'était pas correct, puis quelque chose d'autre ne fonctionnait pas. En conséquence, il était possible de créer du code non juré et de fonctionner correctement avec OpenSSL lors du chiffrement des messages.

Court-circuits


Et le sujet le plus excitant pour moi ... Je ne pouvais pas écrire de code asynchrone .... Jusqu'à présent, au moins, je n'ai pas bien compris comment ces fermetures fonctionnent.

image

Par défaut, NSURLSession est juste asynchrone et je ne pouvais pas comprendre comment l'utiliser plus tard ... J'ai utilisé DispatchSemaphore pour rendre le code synchrone ... Naturellement, les utilisateurs se sont plaints qu'il se bloque et se bloque ...

Puis, tout de même, j'ai compris ce qui fonctionnait dans le circuit et comment cela fonctionnait, quel délai d'attente dans NSURLSession et quoi de quoi. Le code a été complètement remplacé par des gestionnaires d'erreur normaux, ont été ajoutés. Et la vie est devenue meilleure, la vie est devenue plus amusante.

Disposition




Oui, j'ai tout dans un Storyboard. Je sais que ce n'est pas très, mais pour l'instant il y a peu d'écrans. Peut-être que je le mettrai dans xibs plus tard.

iOS 13 a apporté des modifications aux affichages d'écran. Auparavant, tous les nouveaux écrans étaient affichés en PUSH, c'est-à-dire plein écran. Cet écran peut maintenant être abaissé et il se fermera.

En général, il y avait un bogue si vous cliquez sur LogOut et vous pouvez simplement replier le formulaire de connexion. Cela ne se produit que si le dernier Xcode est assemblé 11. Il est corrigé simplement en définissant l'option d'affichage pour afficher uniquement en plein écran.

Toujours dans iOS 13, SwiftUI est apparu, mais si vous refaites l'application maintenant, cela signifie oublier ceux qui utilisent l'application sur d'anciens appareils avec un ancien firmware ...

Disposition de l'AppStore


Bien que j'aie écrit l'application moi-même, j'ai décidé de la publier dans l'AppStore. Il suffit de payer 100 $ par an et de l'étaler. La vérité est toujours de vérifier l'application, d'expliquer pourquoi cette application, etc.

Parce que application pour Zabbix, sur le logo, je voulais utiliser quelque chose qui dit à propos de Zabbix. Mais ce n'était pas là. J'ai écrit une lettre à Zabbix demandant qu'il soit possible d'utiliser la forme de la lettre Z ... Mais non. Par conséquent, j'ai peint mon icône, une courbe oblique, mais la mienne)

Finances


L'application a presque 2 ans. J'ai dépensé 200 $ juste pour avoir l'application dans l'AppStore. En dehors du développement et du serveur push.

image
L'application a une publicité de Google ... qui a rapporté ... ... 5 $
La désactivation de la publicité a rapporté 88 $ ... Mais le seuil de retrait est de 150 $.
Ensuite, je supprimerai les annonces en général dès que j'atteindrai le seuil de retrait.

Serveur push


Oui, oui, tout a commencé pour lui ... Les notifications push sont demandées. Une fois cela fait pour que vous puissiez crypter pushy, beaucoup sont passés au cryptage.

Il y a 2 serveurs, Moscou et les Pays-Bas à 2 roubles / jour. Équilibrage DNS, Nginx c Let's Encrypt, script PHP pour la réception et l'envoi.

Au départ, il y avait un serveur gratuit sur Amazon (15 gig de trafic ...), mais comme son heure commençait à venir, j'ai acheté un VPS-ku pour m'y installer. Et j'ai trouvé le moment où DDOS allait chez l'hébergeur et que vps n'était pas disponible pendant 12 heures ... 2 roubles dont je veux plus. Eh bien, j'étais encore sur Amazon et cela ne m'a pas encore affecté. Par conséquent, un autre a été pris pour 2 roubles par jour mais dans un endroit différent. Au moins une certaine tolérance aux pannes et un trafic de 15 gigaoctets ... Les principales préoccupations pour le trafic Amazon, les micro ddos ​​et vous avez de l'argent.

Je voulais utiliser Cloudflare en tant qu'équilibreur, mais ils veulent la délégation de l'intégralité du domaine pour eux, et non sous le domaine.

Quelques statistiques


Près de 6 000 téléchargements au total. Et le Brésil est dans le top ... qui aurait pensé)

image

Conclusions


  • Swift n'est rien comme ça)
  • L'abondance d'articles et la commodité de l'IDE dans le monde moderne vous permettent de prendre rapidement un premier départ.
  • L'application a été rédigée initialement pour moi-même, mais elle s'est avérée être une bonne expérience de développement et de présentation dans l'AppStore avec des critiques positives et négatives.
  • Le développement nettoie bien le cerveau.
  • Il vaut mieux lire les quais et ne pas faire de synchrone à partir de code asynchrone :)
  • Écrire, copier, étudier. Ce n'est qu'ainsi que l'on peut comprendre dans la pratique ce qui est quoi.
  • * Communiquez davantage avec les utilisateurs, ils diront certainement pourquoi ils en ont besoin et comment ils veulent le voir. J'ai ajouté un tiers des fonctionnalités de l'application précisément selon les souhaits des utilisateurs.

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


All Articles