Création de liens profonds dans les notifications push
Découvrez comment configurer des notifications push silencieuses pour le SDK de Braze.
Conditions préalables
Avant de pouvoir utiliser cette fonctionnalité, vous devrez intégrer le SDK Android Braze.
Création d’un délégué universel
Le SDK Android offre la possibilité de définir un objet de délégué unique pour personnaliser les liens profonds ouverts par Braze sur les cartes de contenu, les messages in-app et les notifications push.
Votre objet délégué doit implémenter l’interface IBrazeDeeplinkHandler et être défini à l’aide de BrazeDeeplinkHandler.setBrazeDeeplinkHandler(). Dans la plupart des cas, le délégué doit être défini dans le Application.onCreate() de l’application.
Voici un exemple de contournement du comportement par défaut UriAction avec des indicateurs d’intention personnalisés et un comportement personnalisé pour les URL YouTube :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class CustomDeeplinkHandler implements IBrazeDeeplinkHandler {
private static final String TAG = BrazeLogger.getBrazeLogTag(CustomDeeplinkHandler.class);
@Override
public void gotoUri(Context context, UriAction uriAction) {
String uri = uriAction.getUri().toString();
// Open YouTube URLs in the YouTube app and not our app
if (!StringUtils.isNullOrBlank(uri) && uri.contains("youtube.com")) {
uriAction.setUseWebView(false);
}
CustomUriAction customUriAction = new CustomUriAction(uriAction);
customUriAction.execute(context);
}
public static class CustomUriAction extends UriAction {
public CustomUriAction(@NonNull UriAction uriAction) {
super(uriAction);
}
@Override
protected void openUriWithActionView(Context context, Uri uri, Bundle extras) {
Intent intent = getActionViewIntent(context, uri, extras);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
if (intent.resolveActivity(context.getPackageManager()) != null) {
context.startActivity(intent);
} else {
BrazeLogger.w(TAG, "Could not find appropriate activity to open for deep link " + uri + ".");
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class CustomDeeplinkHandler : IBrazeDeeplinkHandler {
override fun gotoUri(context: Context, uriAction: UriAction) {
val uri = uriAction.uri.toString()
// Open YouTube URLs in the YouTube app and not our app
if (!StringUtils.isNullOrBlank(uri) && uri.contains("youtube.com")) {
uriAction.useWebView = false
}
val customUriAction = CustomUriAction(uriAction)
customUriAction.execute(context)
}
class CustomUriAction(uriAction: UriAction) : UriAction(uriAction) {
override fun openUriWithActionView(context: Context, uri: Uri, extras: Bundle) {
val intent = getActionViewIntent(context, uri, extras)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
if (intent.resolveActivity(context.packageManager) != null) {
context.startActivity(intent)
} else {
BrazeLogger.w(TAG, "Could not find appropriate activity to open for deep link $uri.")
}
}
}
companion object {
private val TAG = BrazeLogger.getBrazeLogTag(CustomDeeplinkHandler::class.java)
}
}
Création de liens profonds vers les paramètres d’application
Pour permettre aux liens profonds d’ouvrir directement les paramètres de votre application, vous aurez besoin d’un BrazeDeeplinkHandler personnalisé. Dans l’exemple suivant, la présence d’une paire clé-valeur personnalisée appelée open_notification_page fera en sorte que le lien profond ouvre la page paramètres de l’application :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
BrazeDeeplinkHandler.setBrazeDeeplinkHandler(new IBrazeDeeplinkHandler() {
@Override
public void gotoUri(Context context, UriAction uriAction) {
final Bundle extras = uriAction.getExtras();
if (extras.containsKey("open_notification_page")) {
Intent intent = new Intent();
intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//for Android 5-7
intent.putExtra("app_package", context.getPackageName());
intent.putExtra("app_uid", context.getApplicationInfo().uid);
// for Android 8 and later
intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName());
context.startActivity(intent);
}
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
BrazeDeeplinkHandler.setBrazeDeeplinkHandler(object : IBrazeDeeplinkHandler {
override fun gotoUri(context: Context, uriAction: UriAction) {
val extras = uriAction.extras
if (extras.containsKey("open_notification_page")) {
val intent = Intent()
intent.action = "android.settings.APP_NOTIFICATION_SETTINGS"
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
//for Android 5-7
intent.putExtra("app_package", context.packageName)
intent.putExtra("app_uid", context.applicationInfo.uid)
// for Android 8 and later
intent.putExtra("android.provider.extra.APP_PACKAGE", context.packageName)
context.startActivity(intent)
}
}
})
Personnalisation de l’activité WebView
Lorsque Braze ouvre des liens profonds vers des sites web à l’intérieur de l’application, les liens profonds sont gérés par BrazeWebViewActivity.
Pour les messages in-app personnalisés en HTML, les liens configurés avec target="_blank" s’ouvrent dans le navigateur web par défaut de l’appareil et ne sont pas gérés par BrazeWebViewActivity.
Pour modifier ceci :
- Créez une nouvelle activité qui gère l’URL cible de
Intent.getExtras()avec la clécom.braze.Constants.BRAZE_WEBVIEW_URL_EXTRA. Pour un exemple, voirBrazeWebViewActivity.kt. - Ajoutez cette activité à
AndroidManifest.xmlet définirexportedsurfalse.1 2 3
<activity android:name=".MyCustomWebViewActivity" android:exported="false" />
- Définissez votre objet personnalisé Activity dans un objet générateur
BrazeConfig. Créez le générateur et passez-le àBraze.configure()dans votreApplication.onCreate().
1
2
3
4
5
BrazeConfig brazeConfig = new BrazeConfig.Builder()
.setCustomWebViewActivityClass(MyCustomWebViewActivity::class)
...
.build();
Braze.configure(this, brazeConfig);
1
2
3
4
5
val brazeConfig = BrazeConfig.Builder()
.setCustomWebViewActivityClass(MyCustomWebViewActivity::class.java)
...
.build()
Braze.configure(this, brazeConfig)
Utiliser Jetpack Compose
Pour gérer les liens profonds lorsque vous utilisez Jetpack Compose avec NavHost :
- Assurez-vous que l’activité qui gère votre lien profond est enregistrée dans le manifeste Android.
1 2 3 4 5 6 7 8 9 10 11
<activity ... <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:host="articles" android:scheme="myapp" /> </intent-filter> </activity>
- Dans NavHost, indiquez les liens profonds que vous souhaitez qu’il gère.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
composableWithCompositionLocal( route = "YOUR_ROUTE_HERE", deepLinks = listOf(navDeepLink { uriPattern = "myapp://articles/{${MainDestinations.ARTICLE_ID_KEY}}" }), arguments = listOf( navArgument(MainDestinations.ARTICLE_ID_KEY) { type = NavType.LongType } ), ) { backStackEntry -> val arguments = requireNotNull(backStackEntry.arguments) val articleId = arguments.getLong(MainDestinations.ARTICLE_ID_KEY) ArticleDetail( articleId ) }
- En fonction de l’architecture de votre application, il se peut que vous deviez également gérer la nouvelle intention envoyée à votre activité en cours.
1 2 3 4 5 6 7
DisposableEffect(Unit) { val listener = Consumer<Intent> { navHostController.handleDeepLink(it) } addOnNewIntentListener(listener) onDispose { removeOnNewIntentListener(listener) } }
Conditions préalables
Avant de pouvoir utiliser cette fonctionnalité, vous devrez intégrer le SDK Swift Braze.
Création de liens profonds
Étape 1 : Enregistrer un régime
Pour gérer les liens profonds, un schéma personnalisé doit être défini dans votre fichier Info.plist. La structure de navigation est définie par un ensemble de dictionnaires. Chacun de ces dictionnaires contient un tableau de chaînes de caractères.
Utiliser l’éditeur Xcode pour modifier votre fichier Info.plist :
- Ajouter une nouvelle clé,
URL types. Xcode fera automatiquement en sorte qu’un tableau contenant un dictionnaire appeléItem 0. - Dans
Item 0, ajouter une cléURL identifier. Définissez la valeur sur votre schéma personnalisé. - Dans
Item 0, ajouter une cléURL Schemes. Ce sera automatiquement un tableau contenant une chaîneItem 0. - Définir
URL Schemes»Item 0à votre schéma personnalisé.
Sinon, si vous souhaitez modifier votre fichier Info.plist directement, vous pouvez suivre cette spécification :
1
2
3
4
5
6
7
8
9
10
11
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>YOUR.SCHEME</string>
<key>CFBundleURLSchemes</key>
<array>
<string>YOUR.SCHEME</string>
</array>
</dict>
</array>
Étape 2 : Ajouter une liste d’autorisation de schéma
Vous devez déclarer les schémas d’URL que vous souhaitez transmettre à canOpenURL(_:) en ajoutant la clé LSApplicationQueriesSchemes au fichier Info.plist de votre application. Si vous tentez d’appeler des schémas en dehors de cette liste, le système enregistrera une erreur dans les journaux de l’appareil et le lien profond ne s’ouvrira pas. Un exemple de cette erreur ressemblera à ceci :
1
<Warning>: -canOpenURL: failed for URL: "yourapp://deeplink" – error: "This app is not allowed to query for scheme yourapp"
Par exemple, si un message in-app doit ouvrir l’application Facebook lorsqu’on appuie dessus, l’application doit avoir le schéma personnalisé de Facebook (fb) dans votre liste d’autorisations. Sinon, le système rejettera le lien profond. Les liens profonds qui dirigent vers une page ou s’affichent dans votre propre application nécessitent toujours que le schéma personnalisé de votre application soit répertorié dans le Info.plist de votre application.
Votre liste d’autorisations pourrait ressembler à ce qui suit :
1
2
3
4
5
6
<key>LSApplicationQueriesSchemes</key>
<array>
<string>myapp</string>
<string>fb</string>
<string>twitter</string>
</array>
Pour plus d’informations, reportez-vous à la documentation d’Apple sur la clé LSApplicationQueriesSchemes.
Étape 3 : Implémenter un gestionnaire
Après avoir activé votre application, iOS appellera la méthode application:openURL:options:. L’argument important est l’objet NSURL.
1
2
3
4
5
6
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let path = url.path
let query = url.query
// Insert your code here to take some action based upon the path and query.
return true
}
1
2
3
4
5
6
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
NSString *path = [url path];
NSString *query = [url query];
// Insert your code here to take some action based upon the path and query.
return YES;
}
Sécurité du transport des applications (ATS)
Selon la définition d’Apple, “App Transport Security est une fonctionnalité qui améliore la sécurité des connexions entre une application et les services web. La fonctionnalité consiste en des exigences de connexion par défaut conformes aux meilleures pratiques visant les connexions sécurisées. Les applications peuvent remplacer ce comportement par défaut et désactiver la sécurité du transport. »
L’ATS est appliqué par défaut. Il nécessite que toutes les connexions utilisent HTTPS et soient chiffrées à l’aide de TLS 1.2 avec confidentialité de transmission. Pour plus d’informations, reportez-vous à la section Exigences pour la connexion à l’aide de l’ATS. Toutes les images servies par Braze aux terminaux sont gérées par un réseau de diffusion de contenu (« CDN ») qui prend en charge TLS 1.2 et est compatible avec ATS.
À moins qu’elles ne soient spécifiées en tant qu’exceptions dans votre application Info.plist, les connexions qui ne respectent pas ces exigences échoueront avec des erreurs similaires à celles qui suivent.
Exemple Erreur 1 :
1
2
CFNetwork SSLHandshake failed (-9801)
Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred, and a secure connection to the server cannot be made."
Exemple d’erreur 2 :
1
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
La conformité ATS est appliquée aux liens ouverts dans l’application mobile (notre gestion par défaut des liens cliqués) et ne s’applique pas aux sites ouverts à l’extérieur via un navigateur web.
Travailler avec l’ATS
Vous pouvez gérer l’ATS de l’une ou l’autre des manières suivantes, mais nous vous recommandons de vous conformer aux exigences de l’ATS.
Votre intégration Braze peut satisfaire aux exigences ATS en s’assurant que tous les liens existants vers lesquels vous amenez les utilisateurs (par exemple, par le biais de messages in-app et de campagnes de notifications push) satisfont aux exigences ATS. Bien qu’il existe des moyens de contourner les restrictions ATS, nous vous recommandons de vous assurer que tous les liens URL sont conformes aux exigences ATS. Compte tenu de l’importance croissante accordée par Apple à la sécurité des applications, il n’est pas garanti que les approches suivantes pour autoriser les exceptions ATS soient prises en charge par Apple.
Vous pouvez autoriser un sous-ensemble de liens avec certains domaines ou programmes à traiter comme des exceptions aux règles ATS. Votre intégration Braze satisfera aux exigences ATS si chaque lien que vous utilisez dans un canal de communication Braze est soit conforme ATS, soit géré par une exception.
Pour ajouter un domaine à une exception de l’ATS, ajoutez-le au fichier Info.plist de votre application :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Pour plus d’informations, consultez l’article d’Apple sur les clés de sécurité pour le transport d’applications.
Vous pouvez désactiver complètement ATS. Notez que ce n’est pas une pratique recommandée, en raison à la fois des protections de sécurité perdues et de la future compatibilité iOS. Pour désactiver ATS, insérez les éléments suivants dans le fichier Info.plist de votre application :
1
2
3
4
5
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Décodage des URL
Le SDK encode les liens en pourcentage pour créer des URLvalides. Tous les caractères de lien qui ne sont pas autorisés dans une URL correctement formée, tels que les caractères Unicode, seront échappés en pourcentage.
Pour décoder un lien codé, utilisez la propriété String removingPercentEncoding. Vous devez également renvoyer true dans le site BrazeDelegate.braze(_:shouldOpenURL:). Un appel à l’action est nécessaire pour déclencher le traitement de l’URL par votre application. Par exemple :
1
2
3
4
5
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let urlString = url.absoluteString.removingPercentEncoding
// Handle urlString
return true
}
1
2
3
4
5
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options {
NSString *urlString = [url.absoluteString stringByRemovingPercentEncoding];
// Handle urlString
return YES;
}
Création de liens profonds vers les paramètres d’application
Vous pouvez tirer parti de UIApplicationOpenSettingsURLString pour établir un lien profond entre les utilisateurs et les paramètres de votre application à partir des notifications push et des messages in-app de Braze.
Pour faire passer les utilisateurs de votre application aux paramètres d’iOS :
- Tout d’abord, assurez-vous que votre application est configurée pour des liens profonds basés sur des schémas ou des liens universels.
- Décidez d’un URI pour le lien profond vers la page Paramètres (par exemple,
myapp://settingsouhttps://www.braze.com/settings). - Si vous utilisez des liens profonds basés sur un schéma personnalisé, ajoutez le code suivant à votre méthode
application:openURL:options::
1
2
3
4
5
6
7
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
let path = url.path
if (path == "settings") {
UIApplication.shared.openURL(URL(string:UIApplication.openSettingsURLString)!)
}
return true
}
1
2
3
4
5
6
7
8
9
10
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
NSString *path = [url path];
if ([path isEqualToString:@"settings"]) {
NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:settingsURL];
}
return YES;
}
Options de personnalisation
Personnalisation de WebView par défaut
La classe Braze.WebViewController affiche les URL Web ouvertes par le SDK, généralement lorsque l’option « Ouvrir l’URL Web dans l’application » est sélectionnée pour un lien profond Web.
Vous pouvez personnaliser le Braze.WebViewController au moyen de la méthode de délégué BrazeDelegate.braze(_:willPresentModalWithContext:).
Gestion de la personnalisation des liens
Le protocole BrazeDelegate peut être utilisé pour personnaliser la gestion des URL telles que les liens profonds, les URL Web et les liens universels. Pour définir le délégué lors de l’initialisation de Braze, définissez un objet délégué sur l’instance Braze. Braze appellera ensuite l’implémentation de votre délégué shouldOpenURL avant de gérer les URI.
Liens universels
Braze prend en charge les liens universels dans les notifications push, les messages in-app et les cartes de contenu. Pour activer la prise en charge des liens universels, configuration.forwardUniversalLinks doit être défini sur true.
Lorsque cette option est activée, Braze transmet les liens universels à l’adresse AppDelegate de votre application via la méthode application:continueUserActivity:restorationHandler: méthode.
Votre application doit également être configurée pour gérer les liens universels. Reportez-vous à la documentation d’Apple pour vous assurer que votre application est configurée correctement pour les liens universels.
Le transfert de lien universel nécessite l’accès aux droits de l’application. Lorsque l’application est exécutée dans un simulateur, ces droits ne sont pas directement disponibles et les liens universels ne sont pas transmis aux gestionnaires du système.
Pour ajouter la prise en charge aux constructions de simulateurs, vous pouvez ajouter le fichier de l’application .entitlements à la phase de création de Copy Bundle Resources. Pour plus d’informations, reportez-vous à forwardUniversalLinks.
Le SDK n’interroge pas le fichier apple-app-site-association de vos domaines. Il fait la différence entre les liens universels et les URL ordinaires en ne tenant compte que du nom de domaine. Par conséquent, le SDK ne respecte aucune règle d’exclusion définie dans l’apple-app-site-association selon les domaines associés.
Exemples
BrazeDelegate
Voici un exemple utilisant BrazeDelegate. Pour plus d’informations, consultez la référence du SDK Braze Swift.
1
2
3
4
5
6
7
8
func braze(_ braze: Braze, shouldOpenURL context: Braze.URLContext) -> Bool {
if context.url.host == "MY-DOMAIN.com" {
// Custom handle link here
return false
}
// Let Braze handle links otherwise
return true
}
1
2
3
4
5
6
7
8
- (BOOL)braze:(Braze *)braze shouldOpenURL:(BRZURLContext *)context {
if ([[context.url.host lowercaseString] isEqualToString:@"MY-DOMAIN.com"]) {
// Custom handle link here
return NO;
}
// Let Braze handle links otherwise
return YES;
}
Conditions préalables
Avant de pouvoir implémenter des liens profonds dans votre application Flutter, vous devrez configurer les liens profonds dans la couche Android ou iOS native.
Implémentation de liens profonds
Étape 1 : Configurer la gestion intégrée de Flutter
- Dans votre projet Xcode, ouvrez votre fichier
Info.plist. - Ajoutez une nouvelle paire clé-valeur.
- Définissez la clé sur
FlutterDeepLinkingEnabled. - Réglez le type sur
Boolean. - Définissez la valeur sur
YES.
- Dans votre projet Android Studio, ouvrez votre fichier
AndroidManifest.xml. - Recherchez
.MainActivitydans vos balisesactivity. - À l’intérieur de la balise
activity, ajoutez la balisemeta-datasuivante :1
<meta-data android:name="flutter_deeplinking_enabled" android:value="true" />
Étape 2 : Transmettre les données à la couche Dart (facultatif)
Vous pouvez utiliser le traitement des liens natifs, de première partie ou de tierce partie pour des cas d’utilisation complexes, tels que l’envoi d’un utilisateur à un emplacement/localisation spécifique dans votre application, ou l’appel d’une fonction spécifique.
Exemple : Lien profond vers une boîte de dialogue d’alerte
Bien que l’exemple suivant ne repose pas sur des paquets supplémentaires, vous pouvez utiliser une approche similaire pour implémenter des paquets natifs, first-party ou third-party, tels que go_router. Un code Dart supplémentaire peut être nécessaire.
Tout d’abord, un canal de méthode est utilisé dans la couche native pour transmettre les données de la chaîne de caractères de l’URL du lien profond à la couche Dart.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
extension AppDelegate {
// Delegate method for handling custom scheme links.
override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
forwardURL(url)
return true
}
// Delegate method for handling universal links.
override func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL else {
return false
}
forwardURL(url)
return true
}
private func forwardURL(_ url: URL) {
guard let controller: FlutterViewController = window?.rootViewController as? FlutterViewController else { return }
let deepLinkChannel = FlutterMethodChannel(name: "deepLinkChannel", binaryMessenger: controller.binaryMessenger)
deepLinkChannel.invokeMethod("receiveDeepLink", arguments: url.absoluteString)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MainActivity : FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
handleDeepLink(intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
handleDeepLink(intent)
}
private fun handleDeepLink(intent: Intent) {
val binaryMessenger = flutterEngine?.dartExecutor?.binaryMessenger
if (intent?.action == Intent.ACTION_VIEW && binaryMessenger != null) {
MethodChannel(binaryMessenger, "deepLinkChannel")
.invokeMethod("receivedDeepLink", intent?.data.toString())
}
}
}
Ensuite, une fonction de rappel est utilisée dans la couche Dart pour afficher un dialogue d’alerte en utilisant les données de la chaîne de caractères URL envoyées précédemment.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
MethodChannel('deepLinkChannel').setMethodCallHandler((call) async {
deepLinkAlert(call.arguments, context);
});
void deepLinkAlert(String link, BuildContext context) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("Deep Link Alert"),
content: Text("Opened with deep link: $link"),
actions: <Widget>[
TextButton(
child: Text("Close"),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
}
Modifier cette page sur GitHub