重定向到应用程序(如果已安装),否则重定向到App Store


72

我知道可以通过注册自定义方案(例如so://)直接链接到iOS中的应用程序,也可以通过iTunes链接到appstore中的应用程序。

在许多情况下,理想的流程是提供一个链接,如果安装了该应用程序,重定向到该应用程序;如果未安装,重定向到该商店。这可能吗?如果可以,怎么办?

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


1
我认为理想的解决方案将意味着您可以使用指令重定向到iTunes链接。类似于:itunes.apple.com/us/app/clear/…其中open = true告诉ios应用商店打开应用...
ConfusedNoob

Answers:


28

没有办法检查这一点。但是,有一个不错的解决方法。

这个想法基本上是这样的:

  1. 首次打开应用程序时,您可以从应用程序内打开移动浏览器到服务器上的预定义URL
  2. 在该URL上设置一个cookie,例如appInstalled到用户的移动Safari
  3. 然后,您使用注册方案将用户踢回您的应用程序(与FB使用SSO相同)
  4. 您所有的电子邮件链接都指向您的网站,但是在该网站上,您检查浏览器是否为移动Safari以及是否存在appInstalled cookie
  5. 如果浏览器不是移动Safari或找不到cookie,则可以重定向到AppStore或留在网页中。
  6. 如果#4的条件为真,则可以使用注册的方案将用户重定向到您的应用
  7. 如果该应用已被用户删除,则自定义网址方案失败,那么您将具有故障安全重定向到应用商店

最后2个步骤在此SO帖子中进行了解释


1
请注意,在第一步中,我尝试将safari替换为应用程序内部webview,但此操作无效,因为它们不共享相同的cookie存储。
Federico

不幸的是,这需要对ios客户端进行更新。
BananaNeil 2014年

当用户从设置中清除网站数据时,此功能将无效
Nishad 2015年

没有人说这是一个完美的解决方案,但是那是当时最好的解决方案
Lefteris

2
这个答案仍然准确吗?有人知道吗 我看到像BOA和Medium这样的应用程序甚至都没有尝试打开野生动物园就打开了!
Mohy Eldeen '18

62

我认为更简单的答案是使用以下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用户,然后适当地重定向它们。


11
如果未使用此方法安装应用程序,iOS会抛出一个非常不友好的消息:“ Safari无法打开页面,因为地址无效”。
真实世界

3
@RealWorld听起来像是ios 11的新功能。这些天,对于这个主题,我建议实现通用链接。可能值得为这个问题写一个新的答案,概述其工作原理。
BananaNeil

@BananaNeil我创建了通用链接并上传了apple-app-site-association,但是它不起作用?任何想法 ?如果应用程序已安装在设备中,它将始终仅打开网站。
Mitesh Dobareeya

3
它曾经可以工作,但是我相信它已经在ios 12中停止工作了。或其他原因出故障,导致其突然停止工作。
Chaudhry Waqas

2
是的,这曾经在IOS 12之前起作用,现在不幸的是,它也打开了一个应用程序并同时链接了两者
Jaymin

15

如果你有一个网页,你的电子邮件链接到包含一个网页iframesrc设置,为您的应用程序自定义方案,,iOS将自动重定向到在App该位置。如果未安装该应用程序,则不会发生任何事情。这使您可以深度链接到已安装的应用程序(如果未安装),或重定向到应用程序商店(如果未安装)。

例如,如果您安装了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>

如果没有安装应用程序,这是一个更彻底的示例,它重定向到应用程序商店:

<!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>

记录下来,这就是我们在Syfy.com上所做的事情。如果安装了该应用程序,请访问syfy.com/live以查看该站点是否将您自动链接至该应用程序。
q0rban 2015年

这是对问题的正确答案。我没有在页面本身中检测iOS,而是检查get请求中的user-agent标头,然后将重定向页面或带有请求的页面提供给用户,以在iOS设备中打开链接。出于好奇,您如何知道iframe会以这种方式运行?在iframe html文档中找不到此内容。
卡洛斯·古兹曼

1
谢谢@CarlosGuzman!我不知道它会以这种方式工作,我只是一直尝试不同的事情,直到它起作用为止!:)
q0rban 2015年

好吧,那真是个好发现!不幸的是,这似乎不再适用于iOS8。您是否发现它仍然适用于iOS 8及更高版本?似乎与阻止苹果商店自动重定向苹果有关。
卡洛斯·古兹曼

1
直接从SVN信息库下载代码以进行代码降级。回购所有者可以随时将加密矿工推送到回购中。
sesm

9

“智能应用横幅”-不确定它们何时显示,但是在找到此帖子后寻找相同的内容,然后是智能应用横幅,这是后续的。

Smart App Banners是您要通过网络体验向应用程序提供的每个页面的页眉中的一行html meta标签:

<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">

会在页面顶部显示该图标,并在其中显示“打开此页面”以及应用程序或路由到应用程序商店。

在此处输入图片说明

iPhone上此页面的元数据看起来像这样(当然是匿名的):

<meta name="apple-itunes-app" content="app-id=605841731, app-argument=lync://confjoin?url=https://meet.rtc.yourcorporatedomain.com/firstName.lastName/conferenceID">

苹果开发者文档-促进应用程序与智能应用横幅广告


8

是的,这很容易。这要求您要打开的应用程序具有在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"]];
}

抱歉,我的情况可能不清楚-假设我正在从另一个应用程序打开。在这种情况下,它将通过电子邮件或SMS通过http Web链接进行-因此,远程Web服务器将需要重定向到适当的链接。
ConfusedNoob

您可能必须链接到试图通过Javascript以相同方式打开应用程序的网页,如果未打开,则将重定向到iTunes链接。我没有相关资料,但可以使用。
rooster117

3

只需几个简单的步骤即可完成此操作

第1步

转到->项目(选择目标)->信息-> URL类型

在此处输入图片说明

像这样在Xcode中创建URL方案

在此处输入图片说明 这里的URL Scheme是myApp(最好所有字符都小写)。

第2步

如果您打算从URL接收参数/查询字符串,则进行安装委托

这是代码:

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {

     NSLog(@"APP : simple action %@",url.scheme);

    if ([url.scheme hasPrefix:@"myapp"]) {

        NSLog(@"APP inside simple %@",url.absoluteString);


        NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:url
                                                    resolvingAgainstBaseURL:NO];
        NSArray *queryItems = urlComponents.queryItems;
        NSString * abc = [self valueForKey:@"abc"
                           fromQueryItems:queryItems];
        NSString * xyz = [self valueForKey:@"xyz"
                           fromQueryItems:queryItems];


        NSLog(@"Sid up = %@", abc);

        NSLog(@"PID up = %@", xyz);

      // you can do anything you want to do here



        return YES;
    }
return NO;
}

Xcode端工作结束。

第三步

在这里引用@BananaNeil代码,因为我不是前端人员

(function() {
  var app = {
    launchApp: function() {
      window.location.replace("myApp://share?abc=12&xyz=123");
      this.timer = setTimeout(this.openWebApp, 1000);
    },

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

  app.launchApp();
})();

希望它会帮助大家


@aftab我尝试了第3步,我想知道您是否在较新版本上遇到任何问题?当为我运行这段代码时,将会打开应用程序,然后立即打开应用程序商店。
凤凰城,

@Phoenix好吧,到目前为止我还没有遇到任何问题,但是我可以再次检查是否有任何问题,我将编辑答案
aftab muhammed khan

@Phoenix您是否收到任何相同的解决方案。
shikha kochar

@凤凰你有没有找到这个。
Yogendra Patel

2

这里有很多复杂的边缘情况,所以最简单的解决方案是让其他人来处理这些事情。

这就是https://branch.io/的功能。您可以使用他们的免费计划,通过一些额外功能来实现您想要的一切

  • 统计
  • 您可以将信息和链接一起传递,即使用户必须先进行安装,也可以检索该信息
  • 链接将在桌面上运行(默认情况下,它将通过短信将安装链接发送到您的手机)

我不隶属于Branch.io,但我确实使用他们的产品。


1

如果有人仍然陷在这个问题中,并且需要最简单的解决方案,那么您会喜欢node-deeplink

1.)如果已安装应用程序:通过深度链接调用应用程序将始终调用根组件的componentDidMount。因此,您可以在此处附加一个侦听器。喜欢:

Linking.getInitialURL()
      .then(url => {
        if (url) {
          this.handleOpenURL({ url });
        }
      })
      .catch(console.error);

    Linking.addEventListener('url', this.handleOpenURL);



handleOpenURL(event) {
    if (event) {
      console.log('event = ', event);
      const url = event.url;
      const route = url.replace(/.*?:\/\//g, '');
      console.log('route = ', route);
      if(route.match(/\/([^\/]+)\/?$/)) {
        const id = route.match(/\/([^\/]+)\/?$/)[1];
        const routeName = route.split('/')[0];

        if (routeName === 'privatealbum') {
          Actions.privateAlbum({ albumId: id });
        }
      }
    }
  }

2.)如果未安装应用程序:只需在服务器和节点深链接中设置一条路由当您的手机中未安装应用程序时软件包将处理Web浏览器与应用程序商店之间的桥接。

这样一来,两个案件都将得到处理。

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.