iOS通用链接未在应用内打开


109

因此,我完全按照本教程进行操作,并使用与提供的值相同的值:https : //blog.branch.io/how-to-setup-universal-links-to-deep-link-on-apple-ios-9

Apple Association文件也已在链接目录中准备好:
WEB_PAGE:PORT_NUMBER/apple-app-site-association

一切似乎都建立在这一方面。

我已经添加了权利,更新了配置文件,并且一切都已设置。

当我在设备上运行该应用程序并打开链接时http://WEB_PAGE:PORT_NUMBER,这始终会打开Safari。

我什至在以下方法中都有断点:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray * __nullable restorableObjects))restorationHandler

但是zilch。

有人完善了吗?有什么我想念的吗?


2
结帐这里,以确保您不会错过任何一个步骤stackoverflow.com/questions/35609667/...
维尼特乔杜里

Answers:


189

有一些可能的问题。

  1. 尝试将您的域粘贴到此链接验证器中,并确保没有问题:https : //limitless-sierra-4673.herokuapp.com/(贷方给ShortStuffSushi-请参见repo

  2. 如果您没有在权利中指定的域上正确设置TLS,iOS会在系统日志中记录一条错误消息。它埋在OS日志中,而不是应用程序日志中。错误消息将看起来像Sep 21 14:27:01 Derricks-iPhone swcd[2044] <Notice>: 2015-09-21 02:27:01.878907 PM [SWC] ### Rejecting URL 'https://examplecustomdomain.com/apple-app-site-association' for auth method 'NSURLAuthenticationMethodServerTrust': -6754/0xFFFFE59E kAuthenticationErr。错误消息来自拉到这里,使用的CloudFlare的快速TLS(不完全)的说明这里

  3. 在我的个人测试中,单击/键入Safari中的链接从未从未直接打开过该应用程序。从其他应用程序(iMessage,邮件,Slack等)单击已成功。其他人报告说,单击Google搜索结果中的链接已直接打开该应用程序。

  4. 请注意,如果通用链接成功打开了您的应用程序,然后您单击进入Safari(通过点击应用程序中导航栏右上角的网站),那么iOS会在您访问该URL时停止打开该应用程序。然后在Safari中,您可以使用“打开”下拉页面顶部以显示横幅。我在此上浪费了很多时间。请注意,根据您在apple-app-site-assocation文件中指定的路径,单击进入站点=>禁用UL似乎是特定于路径的。因此,如果您有单独的路线,yoursite.com/a/*并且yoursite.com/b/*单击yoursite.com/a/*并直接打开您的应用程序,则可以在应用程序的右上角选择转到yoursite.com/a/*。如果您这样做,则后续访问yoursite.com/a/*将在浏览器而非应用中打开。但是,yoursite.com/b/*它不受影响,仍然可以直接打开您的应用程序。

如果您发现问题所在,请告诉我。我个人对Universal Links的工作原理和存在的边缘情况非常好奇。祝好运。


1
一样。太奇怪了。有时它会直接打开应用程序,有时会打开webView。我希望他们能使文档清晰。此功能的操作不稳定
Legolas 2015年

4
关于1),如果您通过https提供服务,则不再需要对apple-app-site-association文件签名。
杰里米·希克斯

11
重新启动iOS设备也可能会有所帮助。我对所有设置和配置进行了三重检查,我绝对确定一切正确,但是仍然无法使用。然后我尝试了另一台设备,它运行良好。然后,我从原始设备中删除了该应用程序,重新启动了该设备并重新安装了该应用程序,然后它就开始工作了……
mathz 2016年

4
如果有人不小心按了应用程序右上角的网站链接,如何返回应用程序而不是野生动物园?
iEngineer '16

3
我没有在任何地方获得“在应用中打开”横幅。经过长时间搜索,这是一个解决方案:在Notes应用程序中键入网站的任何链接(这是通用链接)。现在,单击完成。一旦成为链接,请长按它并选择“在AppNAME-HERE中打开”!
kishorer747 '16

64

有很多方法可能会出错。有两点给我带来了麻烦:

  • 在Xcode中,当您添加“关联的域”权利时,每个条目都必须以开头,applinks:然后是您的域名。例如applinks:www.apple.com

  • 尽管Xcode为我创建了一个权利文件,但它没有包含在我的构建中:我必须手动单击该框。

是的,这样做之后,无需对apple-app-site-association文件进行签名:它只是纯文本,并且只要通过HTTPS提供服务,它就可以工作。(不过,如果您支持iOS 8,则仍然需要对其进行签名。)


4
我还必须从测试设备中完全删除该应用程序,然后再构建并再次运行,然后才能最终运行。
菲尔·安德鲁斯

14
您节省了我的时间,这是我的问题,尽管XCode为我创建了一个权利文件,但它没有包含在我的构建中:我必须手动单击该框。

12
在构建中包括权利文件也为我解决了该问题。值得注意的是,在Xcode 8中,实际上禁用了文件检查器中的目标成员资格复选框。我必须转到构建设置,然后将权利文件添加到“复制资源”阶段。
查尔斯A.

5
@cham:你们可以详细说明“尽管XCode为我创建了一个权利文件,但它没有包含在我的构建中:我必须手动单击该框。”
唐潘

6
@AwaisFayyaz转到“构建阶段”>“复制捆绑包资源”。单击加号,然后添加您的权利文件。
s.zainulabideen '18

36

制作通用链接的关联文件文档中显然存在错误。

它说:

appID密钥的值是应用程序的团队ID和捆绑软件ID

它应该说

appID密钥的值是应用程序的前缀和捆绑软件ID。

对于大多数应用程序来说,Team ID和应用程序前缀似乎相同,但是如果您的应用程序已经在商店中使用了很多年,则这些值可能会有所不同。

要找到该值,请在https://developer.apple.com上打开会员中心,然后查看“证书,标识符和配置文件”,单击“标识符”,然后单击“标识符”表中的“应用程序ID”。找到您的应用,然后在其中使用Prefix值和Bundle ID为关联文件创建您的AppID。


2
+1,这对我有很大帮助。花半天的时间弄清楚为什么它不起作用,这对我来说似乎就是这种情况
Ivo Beckers

您保存了我的一天,事实上,我的应用是很久以前的,并且应用前缀与团队ID不同。
Ti3t

这是唯一对我有用的东西。谢谢!
dhin

这是我的解决方案。很好的建议。
森特

33

为帮助调试此问题,请在安装应用程序时在设备的控制台输出中搜索“ swcd”,以查看注册通用链接是否有效。

  1. 使用实际设备,而不是模拟器。
  2. 从您的设备中删除该应用。
  3. 将设备连接到计算机,然后以xcode查看设备的控制台输出。(窗口->设备-> [您的设备]->打开控制台)。保持此窗口打开。
  4. 安装您的应用并启动它。
  5. 将控制台输出过滤为“ swcd”。如果成功,您会看到类似以下的屏幕截图。如果失败,您还会看到其他内容。如果看不到任何内容,那么您会搞砸一些基本的事情,例如添加“关联的域”权利。

Applink添加成功


2
很棒的提示!我正在将https://添加到applinks:权利中,还指定了我想听的完整路径,这都是错误。我在指定example.com/path *时,仅应指定我的domain.com,然后在example.com上指定AASA文件,然后指定针对我的应用程序包ID的路径
Numan Tariq

3
我可以给您现金奖金吗?我花了2天的时间来完成这个怪异的通用链接设置的每一步,直到尝试了您的方法之前,没有任何帮助。我真不幸将我的关联文件托管在我的域的firebase的根文件夹中,结果是Apple首先查询.well-known /子目录,而firebase似乎用自己的(!)正确的关联文件对其进行响应没有关联的应用。天哪,苹果,我该怎么发现呢?
nalexn

很好的提示!我不知道这个设备控制台,只是看Xcode控制台输出。我的麻烦是,DID的3个深度域中有2个DID有效,但最后一个DID无法起作用。在控制台中,我看到对于我的最后一个域,我用“ appllinks:<domain>”(2升)拼写了它。(我发现控制台日志也在卸载应用程序时删除了链接:+1)
Arno Teigseth

1
默认情况下应该是那么冗长吗?因为我没有得到如此详细的日志,这是否意味着操作不成功?
Nicholas Allio

26

St.derrick的答案很有帮助。

但是,要再次启用通用链接而不是使用safari在应用程序中打开,我们需要执行以下操作。

  • 长按Mail或iMessage中的“通用”链接,然后您将看到在Safari或App中打开的选项。

2
没有选项app,只能复制,打开,添加到阅读列表等
iEngineer 2016年

1
几乎疯狂地调试了这个问题,但是这就是我的解决方案。也许如果设置不正确并且Mail应用程序在safari中打开链接,而该链接始终在safari中打开?不知道,但是我曾经长按->在“ myapp”中打开...现在链接可以正确打开了!
赫伯特

1
非常感谢您提供此解决方案。我被困在这里将近一天。你救了我的日子。
andrew


18

我意识到对我来说问题是,到根目录a的链接(例如http://example.com/)没有打开我的应用程序,但是如果我添加了路径(例如http://example.com/mypath),它就可以工作。将其添加"/"到路径列表中可以解决:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "TEAM_ID.BundleIdentifier",
                "paths": [ "*", "/" ]
            }
        ]
    }
}

正如slutsker在 Apple开发者论坛主题中所回答的。


17

快速步骤检查您是否正确实施了Universal Link。

  • 点击并按住您希望启动该应用程序的链接。您应该在上下文菜单中看到“在[您的应用程序名称]中打开”。

  • 打开Notes应用程序,键入您期望打开该应用程序的链接。点击完成。链接将变为黄色,点击该链接应打开您的应用程序,而不是Safari。

  • 如果链接http://yourDomain.com没有启动应用程序,请尝试http://yourDomain.com/yourFolder/

  • 在Safari中,如果上下文菜单在safari中显示“在[您的应用程序名称]中打开”,但是点击该链接会在safari本身中打开链接,而不是启动该应用程序,

    一个。尝试拉下单击链接时打开的safari页面,就像您“拉动刷新”的方式一样。应出现一个可以打开您的应用程序的横幅。点按横幅以打开应用程序,按“主页”按钮关闭应用程序,返回到野生动物园,然后再次点按链接尝试启动应用程序。这次,应启动应用程序,因为点击横幅应已保存了在应用程序中打开链接的首选项。

    b。如果在步骤a。之后仍无法启动该应用,请尝试将链接邮寄到gmail等网络邮件,然后在safari中打开该Webmail网站,然后尝试单击该链接。如果可行,则您可能试图从与链接相同的域中启动应用程序。据我所知,从同一域启动该应用程序大多会失败。当链接与用户所在的域相同时,Safari可能不会在意目标链接是否为通用链接。因此,请尝试从另一个域启动该应用程序。


3
就是这样,已经处理了好几个小时了,从同一个域中启动该应用程序大部分失败。谢谢:)
maledr53 '18

12

在集成通用链接后增加项目版本或内部版本号也非常重要。即使删除/重新安装,iOS也不会拾取链接,除非您更改版本。


1
这个!该包的版本完全是什么导致我的测试失败,因为我会去通过所有的上述建议和我的链接仍然会推出Safari浏览器作为iOS的使用从以前版本的缓存结果apple-app-site-association其中有错误的appid前缀
杨再昌

凯尔,我想我爱你!这个答案节省了一天,谢谢!
neiker

这是我的秘密调味料!谢谢你,谢谢你,谢谢你!
nurider

10
  • 如果将链接粘贴到浏览器URL字段中,则通用链接将不起作用。

  • 通用连接工作与用户驱动的<a href="...">元素点击跨域。范例:如果google.com上有一个指向bnc.lt的通用链接,它将打开应用程序。

  • 通用链接不适用于用户驱动的<a href="...">元素在同一域上单击。例如:如果google.com上有一个通用链接指向google.com上的另一个通用链接,它将无法打开该应用程序。

  • <a>除非是用户操作的一部分,否则无法通过Javascript(在window.onload或通过对元素的.click()调用)来触发通用链接。

来源:https : //dev.branch.io/getting-started/universal-app-links/support/ios/#appsbrowsers-that-support-universal-links

第三枚子弹花了我大约一天的时间来弄清楚。


1
第三发子弹,这里也一样:浪费了很多时间弄清楚这一点。苹果有它甚至一个很好很愚蠢的解释:“iOS的尊重用户的最有可能的意图,并打开Safari中的链接”看到自己在这里
jox

第三弹TOP!
Byteros

10

对于需要轻松测试打开(通用)链接的任何人,您还可以使用以下命令从终端在Simulator中打开链接:

xcrun simctl openurl booted yourapp_or_http://yourlink

例如:

xcrun simctl openurl booted https://www.google.com


1
我没有这个工作,它总是只打开Safari。当我在实际设备上运行时,它们确实可以工作。任何想法将不胜感激,因为如果没有模拟器,调试/开发会更加痛苦。

7

如果这里的人们正在寻找其他解决方案,我们会逐步调试通用链接,因为我们看到了很多问题的出现,这引起了很多麻烦。

看看这个:

通用链接调试指南

调试指南预览

如果您只是想重新设置通用链接,那么本指南将非常有用:

iOS深度链接设置指南

希望他们会有所帮助!


非常有帮助,谢谢!在实际设备(而非iOS模拟器)上运行时为我工作。
乔什·斯克拉

6

只是想我会添加一些我发现的东西,以防将来更多的人遇到与我相同的问题。这些主要与身份验证错误有关。

即使apple没有明确声明,该apple-app-site-association文件也必须通过https提供,即使已签名也是如此。Apple还必须信任用于https的证书。因此,尽管在设置->常规->个人资料中添加到设备的证书将允许在Safari浏览器中使用https,但它将不允许通用链接起作用。

在设备日志中,如果设备和服务器之间的身份验证错误,将显示一个类似的值"TrustResultValue" : 4。甲TrustResultValue的5种手段证书用于错误的域(例如,从test.com送达www.test.com)。A TrustResultValue为4表示不信任此用途的证书。

有可能是调试一些有用的步骤这里。“测试对apple-app-site-association的访问”部分是有关如何确保设备获取apple-app-site-association文件的逐步指南。步骤归结为:

  1. 卸载应用程序。这是必需的,因为该文件是在安装时下载的。

  2. 停止服务器正常服务apple-app-site-association

  3. 在xcode中,打开“窗口”->“设备”,然后选择您的设备。

  4. 通过单击窗口底部的三角形来打开设备日志。

  5. 通过单击垃圾桶清除日志,以清除以前可能相关的所有日志。

  6. 通过单击播放按钮,使用xcode重新安装该应用程序。

  7. 应用启动后,如果设备正确请求文件,则设备日志中应包含一个错误,可以通过搜索“ apple-app-site-association”找到该错误。

如果apple-app-site-association文件已正确送达(忽略了步骤2),则应该没有错误。如果是这样,则可能会显示身份验证错误。


1
我正在使用Charles Proxy进行SSL欺骗,这导致信任值为4。当我关闭代理时,它成功了。
本弗林

6

最常见的原因是当用户点击右上角时,告诉iOS将来不要打开该应用程序(在这种情况下为Uber)。

要解决此问题,请拉下以显示智能横幅,然后点击“打开”:

在Safari中下拉,然后再次打开

随后,这将“记住”打开应用程序。


5

我们已将apple-app-site-association文件添加到以下位置:

https://example.com/apple-app-site-association

在iOS 9上可以正常工作,但在iOS 10上则无法工作。

似乎问题出在。众所周知的路径:

https://example.com/.well-known/apple-app-site-association

由于https://example.com/.well-known/apple-app-site-association路径重定向到https://example.com

<Notice>: Allowing redirect 'https://example.com/.well-known/apple-app-site-association' -> 'https://example.com/'
<Notice>: ### Rejecting AASA file size 154466 for URL https://example.com/.well-known/apple-app-site-association

我认为,如果。众所周知的路径无法正常工作,它将破坏通用链接。


该手册明确指出:“该文件需要通过HTTPS进行访问-无需任何重定向”。
2016年

该手册还明确指出:“对于在iOS 9.3.1和更高版本中运行的应用程序,无论文件是否经过签名,apple-app-site-association文件的未压缩大小都不得大于128 KB。” 该文件为154 KB。
罗伯托

在iOS11上,您的服务器应明确为以下示例返回404状态: example.com/.well-known/apple-app-site-association,然后swcd使用回退到root:example.com/apple-app-site-association。您可以使用Postman等工具快速检查返回的HTTP状态
Max Odnovolyk 17-10-26

4

我设法使它起作用,但是花了很多时间和精力。请注意,除非您对 apple-app-site-association 文件签名(签名是可选的!),否则在Safari中点击链接不会打开您的应用程序(这使我非常头痛)。


1
很好奇 苹果在文档中 指出,对于纯通用链接及其在iOS9中的使用,您无需签名。仅当您要支持iOS 8切换/共享Web凭据时,才需要签名。有趣!我有同样的问题,所以我将尝试签名。
wrtsprt

签名确实是可选的。在Mobile Safari中点击链接以触发打开本机iOS应用程序称为“ Web浏览器到本机应用程序切换”,在这种情况下,您需要向json文件添加activitycontinuation属性apple-app-site-associationdeveloper.apple.com/library/ios/documentation/UserExperience/…–
Devy

3

花了我近一天的时间来解决这个问题。我遇到的问题不是在XCode中下载更新的配置文件(此后我也重新启动了XCode)。

(首选项>帐户>查看详细信息>全部下载)


3

您可以在模拟器中测试通用链接

来自《App搜索编程指南》:支持通用链接


6
有没有人获得在模拟器中工作的通用链接?我已经尝试了无数次,但从未成功。它确实可以使用具有相同流程的真实设备工作。
托尼

我也无法对此进行测试。尽管事实上它可以在物理设备上正常运行,但尝试使Safari在模拟器中触发通用链接却是徒劳的。
阿尔伯特·博里

我也无法让他们在模拟器中工作。@AlbertBori您得到了这个工作吗?
b

我几乎可以肯定它们在模拟器中不起作用。我对所有其他陷阱都很熟悉,而且我永远无法让它们在模拟器中工作。
Fattie

3

两天后,我发现这些链接(来自分支机构)

applinks:xxxx.app.link

仅在存档(也是临时)应用程序并将其安装到电话后才能工作。


3

如果您要apple-app-site-associationFirebase上托管,请确保将其放在/.well-known/子目录中!似乎Xcode首先查询该URL,如果成功,则不会尝试查询apple-app-site-association根目录中的URL 。由于某些原因,firebase工程师使托管网站能够自动/.well-known/apple-app-site-association使用一个空(但格式正确)的关联文件进行响应,该文件将覆盖您的自定义文件,从而使您不知道为何什么都不起作用!


2
最后!非常感谢。它写在某个地方吗?Firebase应该将文档记录在某个地方。
BerkayTurancı19年

2

转到developer.apple.com并编辑您的分发配置文件之一。在编辑页面中,您可以打开一个App ID弹出窗口,其中将显示您的应用名称列表,并在该应用名称后面的()圆括号中显示您所有的实际 App ID。有些应用程序可能会将您的团队ID作为前缀,但有些则没有。确保完全使用()中弹出菜单中显示的内容,并将其放入apple-app-site-association details appID字段中。我在应用程序及其通用链接中遇到了这个问题。


2

对我来说,问题出在apple-app-site-association文件上。根据Apple的文档,仅需要applinks参数。我添加了activitycontinuation参数,它起作用了。

{
  "activitycontinuation": {
    "apps": [
      "9JA89QQLNQ.com.apple.wwdc"
    ]
  },
  "applinks": {
    "apps": [],
    "details": [{
        "appID": "9JA89QQLNQ.com.apple.wwdc",
        "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*" ]
      }]
  }
}

3年后,我们遇到了这个确切的问题。添加activitycontinuation对我们来说是固定的。
readyornot

2

还没有真正看到使它对我有用的完全相同的问题/解决方案组合,所以如果有人遇到相同的问题,不妨添加我的问题/解决方案!

对于我的应用程序,我正在使用自定义URL方案(在中设置APP_TARGET > Info > URL Types),并将URL方案从此处设置到Firebase控制台中以匹配,但仍然无法正常工作。

我的问题实际上是两个问题:

注意是否选中“自动管理签名”

如果您像以前那样检查Xcode的“自动管理签名”设置,由于我只是想制作一个快速演示应用程序,因此您将要确保使用的TeamID与Firebase控制台中的TeamID相匹配。我最初进入我的Apple开发者帐户,并从“成员资格”页面复制了团队ID,但后来发现Xcode使用的实际ID是不同的。(您可以在“ APP_TARGET > General > Signing > Signing Certificate.对我来说,它看起来像”中找到它iPhone Developer: My Name (TEAM_ID))。

在您的URL类型中将您的TeamID前缀为您的捆绑标识符

在我确保它们在Firebase控制台和Xcode中匹配后,我的下一个问题是URL方案的标识符。通常在这里使用包标识符,但是Firebase实际上会在您在Firebase控制台中给您的Team ID前面加上前缀,因此我也必须在Xcode的URL types部分中将它前缀为标识符。

经过这两个修复并重新下载GoogleService-Info.plist文件后,我没有问题打开我的动态链接。


2

经过两天的绝望,我终于解决了。这是我的解决方案:

似乎较旧的应用程序使用的前缀与较新的应用程序不同。较新的应用程序仅将Team ID用于此目的。如果应用程序前缀和团队ID不相同,则似乎需要在Apple应用程序站点关联文件中指定活动继续字段:

{
    "activitycontinuation": {
        "apps": [
            "YOUR_APP_PREFIX.de.company.app"
        ]
   },
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "YOUR_APP_PREFIX.de.company.app",
        "paths": ["/*"]
      }
    ]
  }
} 

我在地狱之旅中遇到的另一件事是删除应用程序并重新启动设备似乎是强制刷新此文件的唯一方法。


1

对我来说,我的错误是我们的网站将www.domain.com重定向到domain.com,因此所有www.domain.com/*都会因此失败。希望能有所帮助。


1

我可以使用“日历”应用程序在iOS模拟器中测试通用链接。

我刚刚创建了一个事件,并在事件的URL字段中添加了要测试的URL 。然后,在查看创建的事件时,您只需点击URL链接即可打开您的应用程序。


这似乎对我不起作用,我已尽一切努力使它们在模拟器中工作无济于事。它们可以在实际设备上正常工作,但是对于开发/调试而言并不理想。我尝试长按链接,但没有“在应用程序中打开”选项。

1

花了一天的时间使它工作后,重新启动手机解决了问题。

卸载/重新安装该应用程序也不起作用。


1

对于ios13,有一种新格式-在这里查看https://developer.apple.com/documentation/safariservices/supporting_associated_domains_in_your_app?language=objc

我更新了文件,使其看起来像这样:

{
  "applinks": {
      "details": [
           {
             "appIDs": [ "ABCDE12345.com.example.app" ],
             "components": [
               {
                  "/": "/my-link/*",
                  "exclude": true,
                  "comment": "Matches any URL whose path starts with /my-link/ and instructs the system not to open it as a universal link"
               }
             ]
           }
       ]
   },
   "webcredentials": {
      "apps": [ "ABCDE12345.com.example.app" ]
   }
}

您需要添加"exclude": truecomponents对象才能comment真实显示
skornos,

@skornos好点。我会修改我的答案。
阿妮塔

0

对于将来找到此页面的读者...

我也有类似情况。但是,在我的情况下,iOS10在运行AOK,并且无论我做什么(更改内部版本号,删除/重新安装等),iOS9似乎都无法正常工作。

我来自iOS10,需要支持iOS9。当时,此处的文档-https: //developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html-明确指出该文件可能位于Web服务器的根目录下(例如/apple-app-site-association)或.well-known文件夹(例如/.well-known/apple-app-site-association)中。因为我还支持Android,Android也将.well-known文件夹用于类似文件,所以我决定将两者都放在其中。

对于iOS10上的全新安装,它显然会请求根文件,然后失败,然后请求.well-known文件,然后成功。

对于iOS9,它显然请求了根文件,失败了,什么也不做。

解决方案:如果支持iOS9,则将文件放在/apple-app-site-association


0

在我的情况下,我的错误是将查询参数放在路径中:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "TEAM_ID.BundleIdentifier",
                "paths": [ "/auth-ui/hub?target=confirm&*" ]
            }
        ]
    }
}

当我从路径中删除“?target = confirm&*”时,它开始工作

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.