【问题标题】:How can I natively launch an external app from within Xamarin.Forms?如何从 Xamarin.Forms 中本地启动外部应用程序?
【发布时间】:2016-04-11 03:53:08
【问题描述】:
正如问题标题所示,我正在寻找一种从 Xamarin.Forms 应用程序中启动外部应用程序的方法。例如,我的应用程序有一个地址列表,当用户点击其中一个时,当前平台的内置地图应用程序将打开(Android 版 Google 地图,iOS 版 Apple 地图)。以防万一,我只针对 Android 和 iOS。
当然,我可以使用依赖服务并在每个平台的基础上编写应用程序启动代码,但我更愿意只编写一次。在 Xamarin.Forms 中是否有本机方式来执行此操作?我无法在 Xamarin 网站或论坛上找到任何正式记录此内容的内容。
【问题讨论】:
标签:
c#
xamarin
cross-platform
xamarin.forms
【解决方案1】:
使用Device.OpenUri 并将其传递给适当的URI,结合Device.OnPlatform 来格式化每个平台的URI
string url;
Device.OnPlatform(iOS: () =>
{
url = String.Format("http://maps.apple.com/maps?q={0}", address);
},
Android: () =>
{
url = String.Format("http://maps.google.com/maps?q={0}", address);
});
Device.OpenUri(url);
【解决方案2】:
从 Xamarin.Forms v4.3.0.908675(可能是 v4.3.0)开始,Device.OpenUri 已弃用,您应该改用 Xamarin.Essentials 中的 Launcher.TryOpenAsync。虽然你会觉得很麻烦,至少我是这样。
【解决方案3】:
使用下面的代码,并添加命名空间Xamarin.Essentials 和Xamarin.Forms
if (Device.RuntimePlatform == Device.iOS)
{
// https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html
await Launcher.OpenAsync("http://maps.apple.com/?daddr=San+Francisco,+CA&saddr=cupertino");
}
else if (Device.RuntimePlatform == Device.Android)
{
// opens the 'task chooser' so the user can pick Maps, Chrome or other mapping app
await Launcher.OpenAsync("http://maps.google.com/?daddr=San+Francisco,+CA&saddr=Mountain+View");
}
else if (Device.RuntimePlatform == Device.UWP)
{
await Launcher.OpenAsync("bingmaps:?rtp=adr.394 Pacific Ave San Francisco CA~adr.One Microsoft Way Redmond WA 98052");
}