Récupérer les flows et paywalls - Kotlin Multiplatform

Ce que récupère getFlow
Flows Créés dans le Flow Builder — rendus nativement sur l'appareil, sans WebView
Paywalls du Paywall Builder Tout le contenu existant du Paywall Builder

Après avoir conçu votre flow ou paywall avec le Paywall Builder, vous pouvez l’afficher dans votre application mobile. La première étape consiste à récupérer le flow ou le paywall associé au placement et à sa configuration d’affichage, comme décrit ci-dessous.

Vous souhaitez voir un exemple concret d’intégration du SDK Adapty dans une application mobile ? Consultez nos exemples d’applications, qui illustrent la configuration complète, notamment l’affichage des paywalls, les achats et d’autres fonctionnalités de base.

Avant de commencer à afficher des flows dans votre application mobile (cliquer pour développer)
  1. Créez vos produits dans l’Adapty Dashboard.
  2. Créez un flow/paywall et intégrez-y des produits dans l’Adapty Dashboard.
  3. Créez des placements et intégrez-y votre flow/paywall dans l’Adapty Dashboard.
  4. Installez le SDK Adapty dans votre application mobile.

Récupérer un flow/paywall

Si vous avez conçu un flow ou un paywall avec le Flow Builder ou le Paywall Builder, vous n’avez pas à vous soucier de son rendu dans le code de votre application mobile pour l’afficher à l’utilisateur. Un tel flow ou paywall contient à la fois ce qui doit être affiché et la façon dont cela doit l’être. Vous devez néanmoins récupérer son identifiant via le placement, sa configuration d’affichage, puis le présenter dans votre application mobile.

Pour garantir des performances optimales, il est essentiel de récupérer le flow ou le paywall et sa configuration de vue le plus tôt possible, afin de laisser suffisamment de temps aux images de se télécharger avant de les afficher à l’utilisateur.

Pour obtenir un flow ou un paywall, utilisez la méthode getFlow :


Adapty.getFlow(
    placementId = "YOUR_PLACEMENT_ID",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default,
    loadTimeout = 5.seconds
).onSuccess { flow ->
    // the requested flow/paywall
}.onError { error ->
    // handle the error
}

Paramètres :

ParamètrePrésenceDescription
placementIdrequisL’identifiant du Placement souhaité. C’est la valeur que vous avez indiquée lors de la création d’un placement dans l’Adapty Dashboard.
fetchPolicypar défaut : AdaptyPaywallFetchPolicy.Default

Par défaut, le SDK tente de charger les données depuis le serveur et retourne les données en cache en cas d’échec. Nous recommandons cette option, car elle garantit que vos utilisateurs disposent toujours des données les plus récentes.

Toutefois, si vous pensez que vos utilisateurs ont une connexion internet instable, envisagez d’utiliser AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad pour retourner les données en cache si elles existent. Dans ce cas, les utilisateurs pourraient ne pas obtenir les toutes dernières données, mais ils bénéficieront de temps de chargement plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sûr de l’utiliser pendant la session pour éviter les requêtes réseau.

Notez que le cache reste intact après un redémarrage de l’application et n’est effacé que lors d’une réinstallation ou d’un nettoyage manuel.

Le SDK Adapty stocke les flows et les paywalls localement en deux couches : le cache mis à jour régulièrement décrit ci-dessus et les paywalls de secours. Nous utilisons également un CDN pour les récupérer plus rapidement ainsi qu’un serveur de secours indépendant en cas d’inaccessibilité du CDN. Ce système est conçu pour garantir que vous disposez toujours de la dernière version tout en assurant la fiabilité même lorsque la connexion internet est limitée.

loadTimeoutpar défaut : 5 sec

Cette valeur limite le délai d’attente de cette méthode. Si le délai est atteint, les données en cache ou le fallback local seront retournés.

Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai indiqué dans loadTimeout, car l’opération peut être composée de différentes requêtes en arrière-plan.

Pour Kotlin Multiplatform : vous pouvez créer une Duration avec des fonctions d’extension comme 5.seconds, où .seconds provient de kotlin.time.Duration.Companion.seconds.

Paramètres de réponse :

ParamètreDescription
FlowUn objet AdaptyFlow contenant le placement, les identifiants (instanceIdentity, variationId), le nom, les variantes de paywall (paywalls — une liste d’AdaptyFlowPaywall), et les Remote Configs (remoteConfigs — une liste avec une entrée par locale). Pour récupérer les produits réels en vue d’un préchargement, d’une interface personnalisée ou de vérifications programmatiques, appelez getPaywallProducts(flow).

Récupérer la configuration de la vue

Après avoir récupéré le flow ou le paywall, chargez sa configuration de vue et créez la vue en une seule étape avec la méthode createFlowView. Il n’y a pas de flag distinct à vérifier : si le placement a été conçu dans le Flow Builder (un flow) ou le Paywall Builder (un paywall), createFlowView renvoie la vue prête à être affichée. Si le placement est un paywall personnalisé sans interface Builder, createFlowView renvoie une AdaptyResult.Errortraitez-le comme un paywall Remote Config.

Assurez-vous d’activer le bouton Show on device dans le Flow Builder. Si cette option n’est pas activée, la configuration de la vue ne sera pas disponible pour être récupérée.


AdaptyUI.createFlowView(
    flow = flow,
    loadTimeout = 5.seconds,
    preloadProducts = true
).onSuccess { view ->
    // use view
}.onError { error ->
    // the flow has no view configured, or view creation failed
}
ParamètrePrésenceDescription
flowobligatoireUn objet AdaptyFlow obtenu via Adapty.getFlow.
localeoptionnelL’identifiant de la localisation du flow avec laquelle afficher la vue — par exemple, en ou pt-br. Si omis, la vue s’affiche en en, ou dans la localisation par défaut du flow si celui-ci ne dispose pas de version en. Voir Localisations et codes de langue.
loadTimeoutoptionnelCette valeur limite le délai d’attente de cette méthode. Si le délai est dépassé, les données en cache ou le fallback local seront renvoyés. Notez que dans de rares cas, cette méthode peut expirer légèrement après la valeur spécifiée dans loadTimeout, car l’opération peut inclure différentes requêtes en interne. Vous pouvez utiliser des fonctions d’extension comme 5.seconds de kotlin.time.Duration.Companion.
preloadProductsoptionnelDéfinissez à true pour précharger les produits et améliorer les performances. Lorsque cette option est activée, les produits sont chargés à l’avance, réduisant le temps nécessaire à l’affichage du flow ou du paywall.
productPurchaseParamsoptionnelUne map de AdaptyProductIdentifier vers AdaptyPurchaseParameters. Utilisez ceci pour configurer des paramètres d’achat spécifiques, comme des offres personnalisées ou des paramètres de mise à jour d’abonnement, pour des produits individuels dans le flow ou le paywall.

Si vous utilisez plusieurs langues, découvrez comment ajouter une localisation dans le Builder.

Une fois chargé, présentez le flow ou le paywall.

Obtenir un flow ou un paywall pour l’audience par défaut afin d’accélérer la récupération

En général, les flows et les paywalls sont récupérés presque instantanément, vous n’avez donc pas à vous soucier d’accélérer ce processus. Cependant, si vous avez de nombreuses audiences et placements, et que vos utilisateurs disposent d’une connexion internet faible, la récupération d’un flow ou d’un paywall peut prendre plus de temps que souhaité. Dans ces situations, vous pouvez afficher un flow ou un paywall par défaut pour garantir une expérience utilisateur fluide plutôt que de ne rien afficher du tout.

Pour remédier à cela, vous pouvez utiliser la méthode getFlowForDefaultAudience, qui récupère le flow ou le paywall du placement spécifié pour l’audience All Users. Il est toutefois essentiel de comprendre que l’approche recommandée consiste à récupérer le flow ou le paywall via la méthode getFlow, comme décrit dans la section Récupérer le flow/paywall ci-dessus.

Pourquoi nous recommandons d’utiliser getFlow

La méthode getFlowForDefaultAudience présente quelques inconvénients importants :

  • Problèmes potentiels de compatibilité ascendante : Si vous devez afficher des flows différents selon les versions de l’application (actuelle et futures), vous risquez de rencontrer des difficultés. Vous devrez soit concevoir des flows compatibles avec la version actuelle (héritée), soit accepter que les utilisateurs de cette version puissent rencontrer des problèmes avec des flows non rendus.
  • Perte de ciblage : Tous les utilisateurs verront le même flow conçu pour l’audience All Users, ce qui signifie que vous perdez le ciblage personnalisé (notamment selon les pays, l’attribution marketing ou vos propres attributs personnalisés).

Si vous acceptez ces inconvénients pour bénéficier d’une récupération plus rapide du flow ou du paywall, utilisez la méthode getFlowForDefaultAudience comme suit. Sinon, restez sur getFlow décrit ci-dessus.


Adapty.getFlowForDefaultAudience(
    placementId = "YOUR_PLACEMENT_ID",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default,
).onSuccess { flow ->
    // the requested flow
}.onError { error ->
    // handle the error
}
ParamètrePrésenceDescription
placementIdrequisL’identifiant du Placement. C’est la valeur que vous avez spécifiée lors de la création d’un placement dans votre Adapty Dashboard.
fetchPolicypar défaut : AdaptyPaywallFetchPolicy.Default

Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d’échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.

Cependant, si vos utilisateurs sont souvent confrontés à une connexion instable, envisagez d’utiliser AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad pour renvoyer les données en cache lorsqu’elles sont disponibles. Dans ce cas, les utilisateurs risquent de ne pas obtenir les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l’utiliser pendant la session pour éviter des requêtes réseau.

Notez que le cache est conservé lors du redémarrage de l’application et n’est effacé que lors de la désinstallation ou d’un nettoyage manuel.

Personnaliser les ressources

Pour personnaliser les images et vidéos de votre flow ou paywall, implémentez des ressources personnalisées.

Les images hero et les vidéos ont des IDs prédéfinis : hero_image et hero_video. Dans un bundle de ressources personnalisées, vous ciblez ces éléments par leur ID et personnalisez leur comportement.

Pour les autres images et vidéos, vous devez définir un ID personnalisé dans l’Adapty Dashboard.

Par exemple, vous pouvez :

  • Afficher une image ou vidéo différente à certains utilisateurs.
  • Afficher une image d’aperçu locale pendant le chargement d’une image principale distante.
  • Afficher une image d’aperçu avant de lancer une vidéo.

Voici un exemple de la façon dont vous pouvez fournir des ressources personnalisées via une map :

Le SDK Kotlin Multiplatform ne prend en charge que les ressources locales. Pour le contenu distant, vous devez télécharger et mettre en cache les ressources localement avant de les utiliser dans les ressources personnalisées.

// Import generated Res class for accessing resources

viewModelScope.launch {
    // Get URIs for bundled resources using Res.getUri()
    val heroImagePath = Res.getUri("files/images/hero_image.png")
    val demoVideoPath = Res.getUri("files/videos/demo_video.mp4")

    // Or read image as byte data
    val imageByteData = Res.readBytes("files/images/avatar.png")

    // Create custom assets map
    val customAssets: Map<String, AdaptyCustomAsset> = mapOf(
        // Load image from app resources (bundled with the app)
        // Files should be placed in commonMain/composeResources/files/
        "hero_image" to AdaptyCustomAsset.localImageResource(
            path = heroImagePath
        ),

        // Or use image byte data
        "avatar" to AdaptyCustomAsset.localImageData(
            data = imageByteData
        ),

        // Load video from app resources
        "demo_video" to AdaptyCustomAsset.localVideoResource(
            path = demoVideoPath
        ),

        // Or use a video file from device storage
        "intro_video" to AdaptyCustomAsset.localVideoFile(
            path = "/path/to/local/video.mp4"
        ),

        // Apply custom brand colors
        "brand_primary" to AdaptyCustomAsset.color(
            colorHex = "#FF6B35"
        ),

        // Create gradient background
        "card_gradient" to AdaptyCustomAsset.linearGradient(
            colors = listOf("#1E3A8A", "#3B82F6", "#60A5FA"),
            stops = listOf(0.0f, 0.5f, 1.0f)
        )
    )

    // Use custom assets when creating the flow view
    AdaptyUI.createFlowView(
        flow = flow,
        customAssets = customAssets
    ).onSuccess { view ->
        // Present the flow with custom assets
        view.present()
    }.onError { error ->
        // Handle the error - the flow will fall back to default appearance
    }
}

Si un asset est introuvable ou ne se charge pas, le flow ou le paywall reviendra à son apparence par défaut configurée dans le Builder.

Après avoir conçu la partie visuelle de votre paywall avec le nouveau Paywall Builder dans l’Adapty Dashboard, vous pouvez l’afficher dans votre application mobile. La première étape de ce processus consiste à récupérer le paywall associé au placement et sa configuration d’affichage, comme décrit ci-dessous.

Veuillez noter que ce sujet concerne les paywalls personnalisées avec le Paywall Builder. Si vous implémentez vos paywalls manuellement, consultez la rubrique Récupérer les paywalls et les produits pour les paywalls Remote Config dans votre application mobile.

Vous souhaitez voir un exemple concret d’intégration du SDK Adapty dans une application mobile ? Consultez nos exemples d’applications, qui illustrent la configuration complète, notamment l’affichage des paywalls, les achats et d’autres fonctionnalités de base.

Avant de commencer à afficher des paywalls dans votre application mobile (cliquez pour développer)
  1. Créez vos produits dans l’Adapty Dashboard.
  2. Créez un paywall et incorporez-y les produits dans l’Adapty Dashboard.
  3. Créez des placements et incorporez-y votre paywall dans l’Adapty Dashboard.
  4. Installez le SDK Adapty dans votre application mobile.

Récupérer un paywall conçu avec le Paywall Builder

Si vous avez conçu un paywall avec le Paywall Builder, vous n’avez pas à vous soucier de son rendu dans le code de votre application mobile pour l’afficher à l’utilisateur. Un tel paywall contient à la fois ce qui doit être affiché et la façon dont cela doit l’être. Vous devez néanmoins récupérer son identifiant via le placement, sa configuration d’affichage, puis le présenter dans votre application mobile.

Pour garantir des performances optimales, il est crucial de récupérer le paywall et sa configuration de vue le plus tôt possible, afin de laisser suffisamment de temps aux images de se télécharger avant de les présenter à l’utilisateur.

Pour obtenir un paywall, utilisez la méthode getPaywall :


Adapty.getPaywall(
    placementId = "YOUR_PLACEMENT_ID",
    locale = "en",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default,
    loadTimeout = 5.seconds
).onSuccess { paywall ->
    // the requested paywall
}.onError { error ->
    // handle the error
}

Paramètres :

ParamètrePrésenceDescription
placementIdrequisL’identifiant du Placement souhaité. C’est la valeur que vous avez spécifiée lors de la création d’un placement dans l’Adapty Dashboard.
locale

optionnel

par défaut : en

L’identifiant de la localisation du paywall. Ce paramètre doit être un code de langue composé d’un ou deux sous-tags séparés par le caractère moins (-). Le premier sous-tag correspond à la langue, le second à la région.

Exemple : en désigne l’anglais, pt-br représente le portugais brésilien.

Consultez Localisations et codes de langue pour plus d’informations sur les codes de langue et nos recommandations d’utilisation.

fetchPolicypar défaut : AdaptyPaywallFetchPolicy.Default

Par défaut, le SDK tente de charger les données depuis le serveur et retourne les données en cache en cas d’échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.

Cependant, si vos utilisateurs ont une connexion internet instable, envisagez d’utiliser AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad pour retourner les données en cache lorsqu’elles existent. Dans ce cas, les utilisateurs n’auront peut-être pas les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l’utiliser pendant la session pour éviter les requêtes réseau.

Notez que le cache reste intact après un redémarrage de l’application et n’est effacé que lors d’une réinstallation ou d’un nettoyage manuel.

Le SDK Adapty stocke les paywalls localement sur deux niveaux : le cache mis à jour régulièrement décrit ci-dessus et les paywalls de secours. Nous utilisons également un CDN pour récupérer les paywalls plus rapidement, ainsi qu’un serveur de secours indépendant en cas d’indisponibilité du CDN. Ce système est conçu pour vous garantir toujours la dernière version de vos paywalls, tout en assurant une fiabilité optimale même en cas de connexion internet limitée.

loadTimeoutpar défaut : 5 sec

Cette valeur limite le délai d’attente pour cette méthode. Si le délai est dépassé, les données en cache ou le fallback local seront retournés.

Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans loadTimeout, car l’opération peut impliquer différentes requêtes en interne.

Pour Kotlin Multiplatform : vous pouvez créer un TimeInterval avec des fonctions d’extension (comme 5.seconds, où .seconds provient de import com.adapty.utils.seconds), ou TimeInterval.seconds(5). Pour ne fixer aucune limite, utilisez TimeInterval.INFINITE.

Paramètres de réponse :

ParamètreDescription
PaywallUn objet AdaptyPaywall contenant une liste d’identifiants de produits, l’identifiant du paywall, le Remote Config et plusieurs autres propriétés.

Récupérer la configuration d’affichage d’un paywall conçu avec le Paywall Builder

Assurez-vous d’activer le bouton Show on device dans le Paywall Builder. Si cette option n’est pas activée, la configuration d’affichage ne sera pas disponible.

Après avoir récupéré le paywall, vérifiez s’il contient une ViewConfiguration, ce qui indique qu’il a été créé avec le Paywall Builder. Cela vous permettra de savoir comment afficher le paywall. Si la ViewConfiguration est présente, traitez-le comme un paywall Paywall Builder ; sinon, gérez-le comme un paywall Remote Config.

Utilisez la méthode createPaywallView pour charger la configuration de la vue.


if (paywall.hasViewConfiguration) {
    AdaptyUI.createPaywallView(
        paywall = paywall,
        loadTimeout = 5.seconds,
        preloadProducts = true
    ).onSuccess { paywallView ->
        // use paywallView
    }.onError { error ->
        // handle the error
    }
} else {
    // use your custom logic
}
ParamètrePrésenceDescription
paywallobligatoireUn objet AdaptyPaywall permettant d’obtenir un contrôleur pour le paywall souhaité.
loadTimeoutoptionnelCette valeur limite le délai d’attente pour cette méthode. Si le délai est dépassé, les données en cache ou le fallback local seront retournés. Notez que dans de rares cas, cette méthode peut expirer légèrement après le délai spécifié dans loadTimeout, car l’opération peut être composée de différentes requêtes en interne. Vous pouvez utiliser des fonctions d’extension telles que 5.seconds de kotlin.time.Duration.Companion.
preloadProductsoptionnelDéfinissez à true pour précharger les produits et améliorer les performances. Lorsque cette option est activée, les produits sont chargés à l’avance, ce qui réduit le temps nécessaire à l’affichage du paywall.
productPurchaseParamsoptionnelUne map de AdaptyProductIdentifier vers AdaptyPurchaseParameters. Utilisez-la pour configurer des paramètres d’achat spécifiques tels que des offres personnalisées ou des paramètres de mise à jour d’abonnement pour des produits individuels dans le paywall.

Si vous utilisez plusieurs langues, découvrez comment ajouter une localisation du Paywall Builder.

Une fois chargé, affichez le paywall.

Obtenir un paywall pour l’audience par défaut afin d’accélérer la récupération

En règle générale, les paywalls sont récupérés presque instantanément, vous n’avez donc pas à vous soucier d’optimiser ce processus. Cependant, si vous avez de nombreuses audiences et paywalls, et que vos utilisateurs disposent d’une connexion internet faible, la récupération d’un paywall peut prendre plus de temps que souhaité. Dans ce cas, vous pouvez afficher un paywall par défaut pour garantir une expérience utilisateur fluide plutôt que de ne rien afficher du tout.

Pour y remédier, vous pouvez utiliser la méthode getPaywallForDefaultAudience, qui récupère le paywall du placement spécifié pour l’audience All Users. Cependant, il est essentiel de comprendre que l’approche recommandée est de récupérer le paywall via la méthode getPaywall, comme décrit dans la section Récupérer les informations du paywall ci-dessus.

Pourquoi nous recommandons d’utiliser getPaywall

La méthode getPaywallForDefaultAudience présente quelques inconvénients majeurs :

  • Problèmes potentiels de compatibilité ascendante : Si vous devez afficher des paywalls différents selon les versions de l’application (actuelle et futures), vous pourrez rencontrer des difficultés. Vous devrez soit concevoir des paywalls compatibles avec la version actuelle (legacy), soit accepter que les utilisateurs de cette version puissent rencontrer des problèmes avec des paywalls non rendus.
  • Perte de ciblage : Tous les utilisateurs verront le même paywall conçu pour l’audience All Users, ce qui signifie que vous perdez le ciblage personnalisé (notamment selon les pays, l’attribution marketing ou vos propres attributs personnalisés).

Si vous acceptez ces inconvénients pour bénéficier d’une récupération plus rapide des paywalls, utilisez la méthode getPaywallForDefaultAudience comme suit. Sinon, restez sur getPaywall décrit ci-dessus.


Adapty.getPaywallForDefaultAudience(
    placementId = "YOUR_PLACEMENT_ID",
    locale = "en",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default,
).onSuccess { paywall ->
    // the requested paywall
}.onError { error ->
    // handle the error
}
ParamètrePrésenceDescription
placementIdrequisL’identifiant du Placement. Il s’agit de la valeur que vous avez spécifiée lors de la création d’un placement dans votre Adapty Dashboard.
locale

optionnel

défaut : en

L’identifiant de la localisation du paywall. Ce paramètre doit être un code de langue composé d’un ou plusieurs sous-tags séparés par le caractère moins (-). Le premier sous-tag correspond à la langue, le second à la région.

Exemple : en désigne l’anglais, pt-br représente le portugais brésilien.

Consultez Localisations et codes de locale pour plus d’informations sur les codes de locale et notre recommandation d’utilisation.

fetchPolicydéfaut : AdaptyPaywallFetchPolicy.Default

Par défaut, le SDK tente de charger les données depuis le serveur et renvoie les données en cache en cas d’échec. Nous recommandons cette option, car elle garantit que vos utilisateurs reçoivent toujours les données les plus récentes.

Cependant, si vous pensez que vos utilisateurs sont souvent confrontés à une connexion instable, envisagez d’utiliser AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad pour renvoyer les données en cache si elles existent. Dans ce cas, les utilisateurs n’auront peut-être pas les toutes dernières données, mais les temps de chargement seront plus rapides, quelle que soit la qualité de leur connexion. Le cache est mis à jour régulièrement, il est donc sans risque de l’utiliser pendant la session pour éviter les requêtes réseau.

Notez que le cache est conservé après un redémarrage de l’application et n’est effacé que lors d’une réinstallation ou d’un nettoyage manuel.

Personnaliser les ressources

Pour personnaliser les images et vidéos de votre paywall, mettez en place des ressources personnalisées.

Les images et vidéos hero ont des IDs prédéfinis : hero_image et hero_video. Dans un bundle de ressources personnalisé, vous ciblez ces éléments par leur ID et personnalisez leur comportement.

Pour les autres images et vidéos, vous devez définir un ID personnalisé dans le dashboard Adapty.

Par exemple, vous pouvez :

  • Afficher une image ou une vidéo différente à certains utilisateurs.
  • Afficher une image d’aperçu locale pendant le chargement d’une image principale distante.
  • Afficher une image d’aperçu avant de lancer une vidéo.

Pour utiliser cette fonctionnalité, mettez à jour le SDK Adapty vers la version 3.7.0 ou supérieure.

Voici un exemple de la façon dont vous pouvez fournir des ressources personnalisées via une map :

Le SDK Kotlin Multiplatform ne prend en charge que les ressources locales. Pour le contenu distant, vous devez télécharger et mettre en cache les ressources localement avant de les utiliser dans les ressources personnalisées.

// Import generated Res class for accessing resources

viewModelScope.launch {
    // Get URIs for bundled resources using Res.getUri()
    val heroImagePath = Res.getUri("files/images/hero_image.png")
    val demoVideoPath = Res.getUri("files/videos/demo_video.mp4")

    // Or read image as byte data
    val imageByteData = Res.readBytes("files/images/avatar.png")

    // Create custom assets map
    val customAssets: Map<String, AdaptyCustomAsset> = mapOf(
        // Load image from app resources (bundled with the app)
        // Files should be placed in commonMain/composeResources/files/
        "hero_image" to AdaptyCustomAsset.localImageResource(
            path = heroImagePath
        ),

        // Or use image byte data
        "avatar" to AdaptyCustomAsset.localImageData(
            data = imageByteData
        ),

        // Load video from app resources
        "demo_video" to AdaptyCustomAsset.localVideoResource(
            path = demoVideoPath
        ),

        // Or use a video file from device storage
        "intro_video" to AdaptyCustomAsset.localVideoFile(
            path = "/path/to/local/video.mp4"
        ),

        // Apply custom brand colors
        "brand_primary" to AdaptyCustomAsset.color(
            colorHex = "#FF6B35"
        ),

        // Create gradient background
        "card_gradient" to AdaptyCustomAsset.linearGradient(
            colors = listOf("#1E3A8A", "#3B82F6", "#60A5FA"),
            stops = listOf(0.0f, 0.5f, 1.0f)
        )
    )

    // Use custom assets when creating paywall view
    AdaptyUI.createPaywallView(
        paywall = paywall,
        customAssets = customAssets
    ).onSuccess { paywallView ->
        // Present the paywall with custom assets
        paywallView.present()
    }.onError { error ->
        // Handle the error - paywall will fall back to default appearance
    }
}

Si une ressource est introuvable ou ne parvient pas à se charger, le paywall reviendra à son apparence par défaut configurée dans le Paywall Builder.