2016-05-10 11 views
11

Mam prostą aplikację opakowującą Cordova, która wskazuje zewnętrzną stronę internetową, bez definiowania żadnych własnych widoków.Aplikacja Cordova Wrapper, w której łącza wewnętrzne ładują się w aplikacji, łącza zewnętrzne Ładuj w przeglądarce

Chciałbym wszystkie wewnętrzne linki z tej domeny były załadowane wewnątrz aplikacji, ale wszystkie linki zewnętrzne (http://twitter.com itp), które mają zostać załadowane w przeglądarce systemowej, więc strony mają Back/Forward funkcjonalność.

W zwykłej aplikacji z widokami mogę ustawić target='_system', aby wczytać łącza w domyślnej przeglądarce lub użyć cordova-plugin-inappbrowser, aby jawnie otwierać linki w widoku przeglądarki. Niestety w tym przypadku nie mam możliwości edycji kodu po stronie serwera, więc potrzebuję rozwiązania, które działa w aplikacji.

Jeśli zdefiniuję config.xml jako taką, to w aplikacji będą ładowane zarówno wewnętrzne, jak i zewnętrzne linki.

<content src="http://example.com/" /> 
<access origin="*" /> 
<allow-navigation href="*" /> 

Gdybym określić config.xml z allow-intent, a następnie wewnętrzne i zewnętrzne odnośniki są otwierane w przeglądarce systemowej.

<content src="http://example.com/" /> 
<access origin="*" /> 
<allow-navigation href="*" /> 
<allow-intent href="http://*/*" /> 
<allow-intent href="https://*/*" /> 

Others mieć suggested użyciu niestandardowych javascript, aby zastąpić target do _system, jednak ponieważ nie mają własnych poglądów nie mogę tego zrobić.

Czy możliwe jest zdefiniowanie allow-intent dla cordova-plugin-whitelist w taki sposób, aby obejmować wszystkie adresy URL, które nie są domeną wewnętrzny?

Czy będę musiał jakoś zastąpić shouldStartLoadWithRequest w MainViewController, a następnie zadzwonić pod numer [[UIApplication sharedApplication] openURL:url]?

Odpowiedz

7

OK, po kilku eksperymentach i sugestiach od Hayyaan, udało mi się wymyślić kombinację allow-navigation i allow-intent, która służyła mojemu celowi.

<content src="https://example.com/" /> 
<access origin="*" /> 
<allow-navigation href="about:*" /> 
<allow-navigation href="https://example.com/*" /> 
<allow-navigation href="https://*.example.com/*" /> 
<allow-navigation href="https://*.facebook.com/*" /> 
<allow-intent href="http://*/*" /> 
<allow-intent href="https://*/*" /> 

Teraz wszystkie wewnętrzne linki z domeny internetowej są ładowane w aplikacji, natomiast linki zewnętrzne są ładowane w przeglądarce systemowej.

Uwaga, dołączyłem <allow-navigation href="https://*.facebook.com/*" />, aby umożliwić ładowanie bibliotek Facebooka, w przeciwnym razie wystąpił błąd.

ERROR Internal navigation rejected - 
<allow-navigation> not set for url='https://staticxx.facebook.com/connect/xd_arbiter.php? 

A także <allow-navigation href="about:*" /> aby uniknąć błędu dla about:blank.

ERROR Internal navigation rejected - <allow-navigation> not set for url='about:blank' 

Mam nadzieję, że to pomoże ktoś inny z tego samego problemu :)

+0

jak można to osiągnąć? Niektóre abc.example.com być w nawigacji wewnątrz WebView i xyz.example.com w zewnętrznej przeglądarce ! – NitZRobotKoder