Objectif : Lister ce à quoi les SDK externes et API tierces doivent se conformer avant d'être intégrés dans l'application iOS PagesJaunes. Le but est de ne pas limiter l'évolution de l'application si, par hasard, un SDK était mal conçu.
Veuillez forker ce gist et mettre un ✅ devant ce que vous faites. Renvoyez nous son lien par mail avec l'explication de ce que vous ne faites pas et pourquoi ? 🙂
-
On doit pouvoir influer sur les évolutions possibles du SDK afin qu'il puisse évoluer avec nous si besoin.
-
On doit avoir un contact technique direct (et non pas un quelqu'un du support commercial 😉). Cette personne doit avoir la possibilité d'influer sur l'évolution du SDK et nous renseigner techniquement dans un délais acceptable.
-
On doit avoir la possibilité d'envoyer des crashs lié au SDK et de suivre l'évolution de la correction de ces derniers.
-
Les performances du SDK ne doivent pas impacter l'app hôte Apple Performance Tips
-
La consommation réseau doit être raisonnable (faire le moins de requêtes possibles, grouper les requêtes, renvoyer les requêtes échouées au prochain lancement de l'app) et si possible les requêtes moins importantes devraient être étalées dans le temps afin de ne pas impacter négativement l'experience utilisateur.
-
Avoir une interface de test / debug / une console de test dans leur back-office et ou une API afin de simuler/forcer le fonctionnement du SDK est un plus non négligeable car il nous permettrait d'automatiser les tests de ce dernier dans notre application.
-
Le SDK doit gerer tout son log dans l'app Console de macOS a travers l'api
OSLog
afin de ne pas polluer la console de l'app hote(Apple Logging, Exemple d'utilisation de OSLog) -
Respecter la vie privée des utilisateurs et correctement sécuriser les données qu'ils exploitent (Security Overview / Secure Coding Guide)
-
Le SDK doit être conforme a la RGPD et le pouvoir le prouver
-
Le SDK doit être en mesure de justifier de l'utilisation de toutes les données utilisateur qu'il exploite si il n'en est pas capable il ne doit pas les exploiter.
-
Est ce que le SDK utilise
__attribute__ ((deprecated("Cet méthode est déprécier veuillez utiliser XYZ")))
les méthodes déprécier est ce que vous pouvez utiliser source -
Le SDK doit être en mesure de justifier de l'utilisation de toutes les données utilisateur qu'il exploite si il n'en est pas capable il ne doit pas les exploiter.
-
Est ce que le SDK suis ces principes en terme de vie privée Better Apps through Better Privacy ?
-
Le SDK doit avoir un support officiel de Cocoapods avec des liens encrypter(ssh/https) Trusting third party SDKs @KrauseFx
-
Le SDK doit être rapidement et complètement désactivable à distance par le fournisseur. C'est à dire désactiver tout les appels du SDK pour un temps donné (de 1h à 8000 ans). À l'initialisation de ce dernier, c'est la première chose qu'il doit verifier (activer ou bloquer en remote avant de faire quoique soit).
-
Le SDK doit respecter et enforcer les regles de l'AppStore car des apps ont déjà été bannie parce que un SDK et le client qui l'utilisait n'y faisait pas attention Teemo aka Databerries a causer Le Figaro, Marmiton, Closer, Akinator, VDM, Challenges a étre bannie ou retirer du store temporairement. C'est a dire nous empecher de faire des conneries en l'utilisant et nous pousser a bien suivre et comprendre les règles afin d'éviter les surprises.
-
L'équipe derrière le SDK doit communiquer en case de crise par exemple récemment AppSee est rentrer dans le viseur d'Apple et leur actions a été de nous prevenir rapidement d'enlever le SDK de l'app.
-
Le SDK doit passer le linter de cocoapods
pod lib lint SDK.podspec --no-clean --verbose --swift-version=4.2 --use-libraries
avec--use-libraries
afin de garantir que le SDK puisse se builder de facon static avec la--swift-version=4.2
pour garantir le support de la dernière version de Swift. -
Avoir un moyen de suivre le volume de probleme majeur d'une plateforme Crash en prod d'accengage et prevoir une compensation en cas de probleme majeur
-
Le SDK doit faire moins de 50mo afin de pouvoir etre mis sur notre repository Github avec le reste du code du projet
-
L'entreprise doit maîtriser la technologie qu'elle met à notre disposition. C'est à dire qu'elle ne peut pas utiliser un SDK tier qu'elle-même ne maîtrise sinon :
- on aura trop d'adhérence en cas d'évolution
- on ne maîtrisera pas ce que deviennent nos données utilisateur
- on aura encore moins de compréhension de ce qui est fait dans notre appli
- les problèmes de sécurité / juridique associés seront encore plus élevés
Toutes les requêtes doivent être en HTTPS:
- le certificat doit être signé au minimum en SHA256 avec une clé soit en RSA en 2048-bit au minimum ou Elliptic-Curve (ECC) en 256-bit au minimum
- le serveur doit supporter TLS 1.2 (au minimum) ou TLS 1.3
- pour la connexion, la liste des ciphers supportés sont ceux compatibles avec le forward secrecy
- sécurité réseaux iOS (WWDC 2017 - Your Apps and Evolving Network Security Standards / https://developer.apple.com/videos/play/wwdc2016/706/)
- support de l'HSTS - https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
Si le certificat ou le serveur ne supportent pas ces pré-requis, le SDK ou l'API ne pourront pas être intégrés.
- le support du certificate pinning est souhaité mais optionnel.
- le support de l'OCSP Stapling est souhaité mais optionnel.
- l'utilisation de protocole d'authentification standard tels que OAuth2/JWT est souhaité.
- Quel est le cipher utiliser : XXX
Voici la liste des ciphers supportés :
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
- le temps de réponse moyen doit être inférieur à 750 ms
- le timeout côté serveur doit être inférieur à 1000 ms
- l'utilisation de HTTP/2 est un plus appréciable
- le support de l'IPv6 est primordiale
- WWDC 2017 - Your Apps and Evolving Network Security Standards
- WWDC 2017 - Advances in Networking, Part 1
- WWDC 2017 - Advances in Networking, Part 2
- supporter les OS >= iOS 10
- être compatible avec les nouvelles versions d'iOS et d'Xcode dès leur sortie (versions betas et releases). Le SDK ne doit pas nous empêcher d'évoluer / avancer
- être compatible Objective-C et Swift 4
- doit faire toutes ses requêtes en HTTPS
- avoir des slices armv7, armv7s, arm64, x86_64, i386 fonctionner dans le simulateur
- supporter du Bitcode / App Slicing (App Thinning in Xcode)
- supporter le semantic versioning
- si nécessaire doit être compatible avec les extensions (Widget Today / Clavier / etc..) ainsi qu'avec les autres plateformes (watchOS / tvOS)
- Le SDK ne doit pas se baser sur fichier
UserDefault.standard
elle doit le sien et le maintenir a coté car leUserDefault.standard
peut etre fortement modifier voir flusher par l'app.
- l'utilisation de HTTP/2
- l'utilisation de NSURLSession (URL Session Programming Guide).
- avoir le code du SDK en open source (simplicité d'audit et de corrections de bugs, optimisation de performance, réduction du temps de démarrage de l'app car le SDK peut être directement inclut dans le projet et donc ne pas impacter le temps pre-main)
- avec une API bien structurée Better Translation of Objective-C APIs Into Swift
- si présence d'UI : l'API doit être accessible -> on doit pouvoir utiliser entièrement ses interfaces avec voice over (iOS Accessibility / Accessibility on iOS / Accessibility Programming Guide for iOS)
- être fournis via un gestionnaire de dépendances tel que Cocoapods / Carthage / Swift Package Manager (il peut utiliser un repository privé, comment faire un repo privé)
- s'il y a des ressources associées au SDK, elles doivent faire partie du package récupéré par le gestionnaire de dépendances
- démarrer uniquement si on lui demande (ne doit pas démarrer tout seul / ne doit pas impacter l'app sans notre consentement )
- éviter d'avoir des dépendances à des librairies tierces (AFNetworking, Reachability, etc...). Si c'est le cas, elles doivent être préfixées
- la documentation du SDK doit être visible depuis Xcode en survolant les fonctions du SDK. Elle doit être disponible en Objective-C et en Swift 4
- nous notifier s'il affiche de l'UI (___WillAppear, ___DidAppear, ___WillDisappear, ___DidDisappear) à travers un delegate ou des blocks
- avoir une API simple et descriptive comme celle d'Apple (Coding Guidelines for Cocoa / Building Responsive and Efficient Apps with GCD / Better Translation of Objective-C APIs Into Swift) et réaliser avec des techniques actuelles (Adopting Modern Objective-C)
- avoir une API correctement annotée avec en terme de nullability (Nullability and Objective-C, Import Objective-C Constants as Swift Types)
- doit avoir une option afin de simplement le compiler de façon static, voir le livrer sous forme binaire (afin de réduire l'impact sur le temps de démarrage pre-main de l'app)
- doit supporter le lowPowerModeEnabled (docs), décaler ces requêtes et réduire sont travail au minimum voire se désactiver dans ce cas
- doit préférer les technologie natives d'iOS plutôt que de re-inventer la roue (par exemple utiliser ARKit si le SDK fait de la réalité augmentée ou Vision s'il analyse des visages ou encore CoreML/CoreImage s'il fait de la reconnaissance d'image)
- pouvoir activer le log avec différents niveaux de verbosité ou au contraire désactiver le log du SDK à 100%
- nommer les threads utilisés pour qu'on puisse debugger en configurant la propriété name de NSOperationQueue
- être livré avec une app ou des apps de test qui utilisent toutes ses APIs et qui compile
- si le SDK en a besoin le mieux est qu'il ait son propre fichier de configuration de type plist dissocié de l'info.plist afin de lui appliquer une configuration custom
- utiliser NSOperationQueue ainsi que la propriété qualityOfService correctement configurée afin d'optimiser la gestion de l'énergie (Writing Energy Efficient Code, Part 1 / Writing Energy Efficient Code, Part 2 / Building Responsive and Efficient Apps with GCD)
- avoir accès aux API REST utilisées par un SDK et leur documentation (si c'est possible)
- impacter le moins possible l'application hôte d'un point du vue CPU, GPU, GPS, NETWORK, I/O (Writing Energy Efficient Code, Part 1 / Writing Energy Efficient Code, Part 2 / Profiling in Depth / Building Responsive and Efficient Apps with GCD / Debugging Energy Issues)
- éviter l'utilisation de timers (Writing Energy Efficient Code, Part 1 / Writing Energy Efficient Code, Part 2)
- être sur d'utiliser les dernières bonnes pratiques en terme de optimisation de consommation d'énergie (WWDC 2017 - Writing Energy Efficient Apps)
- doit préférer les technologie native d'iOS si le SDK a besoin de faire des calculs avancé(compute) il doit utiliser Metal 2(Using Metal 2 for Compute) ou Accelerate (Accelerate and Sparse Solvers)
- faire de swizzling
- bloquer le main thread. Il doit pouvoir fonctionner correctement sur un thread autre que le main thread et ne doit pas assumer qu'il sera démarré sur le main thread sinon cela veut dire qu'il affiche et font des opérations nécessitant le main thread sans verifier qu'ils sont effectivement dessus.
On doit pouvoir tester les stats d’un SDK avec un outils comme http://metrics.cocoapods.org/api/v1/pods et avoir les metrics d’utilisation de ce dernier cela nous permet de voir combien d’app l’utilise et depuis combien de temps il existe combien de fois il est télécharger etc...
http://metrics.cocoapods.org/api/v1/pods/UrbanAirship-iOS-SDK
“download_total”: 4.027.732,
“app_total”: 8.107,
“created_at”: “2015-05-25 09:09:00 UTC”,
“updated_at”: “2018-10-11 09:15:30 UTC”,
http://metrics.cocoapods.org/api/v1/pods/Alamofire
“download_total”: 42.097.177,
“app_total”: 662.839,
“created_at”: “2015-05-25 09:37:27 UTC”,
“updated_at”: “2018-10-11 09:16:33 UTC”,
http://metrics.cocoapods.org/api/v1/pods/Appsee
“download_total”: 2.658.359,
“app_total”: 12.954,
“created_at”: “2015-05-25 09:21:19 UTC”,
“updated_at”: “2018-10-11 09:15:55 UTC”,
http://metrics.cocoapods.org/api/v1/pods/Fabric
“download_total”: 50.998.892,
“app_total”: 325.405,
“created_at”: “2015-05-25 09:06:20 UTC”,
“updated_at”: “2018-10-11 09:15:23 UTC”,
http://metrics.cocoapods.org/api/v1/pods/Firebase
“download_total”: 23.877.096,
“app_total”: 479.914,
“created_at”: “2015-05-25 09:12:58 UTC”,
“updated_at”: “2018-10-11 09:15:40 UTC”,
On préfere les SDKs qui sont utiliser par plus de 5.000 apps on ne souhaite pas être les testeurs d’un nouveau SDK mais exploiter des outils stable, solide et optimiser pour le mobile.
- WWDC Vidéo 2014 - Writing Energy Efficient Code, Part 1
- WWDC Vidéo 2014 - Writing Energy Efficient Code, Part 2
- WWDC Vidéo 2014 - What's New in Foundation Networking
- WWDC Vidéo 2014 - What's New in Core Location
- WWDC Vidéo 2014 - Accessibility on iOS
- WWDC Vidéo 2015 - iOS Accessibility
- WWDC Vidéo 2015 - App Thinning in Xcode
- WWDC Vidéo 2015 - Profiling in Depth
- WWDC Vidéo 2015 - Building Responsive and Efficient Apps with GCD
- WWDC Vidéo 2015 - Debugging Energy Issues
- WWDC Vidéo 2015 - Networking with NSURLSession
- WWDC Vidéo 2015 - Security and Your Apps
- WWDC Vidéo 2015 - Advanced NSOperations
- WWDC Vidéo 2015 - Cocoa Touch Best Practices
- WWDC Vidéo 2015 - Performance on iOS and watchOS
- WWDC Vidéo 2015 - Advanced Debugging and the Address Sanitizer
- Energy Efficiency Guide for iOS Apps
- Cellular Best Practices Guide
- Performance Overview
- Location and Maps Programming Guide Tips for Conserving Battery Power
- Adopting Modern Objective-C
- Memory Usage Performance Guidelines
- Advanced Memory Management Programming Guide
- Instruments User Guide
- Networking Overview
- Concurrency Programming Guide / Threading Programming Guide
- Secure Coding Guide
- iOS Security - Apple
- WWDC 2017 - Writing Energy Efficient Apps
- WWDC 2017 - Advances in Networking, Part 1
- WWDC 2017 - Advances in Networking, Part 2
- WWDC 2017 - Accelerate and Sparse Solvers
- WWDC 2017 - Using Metal 2 for Compute
Ajouter le low data mode