EDIT 5/2014, comme cela semble être une question populaire, j'ai ajouté beaucoup de détails à la réponse :
Android :
Pour Android, reportez-vous à Filtre d'intention pour lancer mon activité lorsque l'on clique sur un URI personnalisé .
Vous utilisez un filtre d'intention :
<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>
il est attaché à l'activité que vous voulez lancer. Par exemple :
<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>
Ensuite, dans votre activité, si elle n'est pas en cours d'exécution, l'activité sera lancée avec l'URI transmis dans l'intention.
Intent intent = getIntent();
Uri openUri = intent.getData();
S'il est déjà en cours d'exécution, onNewIntent() sera appelé dans votre activité, toujours avec l'URI dans l'intention.
Enfin, si vous souhaitez plutôt gérer le protocole personnalisé dans les UIWebViews hébergés dans votre application native, vous pouvez utiliser.. :
myWebView.setWebViewClient(new WebViewClient()
{
public Boolean shouldOverrideUrlLoading(WebView view, String url)
{
// inspect the url for your protocol
}
});
iOS :
Pour iOS, reportez-vous à Lancement d'une application avec une URL (via handleOpenURL de UIApplicationDelegate) sous iOS 4, mais pas sous iOS 3.2 .
Définissez votre schéma d'URL via des clés Info.plist similaires à :
<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>
Définissez ensuite une fonction de gestion qui sera appelée dans votre délégué d'application.
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
// parse and validate the URL
}
Si vous voulez gérer le protocole personnalisé dans UIWebViews hébergé dans votre application native, vous pouvez utiliser la méthode 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"]
...
}
}
}
Pour WKWebView (iOS8+), vous pouvez utiliser un WKNavigationDelegate et cette méthode :
- (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;
}
}
decisionHandler(WKNavigationActionPolicyAllow);
}