Android / iOS – URI personalizado / Manejo de protocolos

¿Hay una manera de definir algún tipo de mecanismo de manejo en Android e iOS que me permitiría interceptar cualquiera de los siguientes:

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

Me gustaría "escuchar" el protocolo o el host, y abrir una correspondiente Activity / ViewController.

Me gustaría también si estos podrían ser tan amplio como sea posible. Me imagino que esto será más un problema en iOS, pero idealmente sería capaz de hacer clic en uno de esos dos esquemas, como hipervínculos, desde cualquier aplicación. Gmail, Safari, etc.

    3 Solutions collect form web for “Android / iOS – URI personalizado / Manejo de protocolos”

    Para iOS, sí, puedes hacer dos cosas:

    1. Haz que tu aplicación anuncie que puede manejar URL con un esquema dado.

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

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

    • Implementar -application:didFinishLaunchingWithOptions: en el delegado de la aplicación.

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

    • Cree una subclase propia de NSURLProtocol .

    • Override +canInitWithRequest: – por lo general, solo verás el esquema de URL y lo aceptarás si coincide con el esquema que quieres manejar, pero puedes mirar otros aspectos de la solicitud también.

    • Registre su subclase: [MyURLProtocol registerClass];

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

    Lea los documentos NSURLProtocol enlazados anteriormente para obtener más información. El nivel de dificultad aquí depende en gran parte de lo que está intentando implementar. Es común que las aplicaciones de iOS implementen un controlador de URL personalizado para que otras aplicaciones puedan realizar solicitudes sencillas. La implementación de su propio controlador HTTP o FTP es un poco más complicado.

    Por lo que vale la pena, esto es exactamente cómo PhoneGap funciona en iOS. PhoneGap incluye una subclase NSURLProtocol llamada PGURLProtocol que examina el esquema de cualquier URL que la aplicación intenta cargar y asume si es uno de los esquemas que reconoce. El primo de Open Source de PhoneGap es Cordova – puede resultarle útil echar un vistazo.

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

    Androide:

    Para Android, consulte Filtro de intenciones para iniciar mi actividad cuando se hace clic en el URI personalizado .

    Utiliza un filtro de intenciones:

     <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 iniciar. 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 el intento.

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

    Si ya está en ejecución, onNewIntent () será llamado en su actividad, de nuevo con el URI en la intención.

    Por último, si en su lugar desea manejar el protocolo personalizado en UIWebView alojado en su aplicación nativa, puede utilizar:

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

    IOS:

    Para iOS, consulte la sección Aplicación con URL (mediante el handleOpenURL de UIApplicationDelegate) que funciona en iOS 4, pero no en iOS 3.2 .

    Defina su esquema de URL a través de las teclas Info.plist de forma similar 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> 

    A continuación, defina una función de controlador para que se llame en el delegado de la aplicación

     - (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 en su aplicación nativa, puede utilizar 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 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); } 

    Para la segunda opción en su pregunta:

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

    Había una nueva técnica introducida con iOS 9, llamada Universal Links, que le permite interceptar enlaces a su sitio web, si son https: //

    https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.