
Entonces, mayo de 2018. Se hicieron 7 intentos en 7 años para comenzar a programar algo para iOS. Y cada vez lo mismo: Objective-C es algo aterrador e incomprensible, entonces no hay idea. Y luego Hello World, una vez al año, en general, las cosas no salieron ...
Esta vez, un nuevo Xcode y un nuevo lenguaje para mí Swift ... Y una nueva idea, quiero enviar notificaciones para mi servidor Zabbix. no hay stock oficial, y no había clientes en ese momento ...
Antes de esto, el bot envió los telegramas al empuje, pero comenzó a chatarra y Roskomnadzor llegó a tiempo ... El bloqueo del carrito no juega un papel especial, porque hay Mikrotik y fue inmediatamente "arreglado".
Se decidió escribir una notificación Zabbix, que luego no será solo para notificaciones.
Al final resultó que, simplemente lanzar notificaciones no funcionará. Debe escribir una aplicación, instalarla, tomar un token de ella, elevar su servidor para enviar notificaciones push ...
La experiencia de programación fue solo en PHP. Swift es diferente, pero no parecía tan intimidante como Objective-C en ese momento. Y Xcode en sí mismo es bueno como un IDE que convierte el código de viejo a nuevo, da pistas.
En primer lugar, videos de entrenamiento, aprendiendo la API de Zabbix. Pero luego, un artículo tras otro, cómo funciona NSURLSession, qué marcos existen.
La primera versión solo pudo iniciar sesión en el servidor Zabbix y proporcionar activadores y hosts. Luego se agregaron vistas de gráficos, valores, etc.
Me detendré en algunos puntos que encontré al escribir la solicitud.
Marcos
Los marcos no entraron. Son "geniales", cómodos, pero no quiero arreglar el proyecto más tarde debido a que algo ha cambiado. Y esto ya ha sucedido. Por mi parte, decidí no usarlos, y es mejor inventar mi bicicleta para entender cómo funciona todo. Para las solicitudes JSON, existe Alamofire, pero uso la NSURLSession incorporada porque es suficiente para todo.
Pruebas
Ha pasado más de un año para entonces, cuando decidí agregar pruebas :)
Pensé que esta cosa fascinante salvaría al mundo ... Pero ... escribí varias pruebas diferentes, lo metí aquí ... Y llegó la pereza. No veo hasta ahora tareas en un proyecto tan pequeño para asignar tanto tiempo para las pruebas ... Y este es solo el momento para las pruebas de código, sin mencionar las pruebas de IU.

Cifrado
Hubo varios puntos en el cifrado.
Apple, según sus manuales, quiere que todas las solicitudes se cifren. Y eso es correcto. Pero como ha demostrado la práctica, no todos querían hacer https para su Zabbix. Al principio, no tenía la opción (Configuración de seguridad de transporte de aplicaciones) que permitía tráfico http puro, por lo que me crucificaron en las reseñas en la AppStore). Luego la encendí no sin aventura. Xcode no percibió mi línea hasta que simplemente recreé todo el archivo Info.plist.
Además, Apple quiere saber todo acerca de su aplicación, el tráfico https habitual no se incluye en esto. Pero si desea encriptar algo "de una manera complicada", informe a las autoridades estadounidenses.

Al comunicarse con uno de los usuarios de la aplicación, hubo una solicitud de cifrado de mensajes PUSH de extremo a extremo. El mensaje debe estar encriptado en el servidor Zabbix y desencriptado solo en el teléfono. Para tal cosa, Apple tiene notificaciones "mutables". Es decir si ha llegado el "contenido mutable", entonces en el impulso debe cambiar algo de acuerdo con lo que escribe. Lo tuve descifrando el mensaje.
La política de Apple aquí no está en contra del uso de tipos de cifrado estándar. ¿Quieres algo tuyo, como escribí anteriormente, dame un trozo de papel y puedes mostrarme la llave? ...
Usé el CommonCrypto lib incorporado, por lo que este se considera el tipo estándar de cifrado. Tuve que meterme con el código, porque la mayoría de los ejemplos están muy desactualizados, o Xcode gritó que no era seguro, que no tenía nada que trabajar con bytes y datos directamente, o que se divirtió con IV OpenSSL-a, que el desplazamiento no era correcto, entonces algo más no era correcto. Como resultado, fue posible crear un código sin juramento y trabajar correctamente con OpenSSL al cifrar mensajes.
Cortocircuitos
Y el tema más emocionante para mí ... no podía escribir código asincrónico ... Hasta ahora, al menos no he entendido mucho cómo funcionan estos cierres.

De forma predeterminada, NSURLSession es simplemente asíncrono y no pude entender cómo trabajar con él más tarde ... Usé DispatchSemaphore para sincronizar el código ... Naturalmente, hubo muchas quejas de los usuarios de que se bloquea y se bloquea ...
Entonces, de todos modos, me di cuenta de qué y cómo funcionaba en el circuito, qué tiempo de espera en NSURLSession y qué es qué. El código fue completamente reemplazado por normal, se agregaron controladores de errores. Y la vida ha mejorado, la vida se ha vuelto más divertida.
Diseño

Sí, tengo todo en un Storyboard. Sé que esto no es muy, pero hasta ahora hay pocas pantallas. Tal vez lo pondré en xibs más tarde.
iOS 13 ha traído cambios a las pantallas. Anteriormente, todas las pantallas nuevas se mostraban como PUSH, es decir pantalla completa Ahora esta pantalla se puede desplegar y se cerrará.
En general, hubo un error si hace clic en Cerrar sesión y simplemente puede contraer el formulario de inicio de sesión. Esto solo ocurre si se ensambla el último Xcode 11. Se corrige simplemente configurando la opción de visualización para que se muestre solo en pantalla completa.
También en iOS 13, apareció SwiftUI, pero si rehace la aplicación ahora, significa olvidarse de aquellos que usan la aplicación en dispositivos antiguos con firmware antiguo ...
Diseño de AppStore
Aunque escribí la aplicación para mí, decidí publicarla en la AppStore. Todo es solo pagar $ 100 al año y exponerlo. La verdad sigue comprobando la aplicación, explica por qué esta aplicación, etc.
Porque solicitud de Zabbix, en el logotipo quería usar algo que dice sobre Zabbix. Pero no estaba allí. Escribí una carta a Zabbix preguntando que es posible usar la forma de la letra Z ... Pero no. Por lo tanto, pinté mi icono, una curva inclinada, pero la mía)
Finanzas
La aplicación tiene casi 2 años. Gastó $ 200 solo para tener la aplicación en la AppStore. Aparte del desarrollo y el servidor push.

La aplicación tiene un anuncio de Google ... que trajo ... ... $ 5
Desactivar la publicidad trajo $ 88 ... Pero el umbral de retiro es de $ 150.
Luego, eliminaré los anuncios en general tan pronto como llegue al límite de retiro.
Servidor de inserción
Sí, sí, todo comenzó para él ... Se requieren notificaciones push. Una vez hecho esto para que pueda cifrar pushy, muchos cambiaron a cifrado.
Hay 2 servidores, Moscú y los Países Bajos a 2 rublos / día. Equilibrio de DNS, Nginx c Let's Encrypt, script PHP para recibir y enviar.
Inicialmente, había un servidor gratuito en Amazon (15 gigas de tráfico ...), pero cuando llegó el momento, compré un VPS-ku para mudarme allí. Y encontré el momento en que DDOS iba al proveedor de alojamiento y vps no estuvo disponible durante 12 horas ... 2 rublos de los cuales quiero más. Bueno, todavía estaba en Amazon y todavía no me ha afectado. Por lo tanto, luego se tomó otro por 2 rublos por día, pero en una ubicación diferente. Al menos algo de tolerancia a fallas y tráfico de 15 gigabytes ... Las principales preocupaciones para el tráfico de Amazon, micro ddos y usted obtuvo dinero.
Quería usar Cloudflare como equilibrador, pero quieren que les delegue todo el dominio, y no bajo el dominio.
Algunas estadísticas
Casi 6 mil descargas en total. Y Brasil está en la cima ... quién hubiera pensado)

Conclusiones
- Swift no es nada de eso)
- La abundancia de artículos y la conveniencia del IDE en el mundo moderno le permiten comenzar rápidamente.
- La aplicación fue escrita inicialmente para mí, pero resultó ser una buena experiencia con el desarrollo y diseño en la AppStore con críticas positivas y negativas.
- El desarrollo limpia bien el cerebro.
- Es mejor leer los muelles y no sincronizar el código asincrónico :)
- Generalmente escribe, copia, estudia. Solo así se puede entender en la práctica qué es qué.
- * Comunícate más con los usuarios, definitivamente dirán por qué lo necesitan y cómo quieren verlo. Agregué un tercio de la funcionalidad en la aplicación precisamente de acuerdo con los deseos de los usuarios.