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


74

有没有一种方法可以检查iOS以查看是否已安装另一个应用程序,然后启动该应用程序?如果记忆能为我服务,这在早期版本中是不可能的,但是是否已更改?


1
我认为这一定是有可能的-我之所以这样说是因为Facebook SDK实现将在安装后启动Facebook应用程序,否则将回退到Safari。您确实需要了解有关其他应用程序的一些信息,因为使用Facebook,您需要向自己的应用程序添加一些注册信息。
Tomas McGuinness

是的,我想知道是否知道您可以检查并以某种方式启动的应用程序标识符。但我找不到对此的任何参考。我希望有人尝试过这个。
罗布

5
很容易,例如:NSURL * urlApp = [NSURL URLWithString:@“ fb://”]; BOOL canOpenFBApp = [[UIApplication sharedApplication] canOpenURL:urlApp]; printf(“ \ n canOpenFBApp:%i \ n”,canOpenFBApp);
dijipiji 2012年

Answers:


66

可行,但棘手。

使用自定义URL方案启动已安装的应用程序,例如FB或Twitter应用程序。这些可以在其他应用程序以及网站中使用。

这是一篇有关如何使用自己的应用程序执行此操作的文章

但是,查看URL是否存在可能很棘手。Boxcar是检测安装的应用程序的一个很好的例子。这里的问题是Boxcar对自定义URL有很深的了解。我相当(99%)确定存在a canOpenURL:,因此提前知道您要定位的应用程序的自定义方案即可轻松实现。

是一些您可以检查的更流行的URL的部分列表

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

但是,如果您要扫描应用程序并推断其URL,则无法在非JB设备上完成。

这是一篇博客文章,谈论凹凸的人们如何解决这个问题。


您可以在iHasApps上查看用户设备上的应用程序列表。
1789040

感谢Doug提供这些链接。我对此帖子也有类似的疑问。我在我的帖子中提到了您(如果您不想在那里被提及,请对其进行编辑)。
Silex 2013年

6
链接已死。
格雷格·希尔斯顿


41

有一个类似以下的脚本。

<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()">Try to start MyApp</a>)调用此脚本,您可以确定设备上是否安装了方案为“ yourAppScheme”的应用。

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


22
但如果该应用程序不存在,您仍然会看到来自野生动物园的错误消息。
shebelaw 2012年

9
如果没有安装该应用程序,是否有人知道如何避免从Safari看到该错误消息?
大卫2012年

1
是的,没错,如果未安装应用,我们如何才能避免在野生动物园内出现错误消息“无法打开页面”?
Hardik Thakkar,2012年

3
这似乎是一种hack,而且也是一种不稳定的hack ... redirect(document.location)之后,JS应该停止执行,因此不应执行in中的函数setTimeout。并不是我知道更好的方法(除非iOS Smart App Banners足以满足您的需求)。希望被证明是错误的。
约翰多多

3
@johndodo这就是重点。如果重定向成功,JavaScript的将停止执行,从而避免超时块(但是,它真的应该检查当前的时间对启动时间,因为它继续当用户返回到Safari浏览器后执行)。另一方面,如果重定向失败,则用户将看到两条消息:Safari所提供的第一条丑陋的消息,但是第二条由用户提供的,有点歉意的消息来解释第一条消息。它的效果并不理想,但至少不会像乱如刚刚看到的是第一个错误。
devios1 2013年

22

要检查是否已安装应用程序(例如,清除):

BOOL installed = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"clearapp://"]];

要打开该应用程序:

BOOL success = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"clearapp://"]];

1
正是我想要的!
Jamal Zafar


找到应用程序的customurl
computingfreak

13

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

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

<!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,而javascript重定向仅作为后备。这是逻辑:

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

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

这避免了丑陋的重定向,但需要进行大量工作。


1
通用链接即将到来:)
st.derrick

my_appappname还是在appID
Nimsrules

2

据我了解,由于隐私问题,您无法查看设备上是否安装了应用程序。解决此问题的方法是尝试启动应用程序,如果无法启动,则请用户点击后备网址。为了防止发生移动浏览器错误,我发现将其放置在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

我最近为此苦苦挣扎,这是我想出的解决方案。请注意,仍然没有确定方法来检测应用程序是否启动。

我从服务器提供一个页面,该页面在检测到User-Agent时重定向到特定于iPhone的变体。该页面的链接只能通过电子邮件/ SMS或Facebook共享。

该页面呈现了所引用文档的最低版本,但是在加载后立即自动尝试使用隐藏的<iframe>尝试打开应用程序(在这种情况下AJAX始终会失败-为此,您不能使用jQuery或XMLHttpRequest )。

如果注册了URL方案,则该应用将打开,用户将能够执行他们需要的所有操作。无论哪种方式,页面都在底部显示如下消息:“应用程序启动了吗?否则,您可能尚未安装……。”并带有指向商店的链接。


1
这仍然会显示丑陋的“ Safari浏览器无法打开页面,因为地址无效。”-如果未安装该应用程序则提示,对吗?我真的很想找到一种方法来传递该警报。建议短时间间隔后自动重定向或显示确认的解决方案对于我的项目来说还不够好。
古斯塔夫2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.