UIWebView

有时我们用UIWebView显示html内容时,会出现html中有超链接的情况,这时我们如果想在用点击超链接时用调用iOS系统的Safari打开这些目标链接,而不是在UIWebView里面打开,我们可以用以下方法,在UIWebView 的委托中实现

[cpp]  view plain copy
  1. #pragma mark - UIWebView Delegate  
  2. - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType  
  3. {  
  4.     NSURL *requestURL =[[request URL] retain];  
  5.     if (([[requestURL scheme] isEqualToString: @"http"] || [[requestURL scheme] isEqualToString:@"https"] || [[requestURL scheme] isEqualToString: @"mailto" ])  
  6.         && (navigationType == UIWebViewNavigationTypeLinkClicked)) {  
  7.         return ![[UIApplication sharedApplication] openURL:[requestURL autorelease]];  
  8.     }  
  9.     [requestURL release];  
  10.     return YES;  
  11. }  

如果想在用户点击这些超链接时,不去响应这些链接(默认会在本UIwebView直接打开),可以在上面的委托返回NO,不过要在第一次加载完UIWebView后才返回NO,不然UIWebView加载不出内容,因为UIWebView每次连接都会进入此委托....

在iOS开发中,`UIWebView` 曾是集成网页内容的主要方式之一,但由于其性能、内存占用及安全性问题,苹果官方从 iOS 8 开始推荐使用更高效的 `WKWebView`,并在后续版本中逐步淘汰了 `UIWebView` [^1]。 ### 1. `UIWebView` 使用指南(已过时) 尽管 `UIWebView` 已被弃用,但其基本用法包括加载网页、本地HTML文件或字符串内容: ```objective-c UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:webView]; NSURL *url = [NSURL URLWithString:@"https://www.example.com"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [webView loadRequest:request]; ``` 此外,也可以加载本地资源: ```objective-c NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"local" ofType:@"html"]; NSString *htmlContent = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil]; [webView loadHTMLString:htmlContent baseURL:nil]; ``` 需要注意的是,苹果已明确指出使用 `UIWebView` 的应用将被 App Store 拒绝 。 ### 2. `UIWebView` 替代方案 #### 2.1 `WKWebView` `WKWebView` 是 Apple 推荐的替代方案,属于 WebKit 框架的一部分,提供了更好的性能、更低的内存消耗以及更强的功能支持: ```objective-c #import <WebKit/WebKit.h> WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:webView]; NSURL *url = [NSURL URLWithString:@"https://www.example.com"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [webView loadRequest:request]; ``` `WKWebView` 还支持 JavaScript 与原生代码交互,通过 `WKUserContentController` 实现: ```objective-c WKUserContentController *userContentController = [[WKUserContentController alloc] init]; [userContentController addScriptMessageHandler:self name:@"nativeHandler"]; WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; configuration.userContentController = userContentController; WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration]; [self.view addSubview:webView]; ``` 在 HTML 中调用: ```html <script> window.webkit.messageHandlers.nativeHandler.postMessage("Hello from JS"); </script> ``` #### 2.2 第三方框架 - **SFSafariViewController**:适用于展示外部网页内容,提供与 Safari 一致的用户体验。 - **Flutter / React Native WebViews**:对于跨平台项目,可使用对应的 WebView 插件来实现网页集成。 ### 3. 集成网页的注意事项 - 确保网页内容加载时的安全性,例如启用 ATS(App Transport Security)。 - 对于需要与原生代码交互的场景,优先使用 `WKScriptMessageHandler`。 - 定期检查第三方 SDK 是否仍依赖 `UIWebView`,可通过命令 `grep -r "UIWebView" .` 检测 。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值