2012-12-27 108 views
36

我知道可以通过注册自定义方案(例如://)直接链接到iOS应用程序,也可以通过应用程序链接到应用程序iTunes中。重定向到应用程序(如果已安装),否则将其重定向到应用程序商店

在很多情况下,理想流程是提供一个链接,如果安装了,则链接会重定向到应用程序,如果不是,则链接到商店。这是可能的,如果是的话,如何?

为了清晰起见,添加了,该场景是我打开一个链接(http)从我的iphone上的电子邮件邀请我加入一个应用程序组中。如果用户在该设备上安装了应用程序,则应打开该应用程序,否则http链接应重定向到iTunes。

+1

我认为理想的解决方案将意味着你可以重定向到iTunes的链接与指令。就像:https://itunes.apple.com/us/app/clear/id492134154?mt=8&uo=4&open=true where open = true告诉iOS应用程序商店打开应用程序... – ConfusedNoob

回答

22

无法检查这个。 但是,有一个很好的解决方法。

的想法基本上是这样的:

  1. 你打开你的应用程序中的第一次,你从你的应用程序中打开移动Safari预定义的URL服务器
  2. 上在该网址上设置了一个饼干,像appInstalled用户的移动Safari浏览器
  3. 然后你踢用户返回到您的应用与您的注册计划(同FB不与SSO)
  4. 您的所有电子邮件中的链接指向你的网站,但该网站你检查浏览器是否为移动Safari以及appInsta lled cookie exists
  5. 如果浏览器不是移动版Safari浏览器或未找到cookie,则重定向到AppStore或停留在您的网页中。
  6. 如果#4的条件为真,您将用户重定向到您的应用程序并注册了
  7. 如果该应用程序已被用户删除,所以自定义url方案失败,您将有一个自动安全重定向到AppStore的

的最后2个步骤进行了说明on this SO post

+1

第一步中的注意事项我尝试用应用程序内部webview替换safari,但它不工作,因为它们不共享相同的cookie存储。 – Federico

+0

不幸的是,这需要更新ios客户端。 – BananaNeil

+0

当用户从设置中清除网站数据时,这不起作用 – Nishad

7

是的,它很容易。这需要你想要打开的应用程序在plist中声明一个url方案:

//if you can open your app 
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"yourapp://"]]) 
{ 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"yourapp://"]]; 
} 
else 
{ 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"ituneappstorelink"]]; 
} 
+0

对不起,我的场景也许不清楚 - 这是假设我从另一个应用程序打开。在这种情况下,它将通过电子邮件或通过http网页链接发送短信 - 所以远程Web服务器需要重定向到适当的链接。 – ConfusedNoob

+0

您可能不得不链接到试图以相同方式通过Javascript打开应用程序的网页,如果它没有打开它然后重定向到iTunes链接。我没有这方面的资料,但它可以工作。 – rooster117

32

我认为比较简单的答案是建立一个网页服务器上,使用下列的javascript:

(function() { 
    var app = { 
    launchApp: function() { 
     window.location.replace("myapp://"); 
     this.timer = setTimeout(this.openWebApp, 1000); 
    }, 

    openWebApp: function() { 
     window.location.replace("http://itunesstorelink/"); 
    } 
    }; 

    app.launchApp(); 
})(); 

这基本上会尝试重定向到您的应用程序并设置超时重定向到应用程序商店,如果它失败。

您甚至可以使代码更加智能一些,并检查用户代理以查看它们是ios用户,android用户还是web用户,然后适当地重定向它们。

+2

这应该被考虑用于接受的答案。 – user

+3

如果未使用此方法安装应用程序,则iOS会引发相当不友好的“Safari无法打开页面,因为地址无效”消息。 –

+1

@RealWorld这听起来像是ios 11的新增加。这几天,对于这个话题,我会推荐实现通用链接。可能值得为这个问题写一个新的答案,概述它的工作原理。 – BananaNeil

13

如果您的电子邮件中包含iframe的网页,并且src设置为您的应用的自定义方案,则iOS会自动重定向到应用中的该位置。如果应用程序未安装,则不会发生任何事情。这允许您深入链接到应用程序(如果它已安装),或者如果未安装,则重定向到App Store。

例如,如果您安装了twitter应用程序,并导航到包含以下标记的网页,您将立即转到该应用程序。如果您没有安装Twitter应用程序,则会看到文字“Twitter应用程序未安装”。

<!DOCTYPE html> 
<html> 
    <head> 
    <title>iOS Automatic Deep Linking</title> 
    </head> 
    <body> 
     <iframe src="twitter://" width="0" height="0"></iframe> 
     <p>The Twitter App is not installed</p> 
    </body> 
</html> 

这里,如果没有安装应用程序重定向到App Store进行更彻底的例子:

<!DOCTYPE html> 
<html> 
    <head> 
    <title>iOS Automatic Deep Linking</title> 
    <script src='//code.jquery.com/jquery-1.11.2.min.js'></script> 
    <script src='//mobileesp.googlecode.com/svn/JavaScript/mdetect.js'></script> 
    <script> 
     (function ($, MobileEsp) { 
     // On document ready, redirect to the App on the App store. 
     $(function() { 
      if (typeof MobileEsp.DetectIos !== 'undefined' && MobileEsp.DetectIos()) { 
      // Add an iframe to twitter://, and then an iframe for the app store 
      // link. If the first fails to redirect to the Twitter app, the 
      // second will redirect to the app on the App Store. We use jQuery 
      // to add this after the document is fully loaded, so if the user 
      // comes back to the browser, they see the content they expect. 
      $('body').append('<iframe class="twitter-detect" src="twitter://" />') 
       .append('<iframe class="twitter-detect" src="itms-apps://itunes.com/apps/twitter" />'); 
      } 
     }); 
     })(jQuery, MobileEsp); 
    </script> 
    <style type="text/css"> 
     .twitter-detect { 
     display: none; 
     } 
    </style> 
    </head> 
    <body> 
    <p>Website content.</p> 
    </body> 
</html> 
+0

为了记录,这就是我们在Syfy.com上所做的。如果已安装,请转到http://www.syfy.com/live以查看该站点是否自动将您深入链接到应用程序。 – q0rban

+0

这是问题的正确答案。我不是在页面本身检测iOS,而是在获取请求中检查用户代理标题,并向重定向页面或向用户发送请求的页面打开iOS设备中的链接。出于好奇,你怎么知道iframe会以这种方式行事?在iframe html文档中找不到这个。 –

+1

谢谢@CarlosGuzman!我不知道它会这样工作,我只是不断尝试不同的东西,直到它的工作! :) – q0rban

相关问题