Flutter深度链接到谷歌地图和Waze



我正在实现一个从flutter应用程序到导航应用程序(如谷歌地图或Waze(的深度链接。我对谷歌地图或Waze都没有问题,我的问题是,如果我为谷歌地图配置链接,用户仍然可以选择在Waze中打开它,但显然没有启动导航,因为参数不同。

有没有办法限制用户在应用程序上的选择?或者,根据用户选择打开的应用程序,是否可以使用不同的链接?或者更好的是,有一个通用的导航链接可以在两个应用程序上使用吗?

您可以使用通用链接(iOS(/应用程序链接(Android(强制打开所选应用程序,它应该强制打开所选择的应用程序。当然,如果你想启动的应用程序在设备中找不到,它会在浏览器中打开它。

在这里,我假设你使用纬度和经度导航到这个地方,但你可以很容易地将其调整到其他地方。我还使用url_launcher来启动链接。

void launchWaze(double lat, double lng) async {
var url = 'waze://?ll=${lat.toString()},${lng.toString()}';
var fallbackUrl =
'https://waze.com/ul?ll=${lat.toString()},${lng.toString()}&navigate=yes';
try {
bool launched =
await launch(url, forceSafariVC: false, forceWebView: false);
if (!launched) {
await launch(fallbackUrl, forceSafariVC: false, forceWebView: false);
}
} catch (e) {
await launch(fallbackUrl, forceSafariVC: false, forceWebView: false);
}
}
void launchGoogleMaps(double lat, double lng) async {
var url = 'google.navigation:q=${lat.toString()},${lng.toString()}';
var fallbackUrl =
'https://www.google.com/maps/search/?api=1&query=${lat.toString()},${lng.toString()}';
try {
bool launched =
await launch(url, forceSafariVC: false, forceWebView: false);
if (!launched) {
await launch(fallbackUrl, forceSafariVC: false, forceWebView: false);
}
} catch (e) {
await launch(fallbackUrl, forceSafariVC: false, forceWebView: false);
}
}

您还需要将以下内容添加到Info.plist文件中:

<key>LSApplicationQueriesSchemes</key>
<array>
<string>googlechromes</string>
<string>comgooglemaps</string>
<string>waze</string>
</array>

更新到url_launcher最新版本

import 'package:url_launcher/url_launcher.dart' as url_launcher;
...


Future<void> launchWazeRoute(double lat, double lng) async {
var url = 'waze://?ll=${lat.toString()},${lng.toString()}';
var fallbackUrl =
'https://waze.com/ul?ll=${lat.toString()},${lng.toString()}&navigate=yes';
try {
bool launched = false;
if (!kIsWeb) {
launched = await url_launcher.launchUrl(Uri.parse(url));
}
if (!launched) {
await url_launcher.launchUrl(Uri.parse(fallbackUrl));
}
} catch (e) {
await url_launcher.launchUrl(Uri.parse(fallbackUrl));
}
}

Future<void> launchGoogleMaps(double lat, double lng) async {
var url = 'google.navigation:q=${lat.toString()},${lng.toString()}';
var fallbackUrl =
'https://www.google.com/maps/search/?api=1&query=${lat.toString()},${lng.toString()}';
try {
bool launched = false;
if (!kIsWeb) {
launched = await url_launcher.launchUrl(Uri.parse(url));
}
if (!launched) {
await url_launcher.launchUrl(Uri.parse(fallbackUrl));
}
} catch (e) {
await url_launcher.launchUrl(Uri.parse(fallbackUrl));
}
}

您还需要将其放在info.plist文件中:

<key>LSApplicationQueriesSchemes</key>
<array>
<string>googlechromes</string>
<string>comgooglemaps</string>
<string>waze</string>
</array>

最新更新