Браузер Android Перенаправление Facebook не всегда вызывает намерение для URL

Я нахожусь в состоянии сильного рассола и отчаянно нуждаюсь в некоторой помощи в критической проблеме, которая у меня есть.

Я потратил месяцы на написание приложения / веб-сайта HTML5 вместе с нативным приложением для Android, которое является просто оболочкой WebView для веб-сайта HTML5. Одна из основных функций приложения заключается в том, что пользователи могут обмениваться конкретными URL-адресами приложений с Facebook, Twitter и т. Д., Чтобы их друзья могли следить за общими URL-адресами, которые откроют либо версию HTML5 моего приложения в их браузере, либо НАИБОЛЕЕ ВАЖНО, если они на Android, и у них установлено мое родное приложение Android, они ОБЯЗАНЫ ОТКРЫТЬ В МОЕМ ПРИЛОЖЕНИИ.

Это довольно сложный вопрос, поэтому для упрощения я буду последовательно использовать некоторые определенные термины в этом посте:

"MyApp user" a Android device user who DOES have my native Android app installed "non-MyApp user" a Android device user who DOES NOT have my native Android app installed "stock browser user" a stock Android user who uses a stock browser "non-stock browser user" a Android user who uses a non-stock browser (note the Samsung Galaxy SII stock "Internet" app is considered non-stock) "choose app dialog" on Android the OS dialog that appears asking the user what application they want to open the action/intent/url/document with and if they want to default to use this application always

Мой 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, диалоговое окно & quot; выбрать приложение & quot; появляется. Отлично, я правильно настроил свой AndroidManifest.xml.

Тем не менее, вещи не всегда работают в критическом сценарии Facebook. Это не всегда работает, потому что как собственное Android-приложение Facebook, так и мобильный веб-сайт 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 Stock Browser User:

Если у пользователя установлен стандартный Android и используется стандартный браузер Android, то все работает отлично, потому что происходят следующие события ...

Intent fires for the FB l.php URL FB URL gets opened in the ANDROID STOCK BROWSER The FB l.php is loaded and initiates the REDIRECT to http://myapp.com/sharedpage Intent fires for the http://myapp.com/sharedpage URL "choose app dialog" prompts user to open in MY NATIVE APP or in browser

MyApp Non-Stock Browser User:

ОДНАКО если пользователь ...

has installed and uses a NON-stock Android browers, e.g. Dolphin HD/mini, Opera Mobile/Mini etc, or has a manufacturer customised version of Android (e.g. on Samsung Galaxy SII, etc) and therefore has a customised browser

... тогда это главный вопрос, потому что происходят следующие события ...

Intent fires for the FB l.php URL FB URL gets opened in the NON-STOCK BROWSER The FB l.php is loaded and initiates the REDIRECT to http://myapp.com/sharedpage Intent IS NOT FIRED by the non-stock browser, the "choose app dialog" DOES NOT appear, the user is NOT prompted to open URL in my app The http://myapp.com/sharedpage URL is loaded and rendered in a tab of the non-stock browser

Client Side Redirect

Чтобы подтвердить перенаправление, вызвавшее проблему, я создал очень простую HTML-страницу с именем & quot; clientSideRedirector.htm & quot;

<html><body><script>
   window.location.href = "http://myapp.com/sharedpage";
</script></body></html>

Если открывается пользователь My-App / нестандартный браузерhttp://myapp.com/clientSideRedirector.htm & quot; диалог выбора приложения & quot; не появляются. ПОТЕРПЕТЬ ПОРАЖЕНИЕ.

Если открывается My-App / сток-браузер пользователяhttp://myapp.com/clientSideRedirector.htm & quot; диалог выбора приложения & quot; Появляется

Казалось бы, это соответствует тому, что мы видим с помощью публикации / перенаправления Facebook.

Server Side (302) Redirect

Я также подумал, что попробую перенаправить серверную часть, поэтому создал страницу .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 & quot; диалог выбора приложения & quot; Появляется независимо от браузера пользователя. Так что этот тип перенаправления, кажется, работает!

Attempted Solution A

(Двойное перенаправление: перенаправление Facebook l.php на серверное перенаправление на URL приложения)

Я думал, что это могло бы решить мои проблемы с Facebook. Если бы я поделилсяhttp://myapp.com/dotNetRedirect.ashx URL на Facebook, тогда, возможно, Facebook перенаправит на страницу dotNetRedirect.htm, а затем перенаправление на стороне сервера вызовет диалоговое окно & quot; выбрать приложение & quot; подскажите открыть.

К сожалению, это НЕ работает, в нестандартном браузере оно появилось бы, если бы первое перенаправление не вызвало намерение / "диалог выбора приложения" & quot; дальнейшие перенаправления также не будут выполняться. Массивно потрошит.

Attempted Solution 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>

Это действительно работает, диалоговое окно & quot; выберите приложение & quot; отображается через URL-адрес DB l.php даже при использовании нестандартного браузера. Однако это не действительно выполнимое решение в том виде, в каком оно существует, потому что «не пользователи MyApp» остаются с "Веб-страница недоступна" страницу при перенаправлении на URL myapp.com://sharedpage. ]

У кого-нибудь еще есть какие-нибудь яркие идеи или предложения?

Ответы на вопрос(3)

Ваш ответ на вопрос