소스 검색

webView 退出销毁

Steven 4 년 전
부모
커밋
bc9fc64328
2개의 변경된 파일78개의 추가작업 그리고 13개의 파일을 삭제
  1. 41 6
      MusicGradeExam/MusicGradeExam/Base/KSBaseWKWebViewController.m
  2. 37 7
      MusicGradeExam/MusicGradeExam/Tools/Extension/NSString+Extension.m

+ 41 - 6
MusicGradeExam/MusicGradeExam/Base/KSBaseWKWebViewController.m

@@ -15,8 +15,39 @@
 #import "RCConnectionManager.h"
 #import "UserInfoManager.h"
 
+// WKWebView 内存不释放的问题解决
+@interface WeakWebViewScriptMessageDelegate : NSObject<WKScriptMessageHandler>
+
+//WKScriptMessageHandler 这个协议类专门用来处理JavaScript调用原生OC的方法
+@property (nonatomic, weak) id<WKScriptMessageHandler> scriptDelegate;
+
+- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate;
+
+@end
+
+@implementation WeakWebViewScriptMessageDelegate
+
+- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate {
+    self = [super init];
+    if (self) {
+        _scriptDelegate = scriptDelegate;
+    }
+    return self;
+}
+
+#pragma mark - WKScriptMessageHandler
+//遵循WKScriptMessageHandler协议,必须实现如下方法,然后把方法向外传递
+//通过接收JS传出消息的name进行捕捉的回调方法
+- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
+    
+    if ([self.scriptDelegate respondsToSelector:@selector(userContentController:didReceiveScriptMessage:)]) {
+        [self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message];
+    }
+}
+
+@end
+
 @interface KSBaseWKWebViewController ()<WKUIDelegate,WKNavigationDelegate,WKScriptMessageHandler>
-@property (nonatomic, strong) WKUserContentController *userContentController;
 
 @property (nonatomic,weak) CALayer *progressLayer;
 
@@ -74,16 +105,20 @@
         [self.view addSubview:topView];
     }
     if (_myWebView == nil) {
-        _userContentController = [[WKUserContentController alloc]init];
-        //注册方法
-        [_userContentController addScriptMessageHandler:self name:@"EXAM"];
         
         WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
         config.selectionGranularity = WKSelectionGranularityDynamic;
         config.allowsInlineMediaPlayback = YES;
         config.processPool = [KSBaseWKWebViewController singleWkProcessPool];
         config.websiteDataStore = [WKWebsiteDataStore defaultDataStore];
-        config.userContentController = self.userContentController;
+        
+        //自定义的WKScriptMessageHandler 是为了解决内存不释放的问题
+        WeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[WeakWebViewScriptMessageDelegate alloc] initWithDelegate:self];
+        //这个类主要用来做native与JavaScript的交互管理
+        WKUserContentController * wkUController = [[WKUserContentController alloc] init];
+        [wkUController addScriptMessageHandler:weakScriptMessageDelegate name:@"EXAM"];
+        config.userContentController = wkUController;
+
         WKPreferences *preferences = [WKPreferences new];
         // 是否支出javaScript
         preferences.javaScriptEnabled = YES;
@@ -403,7 +438,7 @@
 
 
 - (void)dealloc {
-    [_userContentController removeScriptMessageHandlerForName:@"postMessage"];
+    [[_myWebView configuration].userContentController removeScriptMessageHandlerForName:@"EXAM"];
     [_myWebView removeObserver:self forKeyPath:@"estimatedProgress"];
     [_myWebView removeObserver:self forKeyPath:@"title"];
     [_myWebView loadHTMLString:@"" baseURL:nil];

+ 37 - 7
MusicGradeExam/MusicGradeExam/Tools/Extension/NSString+Extension.m

@@ -109,19 +109,35 @@
     if ([platform isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus";
     if ([platform isEqualToString:@"iPhone9,3"]) return @"iPhone 7";
     if ([platform isEqualToString:@"iPhone9,4"]) return @"iPhone 7 Plus";
-    if ([platform isEqualToString:@"iPhone10,1"])return @"iPhone 8";
-    if ([platform isEqualToString:@"iPhone10,4"])return @"iPhone 8";
-    if ([platform isEqualToString:@"iPhone10,2"])return @"iPhone 8 Plus";
-    if ([platform isEqualToString:@"iPhone10,5"])return @"iPhone 8 Plus";
-    if ([platform isEqualToString:@"iPhone10,3"])return @"iPhone X";
-    if ([platform isEqualToString:@"iPhone10,6"])return @"iPhone X";
-    
+    if ([platform isEqualToString:@"iPhone10,1"]) return @"iPhone 8";
+    if ([platform isEqualToString:@"iPhone10,4"]) return @"iPhone 8";
+    if ([platform isEqualToString:@"iPhone10,2"]) return @"iPhone 8 Plus";
+    if ([platform isEqualToString:@"iPhone10,5"]) return @"iPhone 8 Plus";
+    if ([platform isEqualToString:@"iPhone10,3"]) return @"iPhone X";
+    if ([platform isEqualToString:@"iPhone10,6"]) return @"iPhone X";
+    
+    if ([platform isEqualToString:@"iPhone11,2"]) return @"iPhone XS";
+    if ([platform isEqualToString:@"iPhone11,4"]) return @"iPhone XS Max";
+    if ([platform isEqualToString:@"iPhone11,6"]) return @"iPhone XS Max";
+    if ([platform isEqualToString:@"iPhone11,8"]) return @"iPhone XR";
+    
+    if ([platform isEqualToString:@"iPhone12,1"]) return @"iPhone 11";
+    if ([platform isEqualToString:@"iPhone12,3"]) return @"iPhone 11 Pro";
+    if ([platform isEqualToString:@"iPhone12,5"]) return @"iPhone 11 Pro Max";
+    if ([platform isEqualToString:@"iPhone12,8"]) return @"iPhone SE 2";
+    
+    if ([platform isEqualToString:@"iPhone13,1"]) return @"iPhone 12 mini";
+    if ([platform isEqualToString:@"iPhone13,2"]) return @"iPhone 12";
+    if ([platform isEqualToString:@"iPhone13,3"]) return @"iPhone 12 Pro";
+    if ([platform isEqualToString:@"iPhone13,4"]) return @"iPhone 12 Pro Max";
     
     if ([platform isEqualToString:@"iPod1,1"])   return @"iPod Touch 1G (A1213)";
     if ([platform isEqualToString:@"iPod2,1"])   return @"iPod Touch 2G (A1288)";
     if ([platform isEqualToString:@"iPod3,1"])   return @"iPod Touch 3G (A1318)";
     if ([platform isEqualToString:@"iPod4,1"])   return @"iPod Touch 4G (A1367)";
     if ([platform isEqualToString:@"iPod5,1"])   return @"iPod Touch 5G (A1421/A1509)";
+    if ([platform isEqualToString:@"iPod7,1"]) return @"iTouch6";
+    if ([platform isEqualToString:@"iPod9,1"]) return @"iTouch7";
     
     if ([platform isEqualToString:@"iPad1,1"])   return @"iPad 1G (A1219/A1337)";
     
@@ -164,6 +180,20 @@
     if ([platform isEqualToString:@"iPad7,3"])   return @"iPad Pro 10.5 inch (WiFi)";
     if ([platform isEqualToString:@"iPad7,4"])   return @"iPad Pro 10.5 inch (Cellular)";
     
+    if ([platform isEqualToString:@"iPad8,1"]) return @"iPad Pro 11-inch";
+    if ([platform isEqualToString:@"iPad8,2"]) return @"iPad Pro 11-inch";
+    if ([platform isEqualToString:@"iPad8,3"]) return @"iPad Pro 11-inch";
+    if ([platform isEqualToString:@"iPad8,4"]) return @"iPad Pro 11-inch";
+    if ([platform isEqualToString:@"iPad8,5"]) return @"iPad Pro 12.9-inch 3";
+    if ([platform isEqualToString:@"iPad8,6"]) return @"iPad Pro 12.9-inch 3";
+    if ([platform isEqualToString:@"iPad8,7"]) return @"iPad Pro 12.9-inch 3";
+    if ([platform isEqualToString:@"iPad8,8"]) return @"iPad Pro 12.9-inch 3";
+    
+    if ([platform isEqualToString:@"iPad8,9"]) return @"iPad Pro 11-inch 2";
+    if ([platform isEqualToString:@"iPad8,10"]) return @"iPad Pro 11-inch 2";
+    if ([platform isEqualToString:@"iPad8,11"]) return @"iPad Pro 12.9-inch 4";
+    if ([platform isEqualToString:@"iPad8,12"]) return @"iPad Pro 12.9-inch 4";
+    
     if ([platform isEqualToString:@"AppleTV2,1"]) return @"Apple TV 2";
     if ([platform isEqualToString:@"AppleTV3,1"]) return @"Apple TV 3";
     if ([platform isEqualToString:@"AppleTV3,2"]) return @"Apple TV 3";