Steven 1 سال پیش
والد
کامیت
058721b0fe

+ 4 - 0
KulexiuForStudent/KulexiuForStudent.xcodeproj/project.pbxproj

@@ -2017,6 +2017,8 @@
 		BC12639B28FF8E6D00509E90 /* HomeRecommendMusicView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeRecommendMusicView.h; sourceTree = "<group>"; };
 		BC12639C28FF8E6D00509E90 /* HomeRecommendMusicView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeRecommendMusicView.m; sourceTree = "<group>"; };
 		BC12639E28FF8E7400509E90 /* HomeRecommendMusicView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeRecommendMusicView.xib; sourceTree = "<group>"; };
+		BC255E822B29425F00A1FC27 /* SwiftImportHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftImportHeader.h; sourceTree = "<group>"; };
+		BC255E832B29425F00A1FC27 /* WebViewBaseConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebViewBaseConfig.h; sourceTree = "<group>"; };
 		BC27A068280FF56B00F91E27 /* AccompanyEvaluateCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccompanyEvaluateCell.h; sourceTree = "<group>"; };
 		BC27A069280FF56B00F91E27 /* AccompanyStudentEvaCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccompanyStudentEvaCell.h; sourceTree = "<group>"; };
 		BC27A06A280FF56B00F91E27 /* AccompanyEvaluateCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AccompanyEvaluateCell.xib; sourceTree = "<group>"; };
@@ -3274,6 +3276,8 @@
 		275E8AA727E18F8800DD3F6E /* KulexiuForStudent */ = {
 			isa = PBXGroup;
 			children = (
+				BC255E822B29425F00A1FC27 /* SwiftImportHeader.h */,
+				BC255E832B29425F00A1FC27 /* WebViewBaseConfig.h */,
 				BC8A45BF283DDD7100094BBB /* SoundFontFile */,
 				BC48C3AB2829184C00EE65C5 /* KulexiuForStudent.entitlements */,
 				BC2932D72AAEC0BC0024D98E /* InstitutionModule */,

+ 127 - 108
KulexiuForStudent/KulexiuForStudent/Common/Base/KSAccompanyWebViewController.m

@@ -6,22 +6,22 @@
 //
 
 #import "KSAccompanyWebViewController.h"
-#import "RecordCheckManager.h"
-#import "KSAQRecordManager.h"
-#import "KSWebSocketManager.h"
-#import "KSVideoRecordManager.h"
-#import "KSWebNavView.h"
-
-#import "KSAudioSessionManager.h"
-#import "KSCloudBeatView.h"
-#import "MidiPlayerEngine.h"
+#import "WebViewBaseConfig.h"     // 基础配置
+#import "SwiftImportHeader.h"     // swift 桥接
+
+#import "KSAudioSessionManager.h" // audio session
+#import "KSAQRecordManager.h"     // 录音
+#import "KSWebSocketManager.h"    // web socket
+#import "KSVideoRecordManager.h"  // 视频录制
+#import "KSCloudBeatView.h"       // 节拍器
+#import "MidiPlayerEngine.h"      // midi 播放
+#import "kSNewPlayer.h"           // mp3 播放器
+
 #import "AccompanyLoadingView.h"
-#import "KSPremissionAlert.h"
 
 #define KSMidiSongFileKey (@"KSDownloadMidiSong")
-#import "KulexiuForStudent-swift.h"
 
-#import "kSNewPlayer.h"
+// 合成
 #import "KSMediaEditor.h"
 #import "KSMediaMergeView.h"
 
@@ -117,6 +117,8 @@
 
 @property (nonatomic, strong) NSString *accompanyUrl;
 
+@property (nonatomic, assign) BOOL muteAccompany; // 是否静音
+
 @end
 
 @implementation KSAccompanyWebViewController
@@ -166,6 +168,28 @@
     self.offsetTime = 0;
 }
 
+- (void)downloadMp3File:(NSString *)musicUrl {
+    if (![NSString isEmptyString:musicUrl]) {
+        NSString *fileName = [musicUrl getUrlFileName];
+        NSString *filePath = [self getAccompanyFilePathWithName:fileName];
+        NSURL *fileUrl = [[NSURL alloc] initFileURLWithPath:filePath];
+        if ([self checkSongHasSaveAccompanyWithSongUrl:musicUrl]) {
+            [self configVideoRecord:fileUrl];
+        }
+        else {
+            MJWeakSelf;
+            [self downloadUrl:musicUrl success:^{
+                [weakSelf configVideoRecord:fileUrl];
+            } faliure:^{
+                
+            }];
+        }
+    }
+    else {
+        [self configVideoRecord:nil];
+    }
+}
+
 - (void)initMp3Player:(NSString *)musicUrl checkUrl:(NSString *)checkUrl {
     [self resetPlayerConfig];
     self.accompanyUrl = musicUrl;
@@ -346,7 +370,7 @@
         WeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[WeakWebViewScriptMessageDelegate alloc] initWithDelegate:self];
         //这个类主要用来做native与JavaScript的交互管理
         WKUserContentController * wkUController = [[WKUserContentController alloc] init];
-        [wkUController addScriptMessageHandler:weakScriptMessageDelegate name:@"COLEXIU"];
+        [wkUController addScriptMessageHandler:weakScriptMessageDelegate name:SCRIPT_NAME];
         config.userContentController = wkUController;
         
         WKPreferences *preferences = [WKPreferences new];
@@ -362,8 +386,14 @@
         self.myWebView.scrollView.bounces = NO;
         self.myWebView.backgroundColor = [UIColor clearColor];
         self.myWebView.scrollView.backgroundColor = [UIColor clearColor];
+#ifdef DEBUG
+            if (@available(iOS 16.4, *)) {
+                self.myWebView.inspectable = YES;
+            }
+#endif
         // 加载进度条和title
         [self.myWebView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
+        [self.myWebView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];
         [self.view addSubview:self.myWebView];
         [self.myWebView mas_makeConstraints:^(MASConstraintMaker *make) {
             make.left.right.mas_equalTo(self.view);
@@ -383,7 +413,7 @@
 
 - (void)configUserAgent:(WKWebViewConfiguration *)config {
     NSString *oldUserAgent = config.applicationNameForUserAgent;
-    NSString *newAgent = [NSString stringWithFormat:@"%@ %@ %@",oldUserAgent,@"ORCHESTRAAPPI",@"ORCHESTRASTUDENT"];
+    NSString *newAgent = [NSString stringWithFormat:@"%@ %@ %@",oldUserAgent,AGENT_NAME,AGENT_DOMAIN];
     config.applicationNameForUserAgent = newAgent;
 }
 
@@ -440,9 +470,8 @@
 
 - (void)userContentController:(WKUserContentController *)userContentController
       didReceiveScriptMessage:(WKScriptMessage *)message {
-    if ([message.name isEqualToString:@"COLEXIU"]) {
+    if ([message.name isEqualToString:SCRIPT_NAME]) {
         NSDictionary *parm = [self convertJsonStringToNSDictionary:message.body];
-        NSLog(@"---- receive parm %@", [parm mj_JSONString]);
         // 回到主线程
         dispatch_async(dispatch_get_main_queue(), ^{
             if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"createMusicPlayer"]) {
@@ -451,6 +480,8 @@
                 NSString *checkUrl = [content ks_stringValueForKey:@"tuneSrc"];
                 self.playerParm = parm;
                 [self initMp3Player:musicUrl checkUrl:checkUrl];
+                // 下载文件
+                [self downloadMp3File:musicUrl];
             }
             else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"startEvaluating"]) { // 开始评测
                 [self configRecordManager];
@@ -488,10 +519,17 @@
                 self.evaluatParm = nil;
                 [self stopRecordService];
                 [self postMessage:parm];
-//                [self sendEndMessage];
                 [self stopMp3Player]; // 停止播放
             }
             else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"startRecording"]) { //  开始录制
+                NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
+                if ([[content allKeys] containsObject:@"accompanimentState"]) {
+                    BOOL mute = [content ks_boolValueForKey:@"accompanimentState"] == NO;
+                    self.muteAccompany = mute;
+                }
+                else {
+                    self.muteAccompany = NO;
+                }
                 if (self->_videoRecordManager) {
                     [self.videoRecordManager clearVideoFile];
                 }
@@ -548,12 +586,14 @@
                 [self postMessage:parm];
             }
             else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"startCapture"]) { // 开始录制
-                // 需要合成音频
-                [self.videoRecordManager setIgnoreAudio:YES];
-                [RecordCheckManager checkPhotoLibraryPremissionAvaiable:YES showInView:self.view];
-                self.videoRecordManager.audioUrl = self.AQManager.audioUrl;
-                [self.videoRecordManager startRecord];
-                [self postMessage:parm];
+                PREMISSIONTYPE isOk = [RecordCheckManager checkPhotoLibraryPremissionAvaiable:YES showInView:self.view];
+                if (isOk == PREMISSIONTYPE_YES) {
+                    
+                    [self.videoRecordManager setIgnoreAudio:YES];
+                    self.videoRecordManager.audioUrl = self.AQManager.audioUrl;
+                    [self.videoRecordManager startRecord];
+                    [self postMessage:parm];
+                }
             }
             else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"endCapture"]) { // 结束录制
                 if (self->_videoRecordManager) {
@@ -584,6 +624,35 @@
                 [self stopRecordService];
                 [self postMessage:parm];
             }
+            // 音视频合成
+            else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"openAdjustRecording"]) {
+                KSMediaMergeView *mergeView = [[KSMediaMergeView alloc] init];
+                if (self.bgAudioUrl == nil) {
+                    [LOADING_MANAGER MBShowAUTOHidingInWindow:@"当前曲目无mp3伴奏"];
+                }
+                else {
+                    if (self.AQManager && self.AQManager.audioUrl) {
+                        self.recordUrl = self.AQManager.audioUrl;
+                        [self.view addSubview:mergeView];
+                        [mergeView mas_makeConstraints:^(MASConstraintMaker *make) {
+                            make.left.right.top.bottom.mas_equalTo(self.view);
+                        }];
+                        NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
+                        mergeView.recordId = [content ks_stringValueForKey:@"recordId"];
+                        mergeView.songName = [content ks_stringValueForKey:@"title"];
+                        mergeView.coverImage = [content ks_stringValueForKey:@"coverImg"];
+                        MJWeakSelf;
+                        NSInteger micDelay = [UserDefaultObjectForKey(@"micDelay") integerValue];
+                        NSInteger defaultDelay = self.offsetTime + micDelay;
+                        [mergeView configWithVideoUrl:self.videoRecordManager.videoFileURL bgAudioUrl:self.bgAudioUrl remoteBgUrl:self.accompanyUrl  recordUrl:self.recordUrl offsetTime:defaultDelay mergeCallback:^{
+                            [weakSelf musicPublishCallBack:content];
+                        }];
+                    }
+                    else {
+                        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"麦克风被占用"];
+                    }
+                }
+            }
             else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"videoUpdate"]) { // 上传
                 NSMutableDictionary *sendParm = [NSMutableDictionary dictionaryWithDictionary:parm];
                 NSMutableDictionary *contentParm = [NSMutableDictionary dictionaryWithDictionary:[sendParm ks_dictionaryValueForKey:@"content"]];
@@ -808,33 +877,6 @@
                     [self removeCustomLoadingView];
                 }
             }
-            else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudAccompanyMessage"]) { // 获取伴奏
-                NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
-                NSString *accompanyUrl = [content ks_stringValueForKey:@"accompanyUrl"];
-                if (![NSString isEmptyString:accompanyUrl]) {
-                    NSString *fileName = [accompanyUrl getUrlFileName];
-                    NSString *filePath = [self getAccompanyFilePathWithName:fileName];
-                    NSURL *fileUrl = [[NSURL alloc] initFileURLWithPath:filePath];
-                    self.accompanyUrl = accompanyUrl;
-                    if ([self checkSongHasSaveAccompanyWithSongUrl:accompanyUrl]) {
-                        [self configVideoRecord:fileUrl];
-                    }
-                    else {
-                        MJWeakSelf;
-                        [self downloadUrl:accompanyUrl success:^{
-                            [weakSelf configVideoRecord:fileUrl];
-                        } faliure:^{
-                            
-                        }];
-                        
-                    }
-                }
-                else {
-//                    [LOADING_MANAGER MBShowAUTOHidingInWindow:@"当前曲目无mp3伴奏"];
-                    [self configVideoRecord:nil];
-                }
-            }
-            
             // 跟音
             else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudToggleFollow"]) {
                 NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
@@ -846,7 +888,9 @@
                     [self stopTuner];
                 }
             }
-            // 延迟检测
+            else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cloudAccompanyMessage"]) { // 获取伴奏 废弃⚠️
+                
+            }
             else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"startTune"]) { // 延迟测试开始
                 NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
                 NSInteger count = [content ks_integerValueForKey:@"count"];
@@ -862,7 +906,7 @@
                 self.isDelayCheckStart = YES;
                 [self startRecordService];
             }
-            else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"endTune"]) { // 延迟测试结束
+            else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"endTune"]) { // 延迟测试停止
                 
                 self.isDelayCheckStart = NO;
                 [self stopRecordService];
@@ -909,35 +953,6 @@
                 [sendParm setValue:content forKey:@"content"];
                 [self postMessage:sendParm];
             }
-            // 音视频合成
-            else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"openAdjustRecording"]) {
-                KSMediaMergeView *mergeView = [[KSMediaMergeView alloc] init];
-                if (self.bgAudioUrl == nil) {
-                    [LOADING_MANAGER MBShowAUTOHidingInWindow:@"当前曲目无mp3伴奏"];
-                }
-                else {
-                    if (self.AQManager && self.AQManager.audioUrl) {
-                        self.recordUrl = self.AQManager.audioUrl;
-                        [self.view addSubview:mergeView];
-                        [mergeView mas_makeConstraints:^(MASConstraintMaker *make) {
-                            make.left.right.top.bottom.mas_equalTo(self.view);
-                        }];
-                        NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
-                        mergeView.recordId = [content ks_stringValueForKey:@"recordId"];
-                        mergeView.songName = [content ks_stringValueForKey:@"title"];
-                        mergeView.coverImage = [content ks_stringValueForKey:@"coverImg"];
-                        MJWeakSelf;
-                        NSInteger micDelay = [UserDefaultObjectForKey(@"micDelay") integerValue];
-                        NSInteger defaultDelay = self.offsetTime + micDelay;
-                        [mergeView configWithVideoUrl:self.videoRecordManager.videoFileURL bgAudioUrl:self.bgAudioUrl remoteBgUrl:self.accompanyUrl  recordUrl:self.recordUrl offsetTime:defaultDelay mergeCallback:^{
-                            [weakSelf musicPublishCallBack:content];
-                        }];
-                    }
-                    else {
-                        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"麦克风被占用"];
-                    }
-                }
-            }
             else {
                 [super handleScriptMessageSource:parm];
             }
@@ -1034,12 +1049,16 @@
     [KSNetworkingManager downloadFileRequestWithFileUrl:midiUrl progress:^(int64_t bytesRead, int64_t totalBytes) {
         
     } success:^(NSURL * _Nonnull fileUrl) {
-        
+
         if ([self saveMidiFileWithUrl:fileUrl midiUrl:midiUrl]) {
-            success();
+            if (success) {
+                success();
+            }
         }
     } faliure:^(NSError * _Nonnull error) {
-        faliure();
+        if (faliure) {
+            faliure();
+        }
     }];
 }
 
@@ -1221,31 +1240,31 @@
 }
 
 #pragma mark ------- 评测app播放
-/*
+
 - (void)recordDidStart:(NSTimeInterval)time { // ms
-     self.recordStartTime = time;
-     if (self.isDelayCheckStart) {
-          NSLog(@"---- delay - record did start %f", time);
-          // 播放音频
-          // 播放校音音频
-          dispatch_main_sync_safe(^{
-               if (self.checkIndex % 2 == 0) {
-                    [self.dongPlayer startPlay];
-               }
-               else {
-                    [self.dingPlayer startPlay];
-               }
-          });
-     }
-     else if (self.isCompareStart) {
-          NSLog(@"---- compare - record did start %f", time);
-          // 播放伴奏
-          dispatch_main_sync_safe(^{
-               [self.musicPlayer startPlay];
-          });
-     }
-}
-*/
+    self.recordStartTime = time;
+    if (self.isDelayCheckStart) {
+        NSLog(@"---- delay - record did start %f", time);
+        // 播放音频
+        // 播放校音音频
+        dispatch_main_sync_safe(^{
+            if (self.checkIndex % 2 == 0) {
+                [self.dongPlayer startPlay];
+            }
+            else {
+                [self.dingPlayer startPlay];
+            }
+        });
+    }
+    else if (self.isCompareStart) {
+        NSLog(@"---- compare - record did start %f", time);
+        // 播放伴奏
+        dispatch_main_sync_safe(^{
+            self.musicPlayer.isMute = self.muteAccompany;
+            [self.musicPlayer startPlay];
+        });
+    }
+}
 
 
 - (void)audioRecord:(KSAQRecordManager *)audioRecord didRecordAudioData:(void *)data length:(UInt32)length {

+ 235 - 195
KulexiuForStudent/KulexiuForStudent/Common/Base/KSBaseWKWebViewController.m

@@ -6,30 +6,34 @@
 //
 
 #import "KSBaseWKWebViewController.h"
-#import "JPUSHService.h"
-#import "LoginViewController.h"
-#import "AppDelegate.h"
-#import "CustomNavViewController.h"
-#import "UIDevice+TFDevice.h"
-#import "KSPremissionAlert.h"
-#import "RecordCheckManager.h"
+#import "WebViewBaseConfig.h" // 基础配置
+#import "UIDevice+TFDevice.h" // 横竖屏
+
+// 其他web
 #import "KSLocalWebViewController.h"
 #import "KSAccompanyWebViewController.h"
-#import "KSChatConversationViewController.h"
-#import "KSGroupConversationController.h"
+
+#import "AppDelegate+AppService.h"
+#import "UserInfoManager.h"
+#import "KSMediaManager.h"
+#import "KSUMShareManager.h"
 #import "KSOrderManager.h"
-#import "AddressListViewController.h"
 #import "KSEnterLiveroomManager.h"
 
-#import "TZImageManager.h"
-#import <AVFoundation/AVFoundation.h>
-#import "KSDocumentViewController.h"
+// 保存文件
 #import "KSICloudManager.h"
-#import "KSMediaManager.h"
-#import "KSUMShareManager.h"
-#import "UserInfoManager.h"
-#import "KSWebLoadRefreshView.h"
+#import "KSDocumentViewController.h"
+
+// 聊天页面
+#import "KSChatConversationViewController.h"
+#import "KSGroupConversationController.h"
+
+#import "AddressListViewController.h"
+
+// 视频封面选择
 #import "KSVideoCropViewController.h"
+// 错误刷新web 页面
+#import "KSWebLoadRefreshView.h"
 
 typedef NS_ENUM(NSInteger, CHOOSETYPE) {
     CHOOSETYPE_XML,
@@ -44,14 +48,10 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
 
 @property (nonatomic,weak) CALayer *progressLayer;
 
-@property (nonatomic, strong) NSString *currerntURL; // 当前web URL
-
 @property (nonatomic, assign) BOOL hasModify;
 
 @property (nonatomic, assign) BOOL hasChangeSource;  // 是否切换了亮屏,横屏等配置
 
-@property (nonatomic, assign) BOOL landScape;
-
 /// 选择本地文件 parm
 @property (nonatomic, strong) NSMutableDictionary *chooseFileParm;
 
@@ -86,39 +86,6 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(captureViewTips:) name:UIScreenCapturedDidChangeNotification object:nil];
 }
 
-
-- (void)captureViewTips:(NSNotification *)notification {
-    [self checkCaptured];
-}
-
-- (void)checkCaptured {
-    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
-        if ([self checkIsCaptured]) {
-            [self didCapturedView];
-        }
-    });
-}
-#pragma mark ---- 镜像和投屏检测
-- (BOOL)checkIsCaptured {
-    if ([UIScreen mainScreen].isCaptured && [UIScreen screens].count < 2) {
-        return YES;
-    }
-    return NO;
-}
-
-- (void)didCapturedView {
-    
-    NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
-    [sendParm setValue:@"setVideoPlayer" forKey:@"api"];
-    NSMutableDictionary *content = [NSMutableDictionary dictionary];
-    [content setValue:@"pause" forKey:@"status"];
-    [sendParm setValue:content forKey:@"content"];
-    [self postMessage:sendParm];
-}
-
-
-
-
 - (void)operationDealCallbackMessage:(NSNotification *)notification {
     NSString *status = [notification object];
     NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
@@ -166,9 +133,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
     }
     self.isFirstLoad = NO;
     
-    if ([UIScreen mainScreen].isCaptured) {
-        [self didCapturedView];
-    }
+    [self checkCaptured];
 }
 
 
@@ -224,7 +189,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         WeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[WeakWebViewScriptMessageDelegate alloc] initWithDelegate:self];
         //这个类主要用来做native与JavaScript的交互管理
         WKUserContentController * wkUController = [[WKUserContentController alloc] init];
-        [wkUController addScriptMessageHandler:weakScriptMessageDelegate name:@"COLEXIU"];
+        [wkUController addScriptMessageHandler:weakScriptMessageDelegate name:SCRIPT_NAME];
         config.userContentController = wkUController;
         
         WKPreferences *preferences = [WKPreferences new];
@@ -239,28 +204,23 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         _myWebView.scrollView.bounces = NO;
         _myWebView.scrollView.showsVerticalScrollIndicator = NO;
         _myWebView.scrollView.showsHorizontalScrollIndicator = NO;
+        [self.view addSubview:_myWebView];
+#ifdef DEBUG
+            if (@available(iOS 16.4, *)) {
+                _myWebView.inspectable = YES;
+            }
+#endif
         // 加载进度条和title
         [_myWebView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
-        
+        [_myWebView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];
         [self.view addSubview:_myWebView];
-        
-//        // OC
-//        if (@available(iOS 16.4, *)) {
-//            _myWebView.inspectable = true;
-//        } else {
-//            // Fallback on earlier versions
-//        }
-        
         [_myWebView mas_makeConstraints:^(MASConstraintMaker *make) {
             make.left.right.mas_equalTo(self.view);
             make.top.mas_equalTo(self.view.mas_top);
             make.bottom.mas_equalTo(self.view.mas_bottom);
         }];
-        if (@available(iOS 11.0, *)) {
-            _myWebView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
-        } else {
-            // Fallback on earlier versions
-        }
+        _myWebView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+
         [self setupProgress];
         // 修改userAgent
         [self loadRequest];
@@ -272,12 +232,11 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
 
 - (void)configUserAgent:(WKWebViewConfiguration *)config {
     NSString *oldUserAgent = config.applicationNameForUserAgent;
-    NSString *newAgent = [NSString stringWithFormat:@"%@ %@ %@",oldUserAgent,@"COLEXIUAPPI",@"COLEXIUSTUDENT"];
+    NSString *newAgent = [NSString stringWithFormat:@"%@ %@ %@",oldUserAgent,AGENT_NAME,AGENT_DOMAIN];
     config.applicationNameForUserAgent = newAgent;
 }
 
 
-
 - (void)loadRequest {
     
     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0f];
@@ -303,6 +262,22 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
 }
 
 #pragma mark  --- 返回按钮的处理
+
+- (void)backPreViewAction {
+    [self.myWebView stopLoading];
+    if (_backRootView) {
+        [self.navigationController popToRootViewControllerAnimated:NO];
+        return;
+    }
+    else if (_isBackPreView) {
+        [self.navigationController popViewControllerAnimated:YES];
+        return;
+    }
+    else {
+        [self.navigationController popViewControllerAnimated:YES];
+    }
+}
+
 - (void)backAction {
     [self.myWebView stopLoading];
     if (_backRootView) {
@@ -326,7 +301,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
 - (void)userContentController:(WKUserContentController *)userContentController
       didReceiveScriptMessage:(WKScriptMessage *)message {
 
-    if ([message.name isEqualToString:@"COLEXIU"]) {
+    if ([message.name isEqualToString:SCRIPT_NAME]) {
         NSDictionary *parm = [self convertJsonStringToNSDictionary:message.body];
         // 回到主线程
         dispatch_async(dispatch_get_main_queue(), ^{
@@ -337,8 +312,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
 
 - (void)handleScriptMessageSource:(NSDictionary *)parm {
     if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"back"]) { // 返回
-        [self.myWebView stopLoading];
-        [self.navigationController popViewControllerAnimated:YES];
+        [self backPreViewAction];
     }
     else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"goBack"]) { // 逐级返回
         [self backAction];
@@ -355,10 +329,8 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         detailCtrl.parmDic = valueDic;
         NSInteger orientation = [valueDic ks_integerValueForKey:@"orientation"];
         BOOL isLandScape = orientation == 0 ? YES : NO;
-        if (isLandScape == self.landScape) {
-            self.keepOrientation = YES;
-            detailCtrl.keepOrientation = YES;
-        }
+        detailCtrl.ks_landScape = isLandScape;
+
         [self postMessage:parm];
         [self.navigationController pushViewController:detailCtrl animated:YES];
     }
@@ -447,45 +419,6 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         //
         [self shareFunctionWithParm:parm];
     }
-    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"getNavHeight"]) { // 获取状态栏高度和 title heigt
-        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
-        [valueDic setValue:[NSNumber numberWithFloat:STATUS_GAP*2] forKey:@"navHeight"];
-        [valueDic setValue:@(44*2) forKey:@"titleHeight"];
-        [parm setValue:valueDic forKey:@"content"];
-        [self postMessage:parm];
-    }
-    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"backIconChange"]) {
-        /*
-        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
-        NSString *backColor = [valueDic ks_stringValueForKey:@"iconStyle"];
-        NSString *backImage = @"";
-        if ([backColor isEqualToString:@"black"]) {
-            backImage = @"back_black";
-        }
-        else {
-            backImage = @"back_button_white";
-        }
-        [self.webBackButton.backButton setImage:[UIImage imageNamed:backImage] forState:UIControlStateNormal];
-        // 是否隐藏按钮
-        BOOL hideButton = [valueDic ks_boolValueForKey:@"backIconHide"];
-        self.webBackButton.hidden = hideButton;
-         */
-    }
-    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"setBarStatus"]) { // 顶部是否隐藏
-        /*
-        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
-        BOOL isShow = [valueDic ks_boolValueForKey:@"status"]; // 0 隐藏 1 显示
-        self.hiddenNavBar = !isShow;
-        CGFloat navHeight = isShow ? kNaviBarHeight : 0;
-        [self.navView mas_updateConstraints:^(MASConstraintMaker *make) {
-            make.height.mas_equalTo(navHeight);
-        }];
-        
-        [self.myWebView mas_updateConstraints:^(MASConstraintMaker *make) {
-            make.top.mas_equalTo(self.view.mas_top).offset(navHeight);
-        }];
-         */
-    }
     else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"setStatusBarTextColor"]) { // 设置状态栏颜色
         NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
         BOOL whiteColor = [valueDic ks_boolValueForKey:@"statusBarTextColor"];
@@ -501,18 +434,14 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
             }
         }
     }
-    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"paymentOrder"]) {
-        NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
-        NSString *channel = [content ks_stringValueForKey:@"payChannel"];
-        if ([channel isEqualToString:@"ali_app"]) {
-            NSString *infoMessage = [content ks_stringValueForKey:@"payInfo"];
-            [KSOrderManager dealWithAliSDK:infoMessage];
-        }
-        else if ([channel isEqualToString:@"wx_app"]) {
-            NSString *infoMessage = [content ks_stringValueForKey:@"payInfo"];
-            [KSOrderManager dealWithWXSDK:infoMessage];
-        }
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"getNavHeight"]) { // 获取状态栏高度和 title heigt
+        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
+        [valueDic setValue:[NSNumber numberWithFloat:STATUS_GAP*2] forKey:@"navHeight"];
+        [valueDic setValue:@(44*2) forKey:@"titleHeight"];
+        [parm setValue:valueDic forKey:@"content"];
+        [self postMessage:parm];
     }
+    
     else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"joinChatGroup"]) {
         NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
         NSString *targetId = [valueDic ks_stringValueForKey:@"id"];
@@ -523,7 +452,6 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
             KSChatConversationViewController *ctrl = [[KSChatConversationViewController alloc] init];
             ctrl.conversation = model;
             [self.navigationController pushViewController:ctrl animated:YES];
-            
         }
         else if ([[valueDic ks_stringValueForKey:@"type"] isEqualToString:@"multi"]) { // 群聊
             if ([NSString isEmptyString:targetId]) {
@@ -554,14 +482,6 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         }];
         [self.navigationController pushViewController:ctrl animated:YES];
     }
-    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"joinLiveRoom"]) { // 进入直播间
-        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
-        NSString *roomId = [valueDic ks_stringValueForKey:@"roomId"];
-        [LOADING_MANAGER showHUD];
-        [KSEnterLiveroomManager joinLiveWithRoomId:roomId inController:(CustomNavViewController *)self.navigationController callback:^{
-            [LOADING_MANAGER removeHUD];
-        }];
-    }
     else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"savePicture"]) { // 保存图片到相册
         // 判断相册权限
         PREMISSIONTYPE albumEnable = [RecordCheckManager checkPhotoLibraryPremissionAvaiable:NO showInView:nil];
@@ -599,23 +519,83 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
         NSString *type = [valueDic ks_stringValueForKey:@"type"];
         if ([type isEqualToString:@"video"]) {
-            NSString *status = [UIScreen mainScreen].isCaptured ? @"1" : @"0";
-            NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
-            [sendParm setValue:@"getDeviceStatus" forKey:@"api"];
-            NSMutableDictionary *content = [NSMutableDictionary dictionary];
-            [content setValue:[valueDic ks_stringValueForKey:@"type"] forKey:@"type"];
-            [content setValue:[valueDic ks_stringValueForKey:@"uuid"] forKey:@"uuid"];
-            [content setValue:status forKey:@"status"];
-            [sendParm setValue:content forKey:@"content"];
-            [self postMessage:sendParm];
-            if ([status isEqualToString:@"1"]) {
-                [LOADING_MANAGER MBShowAUTOHidingInWindow:@"为了保证数据安全,请不要录屏"];
-            }
+            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+                NSString *status;
+                if ([self checkIsCaptured]) {
+                    status = @"1";
+                }
+                else {
+                    status = @"0";
+                }
+                NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
+                [sendParm setValue:@"getDeviceStatus" forKey:@"api"];
+                NSMutableDictionary *content = [NSMutableDictionary dictionary];
+                [content setValue:[valueDic ks_stringValueForKey:@"type"] forKey:@"type"];
+                [content setValue:[valueDic ks_stringValueForKey:@"uuid"] forKey:@"uuid"];
+                [content setValue:status forKey:@"status"];
+                [sendParm setValue:content forKey:@"content"];
+                [self postMessage:sendParm];
+                if ([status isEqualToString:@"1"]) {
+                    [LOADING_MANAGER MBShowAUTOHidingInWindow:@"为了保证数据安全,请不要录屏"];
+                }
+            });
         }
     }
-    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"setEventTracking"]) {
-        NSString *type = [[parm ks_dictionaryValueForKey:@"content"] ks_stringValueForKey:@"type"];
-        [USER_MANAGER sendUMEvent:type];
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"callPhone"]) {
+        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
+        NSString *phone = [valueDic ks_stringValueForKey:@"phone"];
+        [self CallPhoneWith:phone];
+    }
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"setCache"]) {
+        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
+        NSString *key = [valueDic ks_stringValueForKey:@"key"];
+        NSString *value = [valueDic ks_stringValueForKey:@"value"];
+        UserDefaultSetObjectForKey(value, key);
+    }
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"getCache"]) {
+        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
+        NSString *key = [valueDic ks_stringValueForKey:@"key"];
+        NSString *value = UserDefault(key);
+        
+        NSMutableDictionary *parm = [NSMutableDictionary dictionaryWithDictionary:valueDic];
+        [parm setValue:value forKey:@"value"];
+        NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
+        [sendParm setValue:@"getCache" forKey:@"api"];
+        [sendParm setValue:parm forKey:@"content"];
+        [self postMessage:sendParm];
+    }
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"isInstall"]) {
+        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
+        NSString *type = [valueDic ks_stringValueForKey:@"type"];
+        
+        NSURL *url = [NSURL URLWithString:type];
+        BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:url];
+        NSInteger installStatus = canOpen ? 1 : 0;
+        
+        NSMutableDictionary *parm = [NSMutableDictionary dictionaryWithDictionary:valueDic];
+        [parm setValue:@(installStatus) forKey:@"installStatus"];
+        NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
+        [sendParm setValue:@"isInstall" forKey:@"api"];
+        [sendParm setValue:parm forKey:@"content"];
+        [self postMessage:sendParm];
+    }
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"openApp"]) {
+        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
+        NSString *type = [valueDic ks_stringValueForKey:@"type"];
+        
+        NSURL *url = [NSURL URLWithString:type];
+        if ([[UIApplication sharedApplication] canOpenURL:url]) {
+            [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
+        }
+    }
+    
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"downloadApp"]) {
+        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
+        NSString *openUrl = [valueDic ks_stringValueForKey:@"url"];
+        bool can = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:openUrl]];
+        if(can){
+            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:openUrl] options:@{} completionHandler:nil];
+        }
     }
     else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"shareTripartite"]) { // 分享到微信
         [self shareToWeChat:parm];
@@ -639,12 +619,36 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         ctrl.modalPresentationStyle = UIModalPresentationFullScreen;
         [self.navigationController presentViewController:ctrl animated:YES completion:nil];
     }
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"paymentOrder"]) {
+        NSDictionary *content = [parm ks_dictionaryValueForKey:@"content"];
+        NSString *channel = [content ks_stringValueForKey:@"payChannel"];
+        if ([channel isEqualToString:@"ali_app"]) {
+            NSString *infoMessage = [content ks_stringValueForKey:@"payInfo"];
+            [KSOrderManager dealWithAliSDK:infoMessage];
+        }
+        else if ([channel isEqualToString:@"wx_app"]) {
+            NSString *infoMessage = [content ks_stringValueForKey:@"payInfo"];
+            [KSOrderManager dealWithWXSDK:infoMessage];
+        }
+    }
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"joinLiveRoom"]) { // 进入直播间
+        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
+        NSString *roomId = [valueDic ks_stringValueForKey:@"roomId"];
+        [LOADING_MANAGER showHUD];
+        [KSEnterLiveroomManager joinLiveWithRoomId:roomId inController:(CustomNavViewController *)self.navigationController callback:^{
+            [LOADING_MANAGER removeHUD];
+        }];
+    }
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"setEventTracking"]) {
+        NSString *type = [[parm ks_dictionaryValueForKey:@"content"] ks_stringValueForKey:@"type"];
+        [USER_MANAGER sendUMEvent:type];
+    }
 }
 
 - (void)videCropImage:(UIImage *)cover content:(NSDictionary *)content {
     NSData *imgData = [UIImage turnsImaegDataByImage:cover];
     NSString *fileName = @"videoCoverImage";
-
+    
     [LOADING_MANAGER showCustomLoading:@"上传中..."];
     [UPLOAD_MANAGER configBucketName:@"klx"];
     [UPLOAD_MANAGER uploadFile:imgData fileName:fileName fileSuffix:[UIImage typeForImageData:imgData] progress:^(int64_t bytesWritten, int64_t totalBytes) {
@@ -1050,14 +1054,18 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
 
 - (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *_Nullable))completionHandler
 {
-    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
-        if (challenge.previousFailureCount == 0) {
-            NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
-            completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
-        } else {
-            completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
+    
+    dispatch_queue_t queue =  dispatch_queue_create("webViewChallengeQueue", NULL);
+    dispatch_async(queue, ^{
+        if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
+            if (challenge.previousFailureCount == 0) {
+                NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
+                completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
+            } else {
+                completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
+            }
         }
-    }
+    });
 }
 
 //当因为某些问题,导致webView进程终止时触发
@@ -1186,8 +1194,9 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
 
 - (void)dealloc {
     NSLog(@"webView dealloc -----");
-    [[_myWebView configuration].userContentController removeScriptMessageHandlerForName:@"COLEXIU"];
+    [[_myWebView configuration].userContentController removeScriptMessageHandlerForName:SCRIPT_NAME];
     [_myWebView removeObserver:self forKeyPath:@"estimatedProgress"];
+    [_myWebView removeObserver:self forKeyPath:@"title"];
     [_myWebView loadHTMLString:@"" baseURL:nil];
     [_myWebView removeFromSuperview];
     _myWebView = nil;
@@ -1412,37 +1421,6 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
     return filesize;
 }
 
-- (KSWebLoadRefreshView *)errorView {
-    if (!_errorView) {
-        _errorView = [KSWebLoadRefreshView shareInstance];
-        MJWeakSelf;
-        [_errorView failViewActionCallback:^(BOOL isBack) {
-            [weakSelf hideErrorView];
-            if (isBack) {
-                [weakSelf backAction];
-            }
-            else {
-                [weakSelf loadRequest];
-            }
-        }];
-    }
-    return _errorView;
-}
-
-- (void)showErrorView {
-    if (![self.view.subviews containsObject:self.errorView]) {
-        [self.view addSubview:self.errorView];
-        [self.errorView mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.left.right.top.bottom.mas_equalTo(self.view);
-        }];
-        [self.view bringSubviewToFront:self.errorView];
-    }
-}
-- (void)hideErrorView {
-    if ([self.view.subviews containsObject:self.errorView]) {
-        [self.errorView removeFromSuperview];
-    }
-}
 
 #pragma mark - UIDocumentInteractionControllerDelegate
 -(UIViewController*)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController*)controller{
@@ -1528,6 +1506,68 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         }
     }
 }
+
+#pragma mark ---- 镜像和投屏检测
+
+- (void)captureViewTips:(NSNotification *)notification {
+    [self checkCaptured];
+}
+
+- (void)checkCaptured {
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        if ([self checkIsCaptured]) {
+            [self didCapturedView];
+        }
+    });
+}
+- (BOOL)checkIsCaptured {
+    if ([UIScreen mainScreen].isCaptured && [UIScreen screens].count < 2) {
+        return YES;
+    }
+    return NO;
+}
+
+- (void)didCapturedView {
+    
+    NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
+    [sendParm setValue:@"setVideoPlayer" forKey:@"api"];
+    NSMutableDictionary *content = [NSMutableDictionary dictionary];
+    [content setValue:@"pause" forKey:@"status"];
+    [sendParm setValue:content forKey:@"content"];
+    [self postMessage:sendParm];
+}
+
+- (KSWebLoadRefreshView *)errorView {
+    if (!_errorView) {
+        _errorView = [KSWebLoadRefreshView shareInstance];
+        MJWeakSelf;
+        [_errorView failViewActionCallback:^(BOOL isBack) {
+            [weakSelf hideErrorView];
+            if (isBack) {
+                [weakSelf backAction];
+            }
+            else {
+                [weakSelf loadRequest];
+            }
+        }];
+    }
+    return _errorView;
+}
+
+- (void)showErrorView {
+    if (![self.view.subviews containsObject:self.errorView]) {
+        [self.view addSubview:self.errorView];
+        [self.errorView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.left.right.top.bottom.mas_equalTo(self.view);
+        }];
+        [self.view bringSubviewToFront:self.errorView];
+    }
+}
+- (void)hideErrorView {
+    if ([self.view.subviews containsObject:self.errorView]) {
+        [self.errorView removeFromSuperview];
+    }
+}
 /*
 #pragma mark - Navigation
 

+ 0 - 1
KulexiuForStudent/KulexiuForStudent/Common/Base/KSVideoRecordManager.m

@@ -11,7 +11,6 @@
 #import <AssetsLibrary/AssetsLibrary.h>
 #import "TZImageManager.h"
 #import "KSVideoEditor.h"
-#import "KSUploadManager.h"
 
 @interface KSVideoRecordManager ()<AVCaptureFileOutputRecordingDelegate>
 

+ 0 - 1
KulexiuForStudent/KulexiuForStudent/Common/MediaMerge/AudioMerge/KSMediaMergeView.m

@@ -13,7 +13,6 @@
 #import "KSPlayerSliderView.h"
 #import "kSNewPlayer.h"
 #import "KSVideoPlayerView.h"
-#import "KSUploadManager.h"
 #import "KSAudioPlayAnimationView.h"
 #import "KSNewAlertView.h"
 #import "MusicPublistAlert.h"

+ 2 - 0
KulexiuForStudent/KulexiuForStudent/Common/Tools/Custom/KSMediaManager.h

@@ -7,6 +7,8 @@
 //
 
 #import <Foundation/Foundation.h>
+#import "TZImageManager.h"
+#import "UIImage+ResizeImage.h"
 
 typedef NS_ENUM(NSUInteger, MEDIATYPE) {
     MEDIATYPE_PHOTO,    // 图片

+ 0 - 3
KulexiuForStudent/KulexiuForStudent/Common/Tools/Custom/KSMediaManager.m

@@ -7,13 +7,10 @@
 //
 
 #import "KSMediaManager.h"
-#import "TZImageManager.h"
 #import <AssetsLibrary/AssetsLibrary.h>
 #import <Photos/Photos.h>
 #import "TZVideoPlayerController.h"
 #import "TZImagePickerController.h"
-#import "UIImage+ResizeImage.h"
-//#import <UIDevice+YYAdd.h>
 #import <MobileCoreServices/MobileCoreServices.h>
 #import "KSPremissionAlert.h"
 

+ 15 - 0
KulexiuForStudent/KulexiuForStudent/SwiftImportHeader.h

@@ -0,0 +1,15 @@
+//
+//  SwiftImportHeader.h
+//  KulexiuSchoolStudent
+//
+//  Created by 王智 on 2023/12/12.
+//
+
+#ifndef SwiftImportHeader_h
+#define SwiftImportHeader_h
+
+#import "KulexiuForStudent-swift.h"
+
+
+
+#endif /* SwiftImportHeader_h */

+ 20 - 0
KulexiuForStudent/KulexiuForStudent/WebViewBaseConfig.h

@@ -0,0 +1,20 @@
+//
+//  WebViewBaseConfig.h
+//  KulexiuSchoolStudent
+//
+//  Created by 王智 on 2023/12/12.
+//
+
+#ifndef WebViewBaseConfig_h
+#define WebViewBaseConfig_h
+
+#define SCRIPT_NAME (@"COLEXIU")
+#define AGENT_NAME (@"COLEXIUAPPI")
+#define AGENT_DOMAIN (@"COLEXIUSTUDENT")
+
+#import "KSPremissionAlert.h"
+#import "RecordCheckManager.h"
+
+
+
+#endif /* WebViewBaseConfig_h */