49

我已经知道如何从 safari 启动应用程序,但是否可以在启动前检查应用程序是否已安装?如果应用程序当前未安装在 iPhone 上,我正在考虑启动应用程序商店。

4

4 回答 4

88

无法检查是否从网页安装了应用程序。您可以通过检查是否可以使用 UIApplication 的 -canOpenURL: 方法打开您的 url 方案,在其他应用程序中执行此操作,但没有与此等效的 javascript。

但是,您可以使用以下解决方法:

<script language="javascript">
    function open_appstore() {
        window.location='http://itunes.com/';
    }

    function try_to_open_app() {
        setTimeout('open_appstore()', 300);
    }
</script>

<a onClick="javascript:try_to_open_app();" href="yourappurl:">App name</a>

此代码将在链接上设置超时,如果此超时结束,将调用 open_appstore 函数。由于您的链接指向应用程序的自定义 url,Safari 将尝试打开该链接,如果可以,它将打开应用程序并停止计时器,因此不会打开 AppStore 链接。

如果应用程序链接无法打开,当计时器用完时,它会显示一个错误弹出窗口,说它无法打开页面(无法摆脱),但它会立即转到 AppStore 并消除该错误。


iOS 9添加了一个非常好的功能,可以让您的应用打开 http/s url:通用链接


iOS 10中,当您点击链接并安装应用程序时,会弹出“在 [应用程序名称] 中打开”。如果用户没有点击给定的“打开timeout,这个解决方案将使用回退。由于 300ms 太短而无法点击任何东西,因此此解决方案在 iOS 10 上总是失败

于 2011-08-06T08:24:16.700 回答
11

这在类似情况下对我有用:如果支持,我想打开 gmaps 应用程序 - 否则直接转到 gmap 站点。

function mapLink(addy) {     
  addy = encodeURIComponent(addy);

  var fallback = 'http://maps.google.com/?q=' + addy
  , link = 'comgooglemaps://?q=' + addy;

  try {
    document.location = link;
  } catch(err) {
    document.location = fallback;
  }
}

似乎对我的用例很有效。

更新: 如果您想在回退时创建一个新窗口,这仍然允许弹出 ios 错误消息。为了解决它,试试这个。

  try {
    document.location = link;
  } catch(err) {
    window.location.reload(true);
    window.open(fallback, '_blank');
  }
于 2014-03-27T15:36:30.243 回答
9

苹果的解决方案:

来自 Apple 文档

https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/PromotingAppswithAppBanners/PromotingAppswithAppBanners.html

如果应用程序已经安装在用户的设备上,横幅会智能地改变它的动作,点击横幅会简单地打开应用程序。如果用户在他的设备上没有您的应用程序,点击横幅将带他到应用程序在 App Store 中的条目。当他返回您的网站时,横幅中会出现一个进度条,指示完成下载需要多长时间。当应用程序完成下载后,查看按钮变为打开按钮,点击横幅将打开应用程序,同时保留您网站中的用户上下文。

智能应用横幅会自动确定用户设备是否支持该应用。如果加载横幅的设备不支持您的应用,或者您的应用在用户所在位置不可用,则横幅将不会显示。

要将智能应用横幅添加到我们的网页,请在您希望横幅出现的每个页面的头部添加以下元标记:

注意:我们也可以传递 app-argument: like myName,etc.,

检查是否在此页面中为您的应用标题提供导航上下文

更新:

1. 关闭显示的横幅后,即使您在我们的 html 中有该元标记,也不会再次显示。

2.要重置启动设置应用程序,然后导航到常规>重新发送>重置所有设置

于 2014-03-26T06:48:45.533 回答
2

您可以简单地从方法-(BOOL)openURL:(NSURL )url*中读取返回值,如果为 NO,则表示未安装目标应用程序。以下代码片段给出了一个使用 navigon url 方案的示例:

NSString *stringURL = @"navigon://coordinate/NaviCard/19.084443/47.573305";
NSURL *url = [NSURL URLWithString:stringURL];
if([[UIApplication sharedApplication] openURL:url]) {
    NSLog(@"Well done!");
} else {
    stringURL = @"https://itunes.apple.com/it/app/id320279293?mt=8";
    url = [NSURL URLWithString:stringURL];
    [[UIApplication sharedApplication] openURL:url];
}

感谢 zszen 的更正。

于 2014-01-09T15:32:21.217 回答