
Also, Mai 2018. In 7 Jahren wurden 7 Versuche unternommen, etwas für iOS zu programmieren. Und jedes Mal das Gleiche: Objective-C ist etwas Unheimliches und Unverständliches, dann gibt es keine Ahnung. Und dann, Hallo Welt, einmal im Jahr, im Allgemeinen ging es nicht ...
Diesmal ein neuer Xcode und eine neue Sprache für mich Swift ... Und eine neue Idee, ich möchte Benachrichtigungen für meinen Zabbix-Server pushen. Es gibt keinen offiziellen Bestand und zu diesem Zeitpunkt gab es keine Kunden ...
Zuvor schickte der Bot die Telegramme an den Push, aber es begann zu verschrotten und Roskomnadzor kam rechtzeitig an ... Die Blockierung des Wagens spielt keine besondere Rolle, weil Es gibt Mikrotik und es wurde sofort "repariert".
Es wurde beschlossen, eine Zabbix-Benachrichtigung zu schreiben, die dann nicht nur für Benachrichtigungen gilt.
Wie sich herausstellte, funktioniert es nicht, nur Benachrichtigungen zu werfen. Sie müssen eine Anwendung schreiben, installieren, ein Token daraus entnehmen, Ihren Server für das Senden von Push-Benachrichtigungen erhöhen ...
Programmiererfahrung war nur in PHP. Swift ist anders, aber es sah damals nicht so einschüchternd aus wie Objective-C. Und Xcode selbst ist gut als IDE, die Code von alt nach neu konvertiert und Hinweise gibt.
Zunächst Schulungsvideos, das Erlernen der Zabbix-API selbst. Aber dann, ein Artikel nach dem anderen, wie NSURLSession funktioniert, welche Frameworks existieren.
Die erste Version konnte sich nur beim Zabbix-Server anmelden und Trigger und Hosts angeben. Dann wurden Ansichten von Grafiken, Werten usw. hinzugefügt.
Ich werde auf einige Punkte eingehen, auf die ich beim Schreiben der Bewerbung gestoßen bin.
Frameworks
Die Frameworks wurden nicht eingegeben. Sie sind "cool", komfortabel, aber ich möchte das Projekt später nicht reparieren, da sich etwas geändert hat. Und das ist schon passiert. Für mich selbst habe ich beschlossen, sie nicht zu benutzen, und es ist besser, mein Fahrrad zu erfinden, um zu verstehen, wie alles funktioniert. Für JSON-Anfragen gibt es Alamofire, aber ich verwende die integrierte NSURLSession, weil es ist genug für alles
Tests
Bis dahin ist mehr als ein Jahr vergangen, als ich mich entschied, Tests hinzuzufügen :)
Ich dachte, dass dieses faszinierende Ding die Welt retten würde ... Aber ... ich habe verschiedene Tests geschrieben, es hier angestoßen ... und Faulheit kam. Ich sehe bisher keine Aufgaben in einem so kleinen Projekt, um so viel Zeit für Tests zuzuweisen ... Und dies ist nur Zeit für Codetests, ganz zu schweigen von UI-Tests.

Verschlüsselung
Die Verschlüsselung hatte mehrere Punkte.
Apple möchte in seinen Handbüchern, dass alle Anfragen verschlüsselt werden. Und das ist richtig. Aber wie die Praxis gezeigt hat, wollten nicht alle https für ihren Zabbix machen. Am Anfang hatte ich nicht die Option (App Transport Security Settings), die reinen http-Verkehr zuließ, für den ich in den Bewertungen im AppStore gekreuzigt wurde. Dann habe ich sie nicht ohne Abenteuer aktiviert. Xcode hat meine Zeile erst wahrgenommen, als ich gerade die gesamte Info.plist-Datei neu erstellt habe.
Außerdem möchte Apple alles über Ihre Anwendung wissen, der übliche https-Verkehr fällt nicht darunter. Wenn Sie jedoch etwas "auf knifflige Weise" verschlüsseln möchten, melden Sie dies bitte den US-Behörden.

Bei der Kommunikation mit einem der Benutzer der Anwendung wurde die End-to-End-Verschlüsselung von PUSH-Nachrichten angefordert. Die Nachricht muss auf dem Zabbix-Server verschlüsselt und nur auf dem Telefon entschlüsselt werden. Für so etwas hat Apple "veränderbare" Benachrichtigungen. Das heißt, Wenn "veränderlicher Inhalt" eingetroffen ist, müssen Sie im Push etwas ändern, das dem entspricht, was Sie schreiben. Ich hatte es die Nachricht entschlüsseln.
Die Apple-Richtlinie ist hier nicht gegen die Verwendung von Standardverschlüsselungstypen. Willst du etwas Eigenes, wie ich oben geschrieben habe, gib mir ein Stück Papier und kannst mir den Schlüssel zeigen? ...
Ich habe die integrierte CommonCrypto-Bibliothek verwendet, daher wird dies als Standardverschlüsselungstyp angesehen. Ich musste mich mit dem Code anlegen, weil Die meisten Beispiele sind entweder sehr veraltet oder Xcode rief, dass es nicht sicher sei, nichts direkt mit Bytes und Daten zu tun habe oder Spaß mit IV OpenSSL-a habe. Der Offset stimmte nicht, dann stimmte etwas anderes nicht. Infolgedessen war es möglich, nicht schwörenden Code zu erstellen und beim Verschlüsseln von Nachrichten korrekt mit OpenSSL zu arbeiten.
Kurzschlüsse
Und das aufregendste Thema für mich ... Ich konnte keinen asynchronen Code schreiben ... Zumindest habe ich bisher nicht viel verstanden, wie diese Verschlüsse funktionieren.

Standardmäßig ist NSURLSession nur asynchron und ich konnte später nicht verstehen, wie ich damit arbeiten soll ... Ich habe DispatchSemaphore verwendet, um den Code synchron zu machen ... Natürlich gab es viele Beschwerden von Benutzern, dass er abstürzt und abstürzt ...
Trotzdem wurde mir klar, was und wie es auf der Rennstrecke funktionierte, welche Zeitüberschreitung in NSURLSession und was was. Der Code wurde vollständig durch normale ersetzt, Fehlerbehandlungsroutinen wurden hinzugefügt. Und das Leben ist besser geworden, das Leben hat mehr Spaß gemacht.
Layout

Ja, ich habe alles in einem Storyboard. Ich weiß, dass dies nicht sehr ist, aber bisher gibt es nur wenige Bildschirme. Vielleicht werde ich es später in xibs setzen.
iOS 13 hat Änderungen an den Bildschirmanzeigen gebracht. Zuvor wurden alle neuen Bildschirme als PUSH angezeigt, d. H. Vollbild. Jetzt kann dieser Bildschirm heruntergezogen werden und er wird geschlossen.
Im Allgemeinen gab es einen Fehler, wenn Sie auf LogOut klicken und das Anmeldeformular einfach wieder reduzieren können. Dies geschieht nur, wenn der letzte Xcode zusammengestellt wurde. 11. Dies wird einfach korrigiert, indem die Ansichtsoption so eingestellt wird, dass sie nur im Vollbildmodus angezeigt wird.
SwiftUI erschien auch in iOS 13, aber wenn Sie die Anwendung jetzt wiederholen, bedeutet dies, dass Sie diejenigen vergessen, die die Anwendung auf alten Geräten mit alter Firmware verwenden ...
AppStore-Layout
Obwohl ich die Anwendung für mich selbst geschrieben habe, habe ich mich entschlossen, sie im AppStore zu veröffentlichen. Es ist alles nur 100 Dollar pro Jahr zu zahlen und es auszulegen. Die Wahrheit ist immer noch, die Anwendung zu überprüfen, zu erklären, warum diese Anwendung usw.
Weil Anwendung für Zabbix, auf dem Logo wollte ich etwas verwenden, das über Zabbix sagt. Aber es war nicht da. Ich schrieb einen Brief an Zabbix und bat ihn, die Form des Buchstabens Z zu verwenden ... Aber nein. Deshalb habe ich mein Symbol gemalt, eine schräge Kurve, aber meine)
Finanzen
Die Anwendung ist fast 2 Jahre alt. Ich habe 200 US-Dollar ausgegeben, um die Anwendung im AppStore zu haben. Abgesehen von Entwicklung und Push-Server.

Die Anwendung hat eine Werbung von Google ... die ... ... $ 5 brachte
Das Deaktivieren von Werbung brachte 88 US-Dollar ... Die Auszahlungsschwelle liegt jedoch bei 150 US-Dollar.
Dann werde ich Anzeigen im Allgemeinen löschen, sobald ich die Auszahlungsschwelle erreicht habe.
Push-Server
Ja, ja, alles begann für ihn ... Push-Benachrichtigungen sind gefragt. Sobald dies erledigt ist, damit Sie aufdringlich verschlüsseln können, haben viele auf verschlüsselt umgestellt.
Es gibt 2 Server, Moskau und die Niederlande bei 2 Rubel / Tag. DNS-Balancing, Nginx c Let's Encrypt, PHP-Skript zum Empfangen und Senden.
Anfangs gab es bei Amazon einen kostenlosen Server (15 Gig Verkehr ...), aber als es soweit war, kaufte ich mir ein VPS-ku, um dorthin zu ziehen. Und ich fand den Moment, in dem DDOS zum Hosting-Anbieter ging und vps 12 Stunden lang nicht verfügbar war ... 2 Rubel, von denen ich mehr möchte. Nun, ich war immer noch bei Amazon und es hat mich noch nicht betroffen. Daher wurde dann ein anderer für 2 Rubel pro Tag aber an einem anderen Ort genommen. Zumindest etwas Fehlertoleranz und 15-Gigabyte-Verkehr ... Die Hauptbedenken für Amazon-Verkehr, Micro-Ddos und Sie haben Geld.
Ich wollte Cloudflare als Balancer verwenden, aber sie möchten die Delegierung der gesamten Domäne an sie und nicht unter der Domäne.
Einige Statistiken
Insgesamt fast 6.000 Downloads. Und Brasilien ist an der Spitze ... wer hätte das gedacht)

Schlussfolgerungen
- Swift ist nichts dergleichen)
- Die Fülle an Artikeln und die Bequemlichkeit der IDE in der modernen Welt ermöglichen Ihnen einen schnellen ersten Start.
- Die Anwendung wurde ursprünglich für mich selbst geschrieben, aber es stellte sich heraus, dass es eine gute Erfahrung mit der Entwicklung und dem Auslegen im AppStore mit positiven und negativen Bewertungen war.
- Entwicklung reinigt das Gehirn gut.
- Es ist besser, die Docks zu lesen und nicht aus asynchronem Code synchron zu machen :)
- Im Allgemeinen schreiben, kopieren, studieren. Nur so kann man in der Praxis verstehen, was was ist.
- * Kommunizieren Sie mehr mit Benutzern, sie werden definitiv sagen, warum sie es brauchen und wie sie es sehen wollen. Ich habe ein Drittel der Funktionalität der Anwendung genau nach den Wünschen der Benutzer hinzugefügt.