在iOS上确定应用程序是否存在并启动该应用程序

76

有没有办法检查iOS系统,以确定另一个应用程序是否已被安装并启动?如果我没记错,早期版本中是不可能的,但现在是否已经改变了呢?


1
我认为这一定有办法实现 - 我这么说是因为Facebook SDK的实现会在安装了Facebook应用程序的情况下启动Facebook应用程序,否则它将回退到Safari。你需要了解其他应用程序的一些信息,因为对于Facebook,你需要向自己的应用程序添加一些注册信息。 - Tomas McGuinness
是的,我想如果你知道应用程序标识符,你可以以某种方式检查并启动它。但我找不到任何相关的参考资料。我希望有人尝试过这个。 - Rob
5
NSURL *urlApp = [NSURL URLWithString:@"fb://"]; BOOL canOpenFBApp = [[UIApplication sharedApplication] canOpenURL:urlApp]; printf("\n canOpenFBApp:%i \n",canOpenFBApp);(翻译)足够简单,例如: NSURL *urlApp = [NSURL URLWithString:@"fb://"]; BOOL canOpenFBApp = [[UIApplication sharedApplication] canOpenURL:urlApp]; printf("\n canOpenFBApp:%i \n",canOpenFBApp); - dijipiji
6个回答

66

可行,但很棘手。

启动已安装的应用程序(如FB或Twitter应用程序)是使用自定义URL方案完成的。这些可以在其他应用程序以及网站上使用。

这里有一篇关于如何在自己的应用程序中执行此操作的文章

然而,检测URL是否存在可能有些棘手。一个检测已安装应用程序的好例子是Boxcar。问题在于Boxcar对自定义URL具有高级知识。我相当(99%)确定有canOpenURL:,因此提前知道要定位的应用程序的自定义方案使其易于实现。

这里是一份部分列表,列出了一些更受欢迎的URL,您可以针对这些进行检查。

有一种方法可以找到自定义应用程序URL:https://www.amerhukic.com/finding-the-custom-url-scheme-of-an-ios-app

但是,如果您想扫描应用并推断出它们的URL,则无法在非JB设备上完成。

这里有一篇博客文章,介绍了Bump团队如何处理这个问题。


你可以参考iHasApps查看用户设备上的应用列表。 - 1789040
感谢Doug提供这些链接。我有一个类似于这篇帖子的问题。我在我的帖子中提到了你(如果你不想在那里被提到,请编辑它)。 - Silex
8
链接失效。 - Greg Hilston
这是一篇关于如何使用自己的应用程序完成此操作的文章。 (http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html) - Alexey Golikov

44

有一个如下的脚本。

<script type="text/javascript">
function startMyApp()
{
  document.location = 'yourAppScheme://';
  setTimeout( function()
  {
      if( confirm( 'You do not seem to have Your App installed, do you want to go download it now?'))
      {
        document.location = 'http://itunes.apple.com/us/app/yourAppId';
      }
  }, 300);
 }
</script>

通过从网页上调用此脚本(<a href="#" onclick="startMyApp()">尝试启动我的应用</a>),您可以确定设备上是否安装了具有方案名称"yourAppScheme"的应用。

如果应用已在设备上安装并且其中注册了"yourAppScheme",则应用将启动。如果未安装该应用,则可以建议用户从iTunes安装此应用。


23
但是如果应用程序不存在,您仍将看到来自Safari的错误消息。 - shebelaw
10
有人知道如何避免Safari出现应用程序未安装的错误消息吗? - davidk
3
这似乎是个不太稳定的黑客方式……在重定向(document.location)后,JavaScript 应该停止执行,因此 setTimeout 函数中的内容永远不会被执行。除非 iOS 智能应用横幅 能满足您的需求,否则我也不知道有更好的方法了。如果有人能证明我错了那就太好了。 - johndodo
3
@johndodo 这正是关键所在。如果重定向成功,JavaScript 将停止执行,从而避免超时阻塞(不过,它确实应该检查当前时间与启动时间是否匹配,因为当用户稍后重新进入 Safari 时它会继续执行)。另一方面,如果重定向失败,用户将会看到两条消息:第一条是由 Safari 提供的丑陋信息,但随后会有第二条用户提供的、有些道歉的消息来解释第一条。这并不理想,但至少不像仅仅看到那个第一个错误那么困惑。 - devios1
2
这不起作用,setTimeout 在意图重定向后仍然被执行。 - Sagar Khan
显示剩余4条评论

22

检查一个应用是否已安装(例如 Clear):

BOOL installed = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"clearapp://"]];
打开该应用程序:
BOOL success = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"clearapp://"]];

1
正是我所寻找的! - Jamal Zafar
这是相关文档链接:https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIApplication_Class/#//apple_ref/occ/instm/UIApplication/canOpenURL: - John Bachir
查找应用程序的自定义URL:https://www.amerhukic.com/finding-the-custom-url-scheme-of-an-ios-app - computingfreak

13

如果应用程序未安装,则隐藏错误消息

Branch,我们使用以下代码形式--请注意,iframe适用于更多的浏览器。只需替换您的应用程序URI和您的应用商店链接即可。

<!DOCTYPE html>
<html>
    <body>
        <script type="text/javascript">
            window.onload = function() {
                // Deep link to your app goes here
                document.getElementById("l").src = "my_app://";

                setTimeout(function() {
                    // Link to the App Store should go here -- only fires if deep link fails                
                    window.location = "https://itunes.apple.com/us/app/my.app/id123456789?ls=1&mt=8";
                }, 500);
            };
        </script>
        <iframe id="l" width="1" height="1" style="visibility:hidden"></iframe>
    </body>
</html>

还有第二种可能性,首先依靠cookie,只有当cookie无法使用时才使用javascript重定向。逻辑如下:

当没有安装您的应用程序的用户首次点击您应用程序的链接时,他或她将直接重定向到App Store。这是通过链接到您的应用程序实际上是由您的服务器上的动态生成页面来完成的。您创建一个cookie并在后端记录IP地址、操作系统、操作系统版本等的“数字指纹”。

当用户安装应用程序并打开它时,您收集并发送另一个“数字指纹”到您的后端。现在您的后端知道该链接已安装。在以后访问与您的应用程序相关联的链接时,根据请求中发送的cookie,您的服务器确保动态生成的重定向页面将引导用户进入应用程序而不是App Store。

这避免了丑陋的重定向,但需要更多的工作。


1
通用链接即将到来 :) - st.derrick
这里的 my_app 是指 appname 还是 appID - nimsrules

2
据我理解,由于隐私问题,您无法查看设备上是否安装了应用程序。解决方法是尝试启动应用程序,如果无法启动,则让用户点击备用URL。为了防止移动Safari出现错误,我发现将其放置在iframe中有助于解决问题。
以下是我使用的代码片段。
<form name="mobileForm" action="mobile_landing.php" method="post">
        <input type="hidden" name="url" value="<?=$web_client_url?>">
        <input type="hidden" name="mobile_app" value="<?=$mobile_app?>">
        <input type="hidden" name="device_os" value="<?=$device_os?>">
    </form>
<script type="text/javascript">
        var device_os = '<? echo $device_os; ?>'; 


        if (device_os == 'ios'){

        var now = new Date().valueOf(); 
        setTimeout(function () { 
            if (new Date().valueOf() - now > 100) 
                return;

        document.forms[0].submit(); }, 5); 


        var redirect = function (location) {
            var iframe = document.createElement('iframe');
            iframe.setAttribute('src', location);
            iframe.setAttribute('width', '1px');
            iframe.setAttribute('height', '1px');
            iframe.setAttribute('position', 'absolute');
            iframe.setAttribute('top', '0');
            iframe.setAttribute('left', '0');
            document.documentElement.appendChild(iframe);
            iframe.parentNode.removeChild(iframe);
            iframe = null;
        };

        setTimeout(function(){
            window.close()
            }, 150 );

        redirect("AppScheme");

1
我最近遇到了这个问题,这是我想出的解决方案。请注意,仍然没有确定的方法来检测应用程序是否已启动。
我从服务器上提供一个页面,在检测到用户代理后重定向到 iPhone 特定的变体。只能通过电子邮件/短信或 Facebook 共享该页面的链接。
该页面呈现引用文档的最小版本,但在加载时自动尝试使用隐藏的

1
如果应用程序未安装,这仍将显示丑陋的“Safari无法打开页面,因为地址无效。”警报,对吗?我真的想找到一种方法来避免这个警报。建议在短时间间隔后自动重定向或显示确认的解决方案对我的项目来说不够好。 - Gustav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接