编辑5/2014,因为这似乎是一个受欢迎的问题,所以我在回答中添加了很多细节:
Android:
对于Android,请单击单击自定义URI时,请参阅意图过滤器以启动我的活动。
您使用一个意图过滤器:
这将附加到您要启动的活动。 例如:
然后,在您的活动中(如果未运行),将使用在Intent中传递的URI启动活动。
Intent intent = getIntent();
Uri openUri = intent.getData();
如果已经运行,则将在您的活动中调用onNewIntent(),并再次使用该URI。
最后,如果您想在本机应用程序中托管的UIWebView中处理自定义协议,则可以使用:
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键定义您的URL方案,类似于:
CFBundleURLTypes
CFBundleURLName
com.yourcompany.myapp
CFBundleURLSchemes
myapp
然后定义一个处理函数,以在您的应用程序委托中调用
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
// parse and validate the URL
}
如果要在本机应用程序中托管的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);
}