草庐IT

android - Android浏览器Facebook重定向并不总是触发URL Intent

coder 2023-12-02 原文

我身在泡菜中,急切需要一些有关我遇到的关键问题的帮助。

我已经花了几个月的时间编写HTML5应用程序/网站以及 native Android应用程序,而 native Android应用程序只是HTML5网站的WebView包装器。该应用程序的核心功能之一是用户可以将应用程序特定的URL共享给Facebook和Twitter等,以便他们的 friend 可以遵循共享的URL,这将在他们的浏览器中打开我的应用程序的HTML5版本,或者如果是在Android上安装了我的 native Android应用,系统提示他们在我的应用中打开。

这是一个相当长的复杂问题,因此为简化起见,在本文中,我将始终使用某些术语:

  • “MyApp用户”是确实安装了我的 native Android应用程序的Android设备用户
  • “非MyApp用户”是没有安装我的 native Android应用的Android设备用户
  • “股票浏览器用户”使用股票浏览器
  • 的股票Android用户
  • “非股票浏览器用户”使用非股票浏览器的Android用户(请注意,三星银河SII股票的“Internet”应用程序被视为非股票浏览器)
  • 在Android上的“选择应用程序对话框”出现的操作系统对话框,询问用户要使用哪个应用程序打开操作/Intent/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的 native Android应用程序和Facebook的移动网站(http://m.facebook.com)都不直接链接到共享URL,而是通过Facebook重定向页面链接。例如,如果http://myapp.com/sharedpage被共享,Facebook最终将提供以下URL:

    http://m.facebook.com/l.php?u=http%3A%2F%2Fmyapp.com%2Fsharedpage&h=EAQGpLtuF&enc=AZMXYZg7XwQ39zlWkKSGnLw62lEbtbMeWFmRwRZINoOcg0UgZe3fUVPgqQzV1nuTipSVnquV3a3ovqu7HQFUf3bb3ZJ1gYG8dEOJXzPf6RJGflf9_x8w-6CCXu8G2VZqgfD7lx6EbLTSKLnF56_o5khHybycPUlhpdfLsk6M9muer4jMOmPK6_kfjTq2gvnYNNpStcF0ilJD6nacPqx_1xsdYkUMpKYWbJfSo7qqv1S5xT5KRaLPxl8zmAkYc0FhwyTdn-tUGwRBbbdM4QCd2Z75Tb_VeJG3LvbDwFAbp6G3kH3LOSxVtTd5MST4pUW8xmhNeTUVBVXV16OD27QcsSWOlEfL72fxn11PDE5s4WWsXMnwhDJLUAWOAna7lziBnWzjZdlQK_amI9nhcegaOLDLNFCp125rZS3jxFXf7gtF9g0BsmnPZ2Gjxkc6UgQXhEYldllq9nwpShGbnZDlSg0_&s=1

    如果“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浏览器,例如海豚HD/迷你,Opera Mobile/迷你等,或
  • 具有制造商定制的Android版本(例如在Samsung 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>
    

    如果“我的应用/非库存”浏览器用户打开http://myapp.com/clientSideRedirector.htm,则不会出现“应用选择对话框”。失败。

    如果“我的应用程序/股票”浏览器用户打开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,则“用户选择浏览器”确实会显示“应用程序选择对话框”。
    因此,这种重定向似乎可行!

    尝试的解决方案

    (双重重定向:Facebook l.php重定向到服务器端重定向到应用程序URL)

    我认为这可能是我的Facebook分享问题的解决方案。如果我将http://myapp.com/dotNetRedirect.ashx URL共享给Facebook,则Facebook可能会重定向到dotNetRedirect.htm页面,然后服务器端重定向将强制打开“选择应用程序对话框”提示。

    不幸的是,这不起作用,在非常规浏览器中,如果第一个重定向没有触发 Intent/“选择应用程序对话框”,则进一步的重定向也不会出现。大量内脏。

    尝试解决方案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.com://sharedpage URL时,“非MyApp用户”页面会留下“网页不可用”页面。 ]

    还有其他人有其他聪明的主意或建议吗?

    最佳答案

    我在搜索中进行了一些进一步的开发,发现执行“假点击”是在大多数情况下(但不是全部)都有效的解决方案。

    如果用户希望共享URL http://myapp.com/sharedpage,那么我实际上将以下URL发布到Facebook http://myapp.com/share.htm?redirectUrl=sharedpage

    share.htm只是一个javascript重定向页面,可立即重定向到适当的页面。尽管它很聪明,但是与在Android上一样,而不是仅使用window.location.replace,它使用带有链接的假按钮单击,这可以强制在某些设备/某些浏览器上触发 Intent 。代码如下所示。

    <!DOCTYPE HTML>
    <html>
    <body>
        <script type="text/javascript">
            var redirectUrlRelativeToThisPage = ""; // Read off the querystring here
            var isAndroidDevice = (/android/gi).test(navigator.userAgent);
    
            if (isAndroidDevice) {
                // Android device. If the user isn't using a stock browser then window.location.redirect() doesn't always
                // trigger an Intent (and prompt to open Native app) so instead attempt to fake click a hyperlink with the
                // URL as this works more reliably (but not always).
                var linkToFakeClick = document.createElement("a");
                linkToFakeClick.href = redirectUrlRelativeToThisPage;
                var fakeMouseClickEvent = document.createEvent("MouseEvents");
                fakeMouseClickEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
                linkToFakeClick.dispatchEvent(fakeMouseClickEvent);
            }
            // If we got here either we're not on an Android device or the fake click didn't work so just redirect normally
            window.location.replace(redirectUrlRelativeToThisPage);
        </script>
    </body>
    </html>
    

    除了上面的示例代码(如果适合您的情况)之外,您还可以合并(如果假点击不起作用)两个不同的“我安装/未安装应用”按钮,这些按钮链接到自定义方案网址(强制 Intent )和常规网址。

    关于android - Android浏览器Facebook重定向并不总是触发URL Intent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12036793/

    有关android - Android浏览器Facebook重定向并不总是触发URL Intent的更多相关文章

    1. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

      我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

    2. ruby-on-rails - 浏览 Ruby 源代码 - 2

      我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

    3. ruby-on-rails - 如何在 Rails Controller Action 上触发 Facebook 像素 - 2

      我有一个ruby​​onrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素

    4. ruby - 将 spawn() 的标准输出/标准错误重定向到 Ruby 中的字符串 - 2

      我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])

    5. 安卓apk修改(Android反编译apk) - 2

      最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

    6. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

      我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

    7. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

      修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

    8. ruby - 强制浏览器下载文件而不是打开文件 - 2

      我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.

    9. ruby - 404 未找到,但可以从网络浏览器正常访问 - 2

      我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT

    10. ruby - 如何在 watir 测试套件结束时关闭浏览器? - 2

      使用ruby​​的watir测试网络应用程序时,浏览器最后会保持打开状态。网上的一些建议是,要进行真正的单元测试,您应该在每次测试时(在拆卸调用中)打开和关闭浏览器,但这很慢而且毫无意义。或者他们做这样的事情:defself.suites=superdefs.afterClass#Closebrowserenddefs.run(*args)superafterClassendsend但这会导致摘要输出不再显示(诸如“100次测试、100次断言、0次失败、0次错误”之类的内容仍应显示)。我怎样才能让ruby​​或watir在我的测试结束时关闭浏览器? 最佳答案

    随机推荐