【发布时间】:2012-08-20 11:26:36
【问题描述】:
我陷入了困境,迫切需要一些帮助来解决我遇到的一个严重问题。
我花了几个月的时间编写一个 HTML5 应用程序/网站以及一个本机 Android 应用程序,它只是 HTML5 网站的 WebView 包装器。该应用程序的核心功能之一是用户可以将应用程序特定的 URL 共享到 Facebook 和 Twitter 等,以便他们的朋友可以关注共享的 URL,这将在他们的浏览器中打开我的应用程序的 HTML5 版本,或者最重要的是,如果他们是在 Android 上,他们安装了我的原生 Android 应用程序,他们被提示在我的应用程序中打开。
这是一个相当长的复杂问题,因此为简化起见,我将在整个帖子中始终使用一些特定术语:
- “MyApp 用户”是指安装了我的原生 Android 应用的 Android 设备用户
- “非 MyApp 用户”是指未安装我的原生 Android 应用的 Android 设备用户
- “股票浏览器用户”使用股票浏览器的股票 Android 用户
- “非库存浏览器用户”是指使用非库存浏览器的 Android 用户(请注意,三星 Galaxy SII 库存“互联网”应用程序被视为非库存)
- Android 上的“选择应用程序对话框”出现的操作系统对话框询问用户他们想用什么应用程序打开操作/意图/url/文档,以及他们是否希望默认始终使用此应用程序
我的 AndroidManifest.xml 包含以下内容...
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="myapp.com" android:pathPrefix="/" />
</intent-filter>
经过测试,这在任何正常情况下都能完美运行。例如,如果“MyApp 用户”跟随指向http://myapp.com/sharedpage 的直接链接,则会出现“选择应用程序对话框”。太好了,我确实正确配置了我的 AndroidManifest.xml。
但是,在关键的 Facebook 分享场景中,事情并不总是有效。它并不总是有效,因为 Facebook 的原生 Android 应用程序和 Facebook 的移动网站 (http://m.facebook.com) 都不会直接链接到共享 URL,而是通过 Facebook 重定向页面链接。例如,如果http://myapp.com/sharedpage 被分享,Facebook 最终会提供以下 URL:
如果“MyApp 用户”关注这些 Facebook 链接之一,则可能会发生以下两种情况之一,具体取决于他们使用的浏览器...
MyApp 股票浏览器用户:
如果用户安装了原生 Android 并使用原生 Android 浏览器,那么一切正常,因为会发生以下事件...
- FB l.php URL 的 Intent 触发
- FB URL 在 ANDROID 股票浏览器中打开
- FB l.php 被加载并启动重定向到http://myapp.com/sharedpage
- http://myapp.com/sharedpage URL 的 Intent 触发
- “选择应用程序对话框”提示用户在 MY NATIVE APP 或浏览器中打开
MyApp 非股票浏览器用户:
但是如果用户...
- 已安装并使用非现货 Android 浏览器,例如Dolphin HD/mini、Opera Mobile/Mini 等,或
- 具有制造商定制的 Android 版本(例如在三星 Galaxy SII 等上),因此具有定制的浏览器
...那么这是主要问题,因为发生了以下事件...
- 为 FB l.php URL 触发 Intent
- FB URL 在非股票浏览器中打开
- FB l.php 被加载并启动重定向到http://myapp.com/sharedpage
- 非库存浏览器未触发 Intent,未出现“选择应用程序对话框”,未提示用户在我的应用程序中打开 URL
- http://myapp.com/sharedpage URL 已加载并呈现在非库存浏览器的选项卡中
客户端重定向
为了确认导致问题的重定向,我创建了一个非常简单的 HTML 页面,名为“clientSideRedirector.htm”
<html><body><script>
window.location.href = "http://myapp.com/sharedpage";
</script></body></html>
如果 My-App/non-stock 浏览器用户打开 http://myapp.com/clientSideRedirector.htm,则不会出现“应用程序选择对话框”。失败。
如果 My-App/stock 浏览器用户打开 http://myapp.com/clientSideRedirector.htm 会出现“应用选择对话框”。
这似乎与我们在 Facebook 分享/重定向中看到的一致。
服务器端 (302) 重定向
我还想尝试服务器端重定向,所以我创建了一个 .NET dotNetRedirect.ashx 页面:
public class ShareRedirect : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.Redirect("http://myapp.com/sharedpage");
}
public bool IsReusable { get { return false; } }
}
这对客户端重定向有一个非常有趣且不同的结果。
如果 My-App 用户打开http://myapp.com/dotNetRedirect.htm,则无论用户浏览器如何,“应用程序选择对话框”都会出现。
所以这种类型的重定向似乎有效!
尝试的解决方案 A
(双重重定向:Facebook l.php 重定向到服务器端重定向到应用 URL)
我认为这可以解决我的 Facebook 分享问题。如果我将http://myapp.com/dotNetRedirect.ashx URL 共享给 Facebook,那么 Facebook 可能会重定向到 dotNetRedirect.htm 页面,然后服务器端重定向会强制打开“选择应用程序对话框”提示。
不幸的是,这不起作用,在非库存浏览器中,如果第一个重定向没有触发意图/“选择应用程序对话框”,进一步的重定向也不会出现。大量内脏。
尝试的解决方案 B
(使用自定义方案)
在用尽了服务器端的想法后,我想我应该研究一下使用自定义 URI 方案来触发“应用选择对话框”。
AndroidManifest.xml:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myapp" />
</intent-filter>
redirect.htm
<html><body><script>
window.location.href = "myapp.com://sharedpage";
</script></body></html>
这确实有效,即使使用非库存浏览器,“选择应用程序对话框”也会通过 DB l.php URL 出现。然而,这并不是一个真正可行的解决方案,因为“非 MyApp 用户”在重定向到 myapp.com://sharedpage URL 时会留下“网页不可用”页面。 ]
还有其他人有什么好的想法或建议吗?
【问题讨论】:
-
解决方法很简单:杀掉Facebook。您可以查看
Referer[sic] 标头,如果它来自 Facebook,请在您的页面顶部手动插入一个按钮,询问用户是否要在您的应用中打开该页面。
标签: android facebook redirect android-intent intentfilter