简而言之:是否可以将访问者重定向到自定义URI方案,或者如果不支持该方案,则显示一些内容?
我的特殊用例是我正在创建一个注册自定义URI方案的移动应用程序,以便用户可以通过短信或电子邮件发送链接,邀请其他用户访问应用程序中的某些操作。
链接指向我的服务器(在Apache上运行PHP),服务器将访问者重定向到正确的方案。只要这是所有重定向页面都能正常工作,但我希望能够显示一些内容,以防在计算机或其他没有安装我的应用程序的设备上打开电子邮件。< / p>
我尝试使用these Javascript tricks实现此目的,同时提供Location标头和服务器上PHP脚本的内容。两者都不起作用。我也尝试在页面上使用<meta http-equiv="Location" content="myscheme://testing">
标记,但这也没有做任何事情。
有些人建议使用用户代理嗅探来查看客户端是使用移动设备还是桌面浏览器。我已经在进行此项操作以及初步检查,但仍然可以在没有安装我的应用程序的移动设备上打开链接,并且这些人将留下空白页面。
有没有办法实现这一目标,还是我运气不好?
答案 0 :(得分:4)
修订版,原文在底部:
为了保持快速和干净,我决定保留重定向页面。此外,我认为重定向页面不应该保留在浏览器的历史记录中以避免never-ending back-button fiascos。因此我最终得到了这个版本:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Redirecting...</title>
<script>
var redirectToApp = function() {
setTimeout(function appNotInstalled() {
window.location.replace("http://example.com/app-not-installed");
}, 100);
window.location.replace("myscheme:someaction");
};
window.onload = redirectToApp;
</script>
</head>
<body></body>
</html>
原始回答:
经过一些更多的摆弄后,我发现这实际上可以使用Javascript。我只是让它比我的更简单:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Welcome to my app</title>
<script>
var redirectToApp = function() {
document.location = 'myscheme:someaction';
};
window.onload = redirectToApp;
</script>
</head>
<body>
You don't have the app installed.
</body>
</html>
这正是我所需要的。不幸的是,当重定向无法完成时,它会在Javascript控制台中导致错误,但我想我不得不忍受这种错误。
答案 1 :(得分:1)
如果您想要另一个免费且更简单的解决方案,不要在您的服务器上不断调整以支持不同的浏览器,请查看branch.io。链接中包含所有这些代码,但如果您使用SDK,您甚至可以在安装后接收URI路径(对于新用户)。这些链接支持Facebook AppLinks,Twitter卡以及开箱即用的所有内容。
要创建链接,您可以使用信息中心,API或SDK。在您的情况下,SDK最适合用户到用户的邀请。以下是有关如何创建链接和自定义重定向端点的示例:
JSONObject dataToInclude = new JSONObject();
try {
// customize the display of the Branch link
dataToInclude.put("$og_title", "Joe's My App Referral");
dataToInclude.put("$og_image_url", "https://s3-us-west-1.amazonaws.com/myapp/joes_pic.jpg");
dataToInclude.put("$og_description", "Join Joe in My App - it's awesome");
// customize the desktop redirect location
dataToInclude.put("$desktop_url", "http://example.com/app-not-installed");
} catch (JSONException ex) { }
Branch branch = Branch.getInstance();
branch.getShortUrl("text_message", Branch.FEATURE_TAG_SHARE, "share_screen", dataToInclude, new BranchLinkCreateListener() {
@Override
public void onLinkCreate(String url, Branch.BranchError error) {
if (error == null) {
// show the link to the user or share it immediately
} else {
Log.i("MyApp", error.getMessage());
}
}
});