EDITAR 5/2014, ya que esto parece ser una pregunta popular he añadido muchos detalles de la respuesta:
Android:
Para Android, consulte Intent Filter to Launch My Activity when custom URI is clicked.
utiliza una intención de filtro:
<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>
Ésta está unida a la actividad que desea que se puso en marcha. 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 pondrá en marcha con el URI transferido en el intento.
Intent intent = getIntent();
Uri openUri = intent.getData();
Si ya se está ejecutando, onNewIntent() será llamado en su actividad, de nuevo con el URI en el intento.
Por último, si por el contrario quiere manejar el protocolo personalizado en la UIWebView alojado dentro de 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 Lauching App with URL (via UIApplicationDelegate's handleOpenURL) working under iOS 4, but not under iOS 3.2.
Define tu esquema de URL a través de Info.llaves plist 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, definir una función de controlador a ser llamado en 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 dentro de su aplicación nativa, se 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 +), en su lugar 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);
}
La respuesta aceptada debería realmente abordar toda la cuestión. Tu respuesta no menciona a Android. La pregunta tiene un "y" en negrita. – ToothlessRebel
La pregunta realmente debería haberse dividido en dos preguntas: no hay una forma única de manejar URI personalizados en ambas plataformas. –