我正处于一个真正的泡菜中,迫切需要一些帮助来解决我遇到的一个关键问题。
我花了几个月的时间编写一个 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
- 非库存浏览器未触发意图,未出现“选择应用程序对话框”,未提示用户在我的应用程序中打开 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>
重定向.htm
<html><body><script>
window.location.href = "myapp.com://sharedpage";
</script></body></html>
这确实有效,即使使用非库存浏览器,“选择应用程序对话框”也会通过 DB l.php URL 出现。然而,这并不是一个真正可行的解决方案,因为“非 MyApp 用户”在重定向到 myapp.com://sharedpage URL 时会留下“网页不可用”页面。]
还有其他人有其他好的想法或建议吗?