Comment gérer les liens profonds dans UIKit

La gestion des liens profonds dans UIKit implique deux mécanismes principaux : les **Schémas d'URL Personnalisés** (Custom URL Schemes) et les **Universal Links**. Bien que les deux permettent aux utilisateurs de naviguer directement vers un contenu spécifique dans votre application, les Universal L

Intermediate

La gestion des liens profonds dans UIKit implique deux mécanismes principaux : les Schémas d'URL Personnalisés (Custom URL Schemes) et les Universal Links. Bien que les deux permettent aux utilisateurs de naviguer directement vers un contenu spécifique dans votre application, les Universal Links sont généralement préférés pour leur expérience utilisateur transparente et leur meilleur comportement de repli.

1. Schémas d'URL Personnalisés

Les schémas d'URL personnalisés vous permettent de définir un préfixe unique pour les URL de votre application (par exemple, myapp://product/123). Lorsqu'un utilisateur touche un lien avec ce schéma, iOS lance votre application.

Configuration :

  1. Enregistrer le schéma d'URL dans Xcode :

    • Ouvrez votre projet dans Xcode.
    • Sélectionnez votre projet dans le navigateur de projet, puis sélectionnez votre cible.
    • Accédez à l'onglet "Info".
    • Dans la section "URL Types", cliquez sur le bouton "+" pour ajouter un nouveau type d'URL.
    • Pour "Identifier", vous pouvez utiliser l'ID de bundle de votre application (par exemple, com.yourcompany.yourapp).
    • Pour "URL Schemes", entrez votre schéma personnalisé souhaité (par exemple, myapp).
  2. Gérer l'URL entrante dans AppDelegate ou SceneDelegate :

    • Pour les applications utilisant AppDelegate (anciennes applications ou celles n'utilisant pas les Scene Delegates) : Implémentez la méthode application(_:open:options:).

      swift func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { // Parse the URL and navigate to the appropriate content print("Received URL: \(url)") handleDeepLink(url) return true }

    • Pour les applications utilisant SceneDelegate (iOS 13 et versions ultérieures) : Implémentez scene(_:openURLContexts:) ou scene(_:continue:).

      ```swift func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { guard let url = URLContexts.first?.url else { return } print("Received URL: (url)") handleDeepLink(url) }

      // For Universal Links, you'll also use this method func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL else { return } print("Received Universal Link: (url)") handleDeepLink(url) } ```

2. Universal Links

Les Universal Links sont des liens HTTPS standard qui fonctionnent à la fois pour votre site Web et votre application. Si votre application est installée, le lien s'ouvre directement dans votre application ; sinon, il s'ouvre dans Safari. Cela offre une expérience utilisateur beaucoup plus fluide.

Configuration :

  1. Créer un fichier apple-app-site-association :

    • Ce fichier JSON indique à iOS quelles URL votre application peut gérer.
    • Hébergez ce fichier à la racine de votre serveur Web ou dans le sous-répertoire .well-known (par exemple, https://yourdomain.com/apple-app-site-association).
    • Exemple de contenu : json { "applinks": { "apps": [], "details": [ { "appID": "TEAM_ID.com.yourcompany.yourapp", "paths": [ "/product/*", "/settings/*" ] } ] } } Remplacez TEAM_ID et com.yourcompany.yourapp par vos valeurs réelles.
  2. Activer la capacité "Associated Domains" dans Xcode :

    • Dans Xcode, sélectionnez votre projet et votre cible.
    • Accédez à l'onglet "Signing & Capabilities".
    • Cliquez sur "+ Capability" et sélectionnez "Associated Domains".
    • Ajoutez une entrée pour chaque domaine que votre application doit gérer, préfixée par applinks: (par exemple, applinks:yourdomain.com).
  3. Gérer l'URL entrante dans AppDelegate ou SceneDelegate :

    • Les Universal Links sont gérés à l'aide de l'objet NSUserActivity.
    • Pour AppDelegate : Implémentez application(_:continue:restorationHandler:).

      swift func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL else { return false } print("Received Universal Link: \(url)") handleDeepLink(url) return true }

    • Pour SceneDelegate : Utilisez la méthode scene(_:continue:) comme montré dans la section Schémas d'URL Personnalisés ci-dessus.

3. Logique Générale de Gestion des Liens Profonds (fonction handleDeepLink)

Indépendamment de l'utilisation de schémas d'URL personnalisés ou d'Universal Links, la logique principale pour analyser l'URL et naviguer dans votre application reste similaire.

func handleDeepLink(_ url: URL) {
    guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false) else {
        return
    }

    // Example: myapp://product/123?color=red
    // Example: https://yourdomain.com/product/123?color=red

    if components.host == "product" {
        // Extract product ID from path components or query parameters
        let productID = components.path.replacingOccurrences(of: "/", with: "")
        let color = components.queryItems?.first(where: { $0.name == "color" })?.value

        // Navigate to product detail screen
        // (e.g., using a UINavigationController or presenting a new view controller)
        if let rootViewController = UIApplication.shared.windows.first?.rootViewController as? UINavigationController {
            let productViewController = ProductDetailViewController() // Your custom VC
            productViewController.productID = productID
            productViewController.selectedColor = color
            rootViewController.pushViewController(productViewController, animated: true)
        }
    } else if components.host == "settings" {
        // Navigate to settings screen
        if let rootViewController = UIApplication.shared.windows.first?.rootViewController as? UINavigationController {
            let settingsViewController = SettingsViewController() // Your custom VC
            rootViewController.pushViewController(settingsViewController, animated: true)
        }
    }
    // Add more conditions for different paths/hosts
}

4. Considérations de Sécurité

Les liens profonds peuvent être un vecteur d'attaque potentiel. Validez toujours tous les paramètres d'URL et rejetez les URL malformées. Limitez les actions disponibles via les liens profonds à celles qui ne risquent pas les données de l'utilisateur, et ne leur permettez jamais de supprimer directement du contenu ou d'accéder à des informations sensibles.

5. Tester les Liens Profonds

Vous pouvez tester les liens profonds en : * Entrant le schéma d'URL personnalisé dans Safari (par exemple, myapp://product/123). * Utilisant la commande xcrun simctl openurl booted <URL> dans votre terminal pour ouvrir des URL dans le simulateur iOS. * Appuyant sur des Universal Links à partir d'une page Web dans Safari.