如何在 flutter 中实现深度链接,并重定向到应用商店?
How to implement deep linking in flutter, with redirect to app store?
有没有办法在 flutter 中实现深度 linking,这样如果用户点击 link 然后他们会被重定向到应用程序的特定部分,前提是应用程序已安装,但如果未安装,它们将被重定向到相应的应用程序商店,以安装应用程序,然后转到该特定部分?
在寻找解决方案时,我遇到了这个名为 uni_links
的软件包,但我不确定它是否可以满足此要求。
从 iOS 12 开始,如果您的应用程序未安装,则无法让直接应用程序深度 link 重定向到应用程序商店。
您可以使用网站上的元标记 apple-itunes-app
深入 link 应用商店或在您的应用中深入 link。但这只是在页面顶部显示一个小横幅,并不是真正的深度 link.
我以前没有使用过但可能也值得一试的一个系统是 branch.io。你也许可以用他们的系统实现类似的东西,但我不确定它是如何工作的。它肯定不是 iOS 12.
的一部分
您可以为此目的使用 Firebase 动态 links:
https://firebase.google.com/docs/dynamic-links
上面写着:
if a user opens a Dynamic Link on iOS or Android and doesn't have
your app installed, the user can be prompted to install it; then,
after installation, your app starts and can access the link.
您可以在此处找到有关如何使用 Flutter 实现此功能的信息:
https://pub.dev/packages/firebase_dynamic_links
我自己用 Android 和 iOS 试过了,效果很好。如果未安装该应用程序,则会打开 Google Play 商店或 Apple AppStore。用户可以点击 "Install",然后点击 "Open"。之后您的应用程序启动,动态 link 被发送到您的应用程序(通过剪贴板在 iOS 上),您可以按照上面网站上的说明访问它。 IE。在第一个 initState 方法中启动您的应用程序后,您可以调用
final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.retrieveDynamicLink();
final Uri deepLink = data?.link;
获得深度link。然而,根据我在 iOS 上的经验,现在检索 link 还为时过早。我在尝试时得到 "null"。似乎需要一点时间。然后我使用 WidgetsBindingObserver 并在 didChangeAppLifecycleState 方法中观察 AppLifecycleState.resumed
。我在那里调用了 retrieveDynamicLink。由于权限请求(如果用户允许通知),该方法被调用了两次。第一次返回 null 但第二次调用时返回 deep link。所以我的解决方案是这样的:
class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
_retrieveDynamicLink();
}
}
/**
* Laden des Deep Link nach der Installation.
*/
Future<void> _retrieveDynamicLink() async {
final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.retrieveDynamicLink();
final Uri deepLink = data?.link;
if (deepLink != null) {
// Use the deepLink
// ...
}
}
我回答晚了,但它可能会对其他人有所帮助。
我们可以使用 firebase 动态 links 与 firebase_dynamic_links plugin. Refer this link for full implementation steps and create and receive a link, https://medium.com/better-programming/deep-linking-in-flutter-with-firebase-dynamic-links-8a4b1981e1eb 一起进行深度 linking。这是在应用程序中接收 link 并打开特定屏幕的示例代码。
class MainWidgetState extends State<MainWidget> {
@override
void initState() {
super.initState();
this.initDynamicLinks();
}
initDynamicLinks(BuildContext context) async {
await Future.delayed(Duration(seconds: 3));
var data = await FirebaseDynamicLinks.instance.getInitialLink();
var deepLink = data?.link;
final queryParams = deepLink.queryParameters;
if (queryParams.length > 0) {
var userName = queryParams['userId'];
openSpecificScreen(userName);
}
FirebaseDynamicLinks.instance.onLink(onSuccess: (dynamicLink)
async {
var deepLink = dynamicLink?.link;
final queryParams = deepLink.queryParameters;
if (queryParams.length > 0) {
var userName = queryParams['userId'];
openSpecificScreen(userName);
}
debugPrint('DynamicLinks onLink $deepLink');
}, onError: (e) async {
debugPrint('DynamicLinks onError $e');
});
}
openSpecificScreen(String userName){
Navigator.of(context).pushNamed("routeFormScreen", arguments: {"name": userName});
}
}
有没有办法在 flutter 中实现深度 linking,这样如果用户点击 link 然后他们会被重定向到应用程序的特定部分,前提是应用程序已安装,但如果未安装,它们将被重定向到相应的应用程序商店,以安装应用程序,然后转到该特定部分?
在寻找解决方案时,我遇到了这个名为 uni_links
的软件包,但我不确定它是否可以满足此要求。
从 iOS 12 开始,如果您的应用程序未安装,则无法让直接应用程序深度 link 重定向到应用程序商店。
您可以使用网站上的元标记 apple-itunes-app
深入 link 应用商店或在您的应用中深入 link。但这只是在页面顶部显示一个小横幅,并不是真正的深度 link.
我以前没有使用过但可能也值得一试的一个系统是 branch.io。你也许可以用他们的系统实现类似的东西,但我不确定它是如何工作的。它肯定不是 iOS 12.
的一部分您可以为此目的使用 Firebase 动态 links:
https://firebase.google.com/docs/dynamic-links
上面写着:
if a user opens a Dynamic Link on iOS or Android and doesn't have your app installed, the user can be prompted to install it; then, after installation, your app starts and can access the link.
您可以在此处找到有关如何使用 Flutter 实现此功能的信息:
https://pub.dev/packages/firebase_dynamic_links
我自己用 Android 和 iOS 试过了,效果很好。如果未安装该应用程序,则会打开 Google Play 商店或 Apple AppStore。用户可以点击 "Install",然后点击 "Open"。之后您的应用程序启动,动态 link 被发送到您的应用程序(通过剪贴板在 iOS 上),您可以按照上面网站上的说明访问它。 IE。在第一个 initState 方法中启动您的应用程序后,您可以调用
final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.retrieveDynamicLink();
final Uri deepLink = data?.link;
获得深度link。然而,根据我在 iOS 上的经验,现在检索 link 还为时过早。我在尝试时得到 "null"。似乎需要一点时间。然后我使用 WidgetsBindingObserver 并在 didChangeAppLifecycleState 方法中观察 AppLifecycleState.resumed
。我在那里调用了 retrieveDynamicLink。由于权限请求(如果用户允许通知),该方法被调用了两次。第一次返回 null 但第二次调用时返回 deep link。所以我的解决方案是这样的:
class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
_retrieveDynamicLink();
}
}
/**
* Laden des Deep Link nach der Installation.
*/
Future<void> _retrieveDynamicLink() async {
final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.retrieveDynamicLink();
final Uri deepLink = data?.link;
if (deepLink != null) {
// Use the deepLink
// ...
}
}
我回答晚了,但它可能会对其他人有所帮助。
我们可以使用 firebase 动态 links 与 firebase_dynamic_links plugin. Refer this link for full implementation steps and create and receive a link, https://medium.com/better-programming/deep-linking-in-flutter-with-firebase-dynamic-links-8a4b1981e1eb 一起进行深度 linking。这是在应用程序中接收 link 并打开特定屏幕的示例代码。
class MainWidgetState extends State<MainWidget> {
@override
void initState() {
super.initState();
this.initDynamicLinks();
}
initDynamicLinks(BuildContext context) async {
await Future.delayed(Duration(seconds: 3));
var data = await FirebaseDynamicLinks.instance.getInitialLink();
var deepLink = data?.link;
final queryParams = deepLink.queryParameters;
if (queryParams.length > 0) {
var userName = queryParams['userId'];
openSpecificScreen(userName);
}
FirebaseDynamicLinks.instance.onLink(onSuccess: (dynamicLink)
async {
var deepLink = dynamicLink?.link;
final queryParams = deepLink.queryParameters;
if (queryParams.length > 0) {
var userName = queryParams['userId'];
openSpecificScreen(userName);
}
debugPrint('DynamicLinks onLink $deepLink');
}, onError: (e) async {
debugPrint('DynamicLinks onError $e');
});
}
openSpecificScreen(String userName){
Navigator.of(context).pushNamed("routeFormScreen", arguments: {"name": userName});
}
}