appLinks 无法从电子邮件打开 iPhone 应用程序

appLinks don't open iPhone app from email

我正在尝试创建一个环境来启用从电子邮件打开 iPhone 应用程序。如果我将 Facebook 的托管服务用于 appLink (Facebook AppLink Hosting API),只要单击它从 Facebook 移动应用程序中生成的 link,我就可以成功打开该应用程序。但是,如果我尝试从另一个移动应用程序(例如 Notes 或 Mail)中单击相同的 link,它只会重定向到 Facebook,而不是我的应用程序。此外,Facebook AppLink Hosting API 只允许您为单个应用程序创建 link。我希望能够根据用户在其移动设备上安装的应用程序自动打开我的应用程序的付费版本或应用程序的免费版本(按此顺序)。

因此,我遵循了 (applinks.org) 中关于如何在我自己的服务器上设置元标记以执行打开 AppLink 的任务的说明。所以,我有一个包含以下内容的网页 html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>MyApp</title>
<meta property="al:iphone:url" content="myAppLinkScheme://Home">
<meta property="al:iphone:app_name" content="MyApp">
<meta property="al:iphone:app_store_id" content="471147787">
<meta property="al:iphone:url" content="myAppLinkLiteScheme://Home">
<meta property="al:iphone:app_name" content="MyApp Lite">
<meta property="al:iphone:app_store_id" content="518829102">
<meta property="al:ipad:url" content="myAppLinkLiteScheme://Home">
<meta property="al:ipad:app_name" content="MyApp Lite">
<meta property="al:ipad:app_store_id" content="518829102">
<meta property="al:web:should_fallback" content="false">
</head>
<body>Redirecting...</body>
</html>

然后我使用 Facebook 的托管 AppLink 的工具创建了一个 appLink。使用他们的 Open Graph Object Debugger,我能够抓取我用他们的工具创建的 AppLink 的内容。 Facebook 元标记与我的元标记非常相似,但有一些不同之处。正如我之前提到的,第一个区别是您只能使用 Facebook 工具指定一个应用程序,因此只有一个 iPhone url、app_name 和 app_store_id元标记。另外两个区别是以下标签 [我将以下标签中的 app_id 替换为 ....]:

<meta property="fb:app_id" content="28...........64">
<meta http-equiv="refresh" content="0;url=https://apps.facebook.com/28...........64/?fb_source=mobile">

很明显,"refresh" 元标记重定向到 apps.facebook.com。我不知道那里发生了什么,但即使我将所有这些标签都放在我的网页标题标签中,结果也是一样的。如果您从 Mail 或 Notes 等移动应用程序中单击 link,您将只会打开我的网页。我的应用程序或 Facebook 不会发生重定向。

请注意,我还向每个应用程序的 info.plists 和 appDelegates 添加了所需的方案信息。即,在我的 info.plist 的 URL 类型中,我添加了 com.myApp.myAppLinkScheme 的标识符和 myAppLinkScheme 的方案。 info.plist 的精简版也进行了类似的添加。此外,我还为应用程序的付费版和免费版对我的 appDelegate 添加了必要的更改:

-(BOOL)application:(UIApplication *)application
           openURL:(NSURL *)url
 sourceApplication:(NSString *)sourceApplication
        annotation:(id)annotation {

    if ([[url scheme] isEqualToString:@"myAppLinkScheme"]) {
        return YES;
    }
    ...
}

所以,我显然遗漏了一些东西。需要什么额外的实施来设置我的服务器,以便当用户从他们 iPhone 的邮件应用程序中点击指向我的服务器的 link 时,他们会被重定向到我的应用程序?

那些 <meta> 标签受到应用程序(如 Facebook)的尊重,这些应用程序已实施 Applinks 协议并知道要查找它们。 Mail 和 Safari 等其他应用程序完全忽略它们,而是打开后备 URL。

当您使用移动主机 API 时,后备 URL 已注册以打开 Facebook 应用程序。很遗憾,之后 Facebook 不会将您转到您自己的应用程序。

当您使用自己的服务器时,回退只是您网站上的 URL...未注册任何内容。然而

要解决此问题,您需要以某种不依赖于 Facebook 的方式执行 link 到应用的重定向。有几个选项:

  1. 在您的服务器上实施 JavaScript 重定向,如下所示:

    setTimeout(function() {
      window.location = "https://itunes.apple.com/path/to/your/app/";
    }, 25);
    
    // If "yourapp://" is registered, the user will see a dialog
    // asking if want to open your app. If they agree, your app will 
    // launch  immediately and the timer won't fire.
    // If not installed, you'll get an ugly "Cannot Open Page" 
    // dialogue and the App Store will launch when the timer expires.
    
    window.location = "yourapp://";
    

    显然这不是一个理想的解决方案,它有 讨厌的边缘情况,最显着的是“无法打开页面”错误,如果他们不这样做,用户将会看到安装您的应用程序。直到最近,通过使用此脚本的更细微版本智能重定向到 App Store,可以以合理的用户友好方式解决此问题。遗憾的是,Apple intentionally broke that 与 iOS9.2更新.

  2. Enable Universal Links. Apple knows this is an annoying problem and is trying to help. Universal Links let you use a normal URL to a page on your website (taking care of the app-not-installed fallback issue), which is intercepted by your phone and sent directly into your app if installed. Unfortunately Universal Links only work in iOS 9+, and don't work yet when opened inside a lot of apps(具有讽刺意味的是,包括 Facebook)。

最好的解决方案是结合上述方法:通用链接和 Applinks 在任何地方都受支持,智能 JavaScript 重定向作为后备。这需要处理的工作量很大,因此最好的选择可能是像 Branch.io 这样的免费服务(全面披露:我与团队合作)来处理所有技术方面的问题。