android ios protocols manifest custom-url-protocol

Android/iOS-URI personalizado/Manejo de protocolos



protocols manifest (3)

EDIT 5/2014, ya que parece ser una pregunta popular, he agregado muchos detalles a la respuesta:

Androide:

Para Android, consulte Intent Filter para iniciar Mi actividad cuando se haga clic en URI personalizado .

Utiliza un filtro de intención:

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

Esto se adjunta a la actividad que desea lanzar. Por ejemplo:

<activity android:name="com.MyCompany.MyApp.MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <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" android:host="com.MyCompany.MyApp" /> </intent-filter> </activity>

Luego, en su actividad, si no se está ejecutando, la actividad se iniciará con el URI pasado en la Intención.

Intent intent = getIntent(); Uri openUri = intent.getData();

Si ya se está ejecutando, se llamará a onNewIntent () en su actividad, nuevamente con el URI en la intención.

Por último, si en cambio quiere manejar el protocolo personalizado en UIWebView alojado dentro de su aplicación nativa, puede usar:

myWebView.setWebViewClient(new WebViewClient() { public Boolean shouldOverrideUrlLoading(WebView view, String url) { // inspect the url for your protocol } });

iOS:

Para iOS, consulte la aplicación Lauching con URL (a través de handleOpenURL de UIApplicationDelegate) que funciona con iOS 4, pero no con iOS 3.2 .

Defina su esquema de URL a través de las claves Info.plist similares a:

<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>com.yourcompany.myapp</string> </dict> <dict> <key>CFBundleURLSchemes</key> <array> <string>myapp</string> </array> </dict> </array>

Luego defina una función de controlador para que se le llame en su aplicación delegado

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { // parse and validate the URL }

Si desea manejar el protocolo personalizado en UIWebViews alojado dentro de su aplicación nativa, puede usar el método UIWebViewDelegate:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *urlPath = [request URL]; if (navigationType == UIWebViewNavigationTypeLinkClicked) { // inspect the [URL scheme], validate if ([[urlPath scheme] hasPrefix:@"myapp"]) { ... } } }

}

Para WKWebView (iOS8 +), puede utilizar en su lugar un WKNavigationDelegate y este método:

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { NSURL *urlPath = navigationAction.request.URL; if (navigationAction.navigationType == WKNavigationTypeLinkActivated) { // inspect the [URL scheme], validate if ([[urlPath scheme] hasPrefix:@"myapp"]) { // ... handle the request decisionHandler(WKNavigationActionPolicyCancel); return; } } //Pass back to the decision handler decisionHandler(WKNavigationActionPolicyAllow); }

¿Hay alguna manera de definir algún tipo de mecanismo de manejo en Android e iOS que me permita interceptar uno de los siguientes?

myapp:///events/3/ - or - http://myapp.com/events/3/

Me gustaría ''escuchar'' el protocolo o el host y abrir un Activity / ViewController correspondiente.

También me gustaría si estos podrían ser lo más amplio posible del sistema. Me imagino que esto será un problema mayor en iOS, pero idealmente podría hacer clic en cualquiera de esos dos esquemas, como hipervínculos, desde cualquier aplicación. Gmail, Safari, etc.



Actualización: esta es una pregunta muy antigua, y las cosas han cambiado mucho tanto en iOS como en Android. Dejaré la respuesta original a continuación, pero cualquier persona que trabaje en un nuevo proyecto o actualice uno anterior debería considerar usar enlaces profundos , que son compatibles con ambas plataformas.

En iOS, los enlaces profundos se denominan enlaces universales . Deberá crear un archivo JSON en su sitio web que asocie su aplicación con las URL que apuntan a partes de su sitio web. A continuación, actualice su aplicación para aceptar un objeto NSUserActivity y configure la aplicación para mostrar el contenido que corresponde a la URL dada. También debe agregar un derecho a la aplicación que incluya las URL que la aplicación puede manejar. En uso, el sistema operativo se encarga de descargar el archivo de asociación de su sitio e iniciar su aplicación cuando alguien intenta abrir una de las URL que maneja su aplicación.

La configuración de enlaces de aplicaciones en Android funciona de manera similar. Primero, establecerá una asociación entre su (s) sitio (s) web y su aplicación, y luego agregará filtros de intención que permitirán que su aplicación intercepte intentos de abrir las URL que su aplicación puede manejar.

Aunque los detalles son obviamente diferentes, el enfoque es prácticamente el mismo en ambas plataformas. Le brinda la posibilidad de insertar su aplicación en la visualización del contenido de su sitio web, sin importar qué aplicación intente acceder a ese contenido.

Respuesta original:

Para iOS, sí, puedes hacer dos cosas:

  1. Haga que su aplicación anuncie que puede manejar URL con un esquema determinado.

  2. Instale un controlador de protocolo para manejar cualquier esquema que desee.

La primera opción es bastante sencilla, y se describe en Implementación de esquemas de URL personalizados . Para que el sistema sepa que su aplicación puede manejar un esquema determinado:

  • actualice el archivo Info.plist de su aplicación con una entrada CFBundleURLTypes

  • implementa -application:didFinishLaunchingWithOptions: en tu delegado de aplicación.

La segunda posibilidad es escribir tu propio controlador de protocolo. Esto funciona solo dentro de su aplicación, pero puede usarlo junto con la técnica descrita anteriormente. Utilice el método anterior para hacer que el sistema inicie su aplicación para una URL determinada, y luego use un controlador de protocolo de URL personalizado dentro de su aplicación para aprovechar el poder del sistema de carga de URL de iOS:

  • Crea tu propia subclase de NSURLProtocol .

  • Anular +canInitWithRequest: - normalmente solo verá el esquema de URL y lo aceptará si coincide con el esquema que desea manejar, pero también puede ver otros aspectos de la solicitud.

  • Registre su subclase: [MyURLProtocol registerClass];

  • Sobrescriba -startLoading y -stopLoading para iniciar y detener la carga de la solicitud, respectivamente.

Lea la documentación de NSURLProtocol vinculada anteriormente para obtener más información. El nivel de dificultad aquí depende en gran medida de lo que intenta implementar. Es común que las aplicaciones de iOS implementen un controlador de URL personalizado para que otras aplicaciones puedan realizar solicitudes simples. Implementar su propio controlador HTTP o FTP es un poco más complicado.

Para lo que vale, esto es exactamente cómo funciona PhoneGap en iOS. PhoneGap incluye una subclase NSURLProtocol llamada PGURLProtocol que mira el esquema de cualquier URL que la aplicación intenta cargar y se hace cargo si es uno de los esquemas que reconoce. El primo de código abierto de PhoneGap es Cordova : puede que le resulte útil echar un vistazo.