Przeglądarka Android Przekierowanie Facebooka nie zawsze wyzwala zamiar dla adresu URL

Jestem w prawdziwej marynacie i rozpaczliwie potrzebuję pomocy w krytycznym problemie, który mam.

Spędziłem miesiące pisząc aplikację / stronę HTML5 wraz z natywną aplikacją Android, która jest po prostu opakowaniem WebView dla strony HTML5. Jedną z podstawowych funkcji aplikacji jest to, że użytkownicy mogą udostępniać adresy URL aplikacji na Facebooku i Twitterze itp., Aby ich przyjaciele mogli śledzić udostępnione adresy URL, które otworzą wersję HTML5 mojej aplikacji w przeglądarce lub NAJWAŻNIEJSZE, jeśli są na Androidzie i mają zainstalowaną moją rodzimą aplikację na Androida, MOGĄ BYĆ OTWARTE W MOJEJ APP.

Jest to dość długi skomplikowany problem, więc aby go uprościć, będę konsekwentnie korzystał z niektórych terminów w tym poście:

„Użytkownik MyApp” użytkownik urządzenia z Androidem, który ma zainstalowaną moją rodzimą aplikację na Androida„użytkownik inny niż MyApp” użytkownik urządzenia z Androidem, który NIE ma zainstalowanej mojej rodzimej aplikacji na Androida„zapasowy użytkownik przeglądarki” to zwykły użytkownik systemu Android korzystający z przeglądarki zapasów„użytkownik niebędący użytkownikiem przeglądarki” użytkownik systemu Android korzystający z przeglądarki innej niż zapasowa (zwróć uwagę, że aplikacja „Internet” na giełdzie Samsung Galaxy SII jest uważana za niekapitałową)„wybierz okno dialogowe aplikacji” w systemie Android w oknie dialogowym systemu operacyjnego, które pojawia się z pytaniem użytkownika, z jaką aplikacją chcesz otworzyć akcję / zamiar / adres URL / dokument i czy chcą domyślnie korzystać z tej aplikacji zawsze

Mój plik XMLManifest.xml zawiera następujące ...

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

Podczas testowania DZIAŁA DOSKONAŁO w każdym normalnym scenariuszu. Na przykład, jeśli użytkownik „MyApp” podąża bezpośrednio za linkiem dohttp://myapp.com/sharedpage, pojawi się „wybierz okno aplikacji”. Świetnie, zdecydowanie skonfigurowałem mój plik AndroidManifest.xml poprawnie.

Jednak rzeczy NIE ZAWSZE PRACUJĄ w krytycznym scenariuszu udostępniania na Facebooku. Nie zawsze działa, ponieważ zarówno natywna aplikacja Facebook na Facebooku, jak i strona mobilna Facebooka (http://m.facebook.com) NIE ŁĄCZĄ SIĘ BEZPOŚREDNIO na współdzielone adresy URL, a zamiast tego na stronie przekierowania na Facebooku. Na przykład jeślihttp://myapp.com/sharedpage jest udostępniony, Facebook ostatecznie dostarczy następujący adres 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

Jeśli użytkownik „MyApp” podąży za jednym z tych linków na Facebooku, może się zdarzyć jedna z dwóch rzeczy w zależności od przeglądarki, z której korzysta ...

Użytkownik przeglądarki MyApp Stock:

Jeśli użytkownik ma zainstalowany system Android i korzysta z podstawowej przeglądarki Android, wszystko działa FINE, ponieważ występują następujące zdarzenia ...

Zamierzone pożary dla adresu URL l.php FBAdres URL FB zostaje otwarty w PRZEGLĄDARCE DOSTĘPU DO SYSTEMU ANDROIDFB l.php jest ładowany i inicjuje REDIRECT nahttp://myapp.com/sharedpageCelowe pożary dlahttp://myapp.com/sharedpage URL„Wybierz okno aplikacji” monituje użytkownika o otwarcie aplikacji MY NATIVE lub przeglądarki

Użytkownik MyApp Non-Browser User:

JEDNAKŻE jeśli użytkownik ...

zainstalował i używa przeglądarek NON-stock Android, np. Dolphin HD / mini, Opera Mobile / Mini itp. Lubma dostosowaną do producenta wersję Androida (np. na Samsung Galaxy SII itp.) i dlatego ma dostosowaną przeglądarkę

... a następnie MAJOR ISSUE, ponieważ występują następujące zdarzenia ...

Zamierzone pożary dla adresu URL l.php FBAdres URL FB jest otwierany w PRZEGLĄDARCE BEZPIECZEŃSTWAFB l.php jest ładowany i inicjuje REDIRECT nahttp://myapp.com/sharedpageIntencja NIE JEST URUCHOMIONA przez przeglądarkę niebędącą magazynem, „wybierz okno dialogowe aplikacji” NIE pojawia się, użytkownik NIE jest monitowany o otwarcie adresu URL w mojej aplikacjiThehttp://myapp.com/sharedpage Adres URL jest ładowany i renderowany na karcie przeglądarki innej niż zapasowa

Przekierowanie po stronie klienta

Aby potwierdzić przekierowanie, które było przyczyną problemu, utworzyłem bardzo prostą stronę HTML o nazwie „clientSideRedirector.htm”

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

Jeśli otworzy się użytkownik My-App / non-stock browserhttp://myapp.com/clientSideRedirector.htm „okno wyboru aplikacji” NIE pojawia się. ZAWIEŚĆ.

Jeśli otworzy się użytkownik My-App / stock Browserhttp://myapp.com/clientSideRedirector.htm pojawia się „okno wyboru aplikacji”.

Wydaje się, że zgadza się z tym, co widzimy z udziałem / przekierowaniem na Facebooku.

Strona serwera (302) Przekierowanie

Pomyślałem też, że spróbuję przekierować po stronie serwera, więc utworzyłem stronę .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; } }
} 

Ma to bardzo interesujący i odmienny wynik od przekierowania klienta.
Jeśli użytkownik My-App otworzyhttp://myapp.com/dotNetRedirect.htm okno dialogowe „Wybór aplikacji” wydaje się NIEZALEŻNE od przeglądarki użytkownika. Więc ten typ przekierowania wydaje się działać!

Próba rozwiązania A

(Podwójne przekierowanie: przekierowanie Facebooka l.php na przekierowanie po stronie serwera na adres URL aplikacji)

Myślałem, że to może być rozwiązanie moich problemów z udostępnianiem na Facebooku. Jeśli się podzielęhttp://myapp.com/dotNetRedirect.ashx Adres URL do Facebooka, a może Facebook przekieruje na stronę dotNetRedirect.htm, a następnie przekierowanie po stronie serwera wymusi otwarcie monitu „wybierz okno dialogowe aplikacji”.

Niestety to NIE działa, w przeglądarce innej niż zapasowa pojawiłoby się, gdyby pierwsze przekierowanie nie spowodowało zamiaru / „wybierz okno dialogowe aplikacji”, dalsze przekierowania również nie będą. Masywnie patroszony.

Próba rozwiązania B

(Korzystanie ze schematu niestandardowego)

Po wyczerpaniu idei po stronie serwera pomyślałem, że zbadam użycie niestandardowego schematu URI do wyzwolenia „okna wyboru aplikacji”.

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>

To rzeczywiście działa, „wybierz okno dialogowe aplikacji” pojawia się za pośrednictwem adresu URL DB l.php, nawet jeśli używasz przeglądarki innej niż zapasowa. Jednak tak naprawdę nie jest to rozwiązanie realne, ponieważ po przekierowaniu na adres URL strony myapp.com://sharedpage „użytkownicy niebędący użytkownikami MyApp” mają stronę „Niedostępna strona internetowa”. ]

Czy ktoś inny ma jakieś inne jasne pomysły lub sugestie?

questionAnswers(3)

yourAnswerToTheQuestion