78

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

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

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

4

8 回答 8

67

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

于 2014-10-16T21:09:04.740 回答
31

没有办法对此进行检查。但是,有一个很好的解决方法。

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

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

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

于 2012-12-27T02:09:15.610 回答
15

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

例如,如果您安装了 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>
于 2015-01-04T16:51:58.950 回答
13

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

智能应用横幅是您希望通过网络体验提供应用的每个页面标题中的单行 html 元标记:

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

这会在页面顶部显示该图标,并使用应用程序或路由到 App Store 来“打开此页面”。

在此处输入图像描述

iPhone 上此页面的元数据如下所示(当然是匿名的):

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

Apple 开发者文档 - 使用智能应用横幅推广应用

于 2018-05-26T13:43:03.400 回答
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"]];
}
于 2012-12-27T01:03:49.300 回答
3

有几个简单的步骤来实现这个动作

第1步

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

在此处输入图像描述

像这样在 Xcode 中创建 URL Scheme

在此处输入图像描述 这里的 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 端工作结束。

第 3 步

在这里引用@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();
})();

希望对大家有帮助

于 2019-02-09T12:04:36.747 回答
1

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

这就是https://branch.io/所做的。您可以使用他们的免费计划来实现您想要的,并提供一些奖励功能

  • 统计数据
  • 您可以将信息与链接一起传递,即使用户必须先进行安装,它也会被检索到
  • 链接将在桌面上工作(默认情况下,它将向您的手机发送安装链接)

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

于 2019-03-01T16:15:17.293 回答
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.) 如果未安装应用程序:只需在您的服务器中设置路由,当您的手机中未安装应用程序时, node-deeplink包将处理 Web 浏览器与应用商店之间的桥接。

如此一来,两宗案件都将不费吹灰之力处理

于 2020-01-07T07:35:06.967 回答