Objectif : Lister ce à quoi les SDK externes et API tierces doivent se conformer avant d'être intégrés dans l'application iOS. 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.
-
On souhaiterait avoir la possibilité de voir le code qui rentre dans son app et donc préfère ne pas utiliser de SDK avec des sources fermées. Car ce dernier peut faire des actions qui vont à l'encontre de nos CGU et donc pour nous le seul moyen de garantir de qui ce passe est d'avoir du code open source (ou avoir accès au repository privée sur GitHub) et pouvoir auditer toutes les requêtes effectuées par le SDK (à travers l'utilisation de NSURLProtocol par exemple sur iOS). Nous avons eu le problème dans le passé avec des SDKs qui récupéraient des informations utilisateurs sans notre consentement donc maintenant on est plus fermes sur ces questions.
-
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
-
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 en gros).
-
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 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)
- l'utilisation de HTTP/2
- l'utilisation de NSURLSession (URL Session Programming Guide). Si il utilise NSURLSession , on doit pouvoir lui passer une liste de classes supportant le protocole NSURLProtocol et il doit les ajouter à sa NSURLSessionConfiguration en les ajoutant à sa propriété protocolClasses afin de pouvoir correctement auditer les requêtes qu'il effectue
- 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.
- 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