编辑5/2014,因为这似乎是一个受欢迎的问题,我已经添加了很多细节的答案:
安卓:
对于Android, 单击自定义URI时 ,请参阅意图filter以启动“我的活动” 。
您使用意图filter:
这附加到您要启动的活动。 例如:
然后,在你的活动中,如果没有运行,活动将通过在Intent中传递的URI来启动。
Intent intent = getIntent(); Uri openUri = intent.getData();
如果已经运行,onNewIntent()将在您的活动中被调用,同样在意图中使用URI。
最后,如果您不想在您的本机应用程序中托pipeUIWebView托pipe的自定义协议,则可以使用:
myWebView.setWebViewClient(new WebViewClient() { public Boolean shouldOverrideUrlLoading(WebView view, String url) { // inspect the url for your protocol } });
iOS版:
对于iOS,请参阅在iOS 4下工作的URL(通过UIApplicationDelegate的handleOpenURL),但不在iOS 3.2下 。
通过Info.plist键定义您的URLscheme,类似于:
CFBundleURLTypesCFBundleURLNamecom.yourcompany.myappCFBundleURLSchemesmyapp
然后定义一个处理函数在你的应用程序委托中被调用
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { // parse and validate the URL }
如果您想在您的本机应用程序中托pipe的UIWebViews中处理自定义协议,则可以使用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"]) { ... } } }
}
对于WKWebView (iOS8 +),您可以使用WKNavigationDelegate和此方法:
- (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); }