Browse Source

课件缓存

Steven 11 months ago
parent
commit
4be5ed7ed7
35 changed files with 6003 additions and 4512 deletions
  1. 26 0
      KulexiuForStudent/KulexiuForStudent.xcodeproj/project.pbxproj
  2. 2 1
      KulexiuForStudent/KulexiuForStudent.xcworkspace/xcshareddata/swiftpm/Package.resolved
  3. 8 0
      KulexiuForStudent/KulexiuForStudent/AppDelegate.h
  4. 69 1
      KulexiuForStudent/KulexiuForStudent/AppDelegate.m
  5. 3 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/BaseViewController/KSBaseViewController.h
  6. 22 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/BaseViewController/KSBaseViewController.m
  7. 37 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/CoursewareDownload/CoursewareDownloadManager.h
  8. 321 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/CoursewareDownload/CoursewareDownloadManager.m
  9. 21 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/CoursewareDownload/KnowledgePointListModel.h
  10. 135 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/CoursewareDownload/KnowledgePointListModel.m
  11. 29 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/CoursewareDownload/MaterialList.h
  12. 162 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/CoursewareDownload/MaterialList.m
  13. 2 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.h
  14. 5 1
      KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.m
  15. 1 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/WebView/KSBaseWKWebViewController.h
  16. 85 0
      KulexiuForStudent/KulexiuForStudent/Common/Base/WebView/KSBaseWKWebViewController.m
  17. 4 0
      KulexiuForStudent/KulexiuForStudent/Common/MediaMerge/AudioMerge/KSNewAlertView.m
  18. 4 4
      KulexiuForStudent/KulexiuForStudent/Common/MediaMerge/AudioMerge/KSNewAlertView.xib
  19. 2 0
      KulexiuForStudent/Podfile
  20. 15 1
      KulexiuForStudent/Podfile.lock
  21. 15 1
      KulexiuForStudent/Pods/Manifest.lock
  22. 4767 4491
      KulexiuForStudent/Pods/Pods.xcodeproj/project.pbxproj
  23. 20 0
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/xcschememanagement.plist
  24. 49 0
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-acknowledgements.markdown
  25. 67 0
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-acknowledgements.plist
  26. 4 0
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-resources.sh
  27. 1 2
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests.debug.xcconfig
  28. 1 2
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests.release.xcconfig
  29. 49 0
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent/Pods-KulexiuForStudent-acknowledgements.markdown
  30. 67 0
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent/Pods-KulexiuForStudent-acknowledgements.plist
  31. 4 0
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent/Pods-KulexiuForStudent-resources.sh
  32. 1 2
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent/Pods-KulexiuForStudent.debug.xcconfig
  33. 1 2
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent/Pods-KulexiuForStudent.release.xcconfig
  34. 2 2
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudentTests/Pods-KulexiuForStudentTests.debug.xcconfig
  35. 2 2
      KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudentTests/Pods-KulexiuForStudentTests.release.xcconfig

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

@@ -374,6 +374,9 @@
 		BC31BF322B21925700F7D538 /* WidgetSpeedView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC31BF072B21925700F7D538 /* WidgetSpeedView.m */; };
 		BC31BF332B21925700F7D538 /* WidgetBottomButtonView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC31BF092B21925700F7D538 /* WidgetBottomButtonView.xib */; };
 		BC3300062BBAB0E2003D4921 /* KSToolLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC3300052BBAB0E2003D4921 /* KSToolLibrary.framework */; };
+		BC3300182BBAB623003D4921 /* CoursewareDownloadManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3300122BBAB623003D4921 /* CoursewareDownloadManager.m */; };
+		BC3300192BBAB623003D4921 /* KnowledgePointListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3300142BBAB623003D4921 /* KnowledgePointListModel.m */; };
+		BC33001A2BBAB623003D4921 /* MaterialList.m in Sources */ = {isa = PBXBuildFile; fileRef = BC3300162BBAB623003D4921 /* MaterialList.m */; };
 		BC36A5082AB406A5002FEFB1 /* GroupOwnerTagView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC36A5072AB406A5002FEFB1 /* GroupOwnerTagView.m */; };
 		BC36A50A2AB406AB002FEFB1 /* GroupOwnerTagView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC36A5092AB406AB002FEFB1 /* GroupOwnerTagView.xib */; };
 		BC38C3E82AF893B400ABFCC2 /* KSPlayerView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC38C3D52AF893B300ABFCC2 /* KSPlayerView.m */; };
@@ -1641,6 +1644,12 @@
 		BC31BF0B2B21925700F7D538 /* WidgetFunctionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WidgetFunctionView.h; sourceTree = "<group>"; };
 		BC31BF0C2B21925700F7D538 /* WidgetDotView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WidgetDotView.h; sourceTree = "<group>"; };
 		BC3300052BBAB0E2003D4921 /* KSToolLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = KSToolLibrary.framework; sourceTree = "<group>"; };
+		BC3300112BBAB623003D4921 /* CoursewareDownloadManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoursewareDownloadManager.h; sourceTree = "<group>"; };
+		BC3300122BBAB623003D4921 /* CoursewareDownloadManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoursewareDownloadManager.m; sourceTree = "<group>"; };
+		BC3300132BBAB623003D4921 /* KnowledgePointListModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KnowledgePointListModel.h; sourceTree = "<group>"; };
+		BC3300142BBAB623003D4921 /* KnowledgePointListModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KnowledgePointListModel.m; sourceTree = "<group>"; };
+		BC3300152BBAB623003D4921 /* MaterialList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MaterialList.h; sourceTree = "<group>"; };
+		BC3300162BBAB623003D4921 /* MaterialList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MaterialList.m; sourceTree = "<group>"; };
 		BC36A5062AB406A5002FEFB1 /* GroupOwnerTagView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GroupOwnerTagView.h; sourceTree = "<group>"; };
 		BC36A5072AB406A5002FEFB1 /* GroupOwnerTagView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GroupOwnerTagView.m; sourceTree = "<group>"; };
 		BC36A5092AB406AB002FEFB1 /* GroupOwnerTagView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GroupOwnerTagView.xib; sourceTree = "<group>"; };
@@ -3442,6 +3451,7 @@
 		2779350B27E324A40010E277 /* Base */ = {
 			isa = PBXGroup;
 			children = (
+				BC3300172BBAB623003D4921 /* CoursewareDownload */,
 				BC3A55752BAA8479002E1616 /* AlertView */,
 				BC3A55742BAA841A002E1616 /* NavigationController */,
 				BC3A55762BAA84B8002E1616 /* TabbarController */,
@@ -4365,6 +4375,19 @@
 			path = RoundSlider;
 			sourceTree = "<group>";
 		};
+		BC3300172BBAB623003D4921 /* CoursewareDownload */ = {
+			isa = PBXGroup;
+			children = (
+				BC3300112BBAB623003D4921 /* CoursewareDownloadManager.h */,
+				BC3300122BBAB623003D4921 /* CoursewareDownloadManager.m */,
+				BC3300132BBAB623003D4921 /* KnowledgePointListModel.h */,
+				BC3300142BBAB623003D4921 /* KnowledgePointListModel.m */,
+				BC3300152BBAB623003D4921 /* MaterialList.h */,
+				BC3300162BBAB623003D4921 /* MaterialList.m */,
+			);
+			path = CoursewareDownload;
+			sourceTree = "<group>";
+		};
 		BC38C3CC2AF892FB00ABFCC2 /* MediaMerge */ = {
 			isa = PBXGroup;
 			children = (
@@ -7033,6 +7056,7 @@
 				BCD457AB286469600010B493 /* PublicNoticeView.m in Sources */,
 				BC40B9FE281177BD00DEC0D1 /* HomeInformationCell.m in Sources */,
 				2779354D27E324A70010E277 /* KSGifRefreshFooter.m in Sources */,
+				BC3300182BBAB623003D4921 /* CoursewareDownloadManager.m in Sources */,
 				BC119288280FB3B100A716F7 /* KSStarView.m in Sources */,
 				275FA22F27E7356B00CFEA2E /* ShopMallViewController.m in Sources */,
 				BCB6347227F6D29600ACFDCF /* KSChatInputView.m in Sources */,
@@ -7101,6 +7125,7 @@
 				BC494A77286952B500CCD343 /* MusicRoomDetailViewController.m in Sources */,
 				BC106C0E2A933829000759A9 /* TXLiveMessageChatBan.m in Sources */,
 				BC8C2C602823F57100FBA5D5 /* AddressBottomView.m in Sources */,
+				BC3300192BBAB623003D4921 /* KnowledgePointListModel.m in Sources */,
 				BCC0F6B42A8CDD4000C4EFA4 /* KSRemoteUserManager.m in Sources */,
 				BC106C072A933829000759A9 /* TXLiveMessageLikeCount.m in Sources */,
 				BCBFDF46281159990052AFE5 /* HomeHotAlbumView.m in Sources */,
@@ -7322,6 +7347,7 @@
 				BC106C0D2A933829000759A9 /* TXLiveMessageClose.m in Sources */,
 				BC542E3B284079D600633781 /* UserAuthViewController.m in Sources */,
 				BC89AC132AB0843E00B077AF /* TenantHotMusicView.m in Sources */,
+				BC33001A2BBAB623003D4921 /* MaterialList.m in Sources */,
 				277935B527E324A90010E277 /* FSCalendarDelegationFactory.m in Sources */,
 				BC11921C280ED6A900A716F7 /* NewClassPopView.m in Sources */,
 				BCA193B8282B6094004A585D /* RecentCourseModel.m in Sources */,

+ 2 - 1
KulexiuForStudent/KulexiuForStudent.xcworkspace/xcshareddata/swiftpm/Package.resolved

@@ -1,4 +1,5 @@
 {
+  "originHash" : "a837f8bf89850bead33f45d5daae366332606889619596429a3c91b8a957e646",
   "pins" : [
     {
       "identity" : "audiokit",
@@ -37,5 +38,5 @@
       }
     }
   ],
-  "version" : 2
+  "version" : 3
 }

+ 8 - 0
KulexiuForStudent/KulexiuForStudent/AppDelegate.h

@@ -10,6 +10,7 @@
 #import "LoginViewController.h"
 #import "CustomNavViewController.h"
 #import "CustomTabBarController.h"
+#import <HTTPServer.h>
 
 @interface AppDelegate : UIResponder <UIApplicationDelegate>
 
@@ -28,6 +29,13 @@
 
 @property (nonatomic, strong) NSMutableDictionary *outLinkParm;
 
+/**本地服务器*/
+@property (strong, nonatomic) HTTPServer *httpServer;
+/**是否启动了本地服务器*/
+@property(nonatomic,assign)BOOL isServiceStart;
+
+@property (nonatomic, strong) NSString *serverPort;
+
 - (void)showMemoAlert;
 
 - (void)initTableBar;

+ 69 - 1
KulexiuForStudent/KulexiuForStudent/AppDelegate.m

@@ -143,6 +143,8 @@
     [self registerRemoteNotification:application];
 
     [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[UIDocumentBrowserViewController class]]].tintColor = CLIENT_THEMECOLOR;
+    [self openServer];
+
     return YES;
 }
 
@@ -419,6 +421,10 @@ didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
     
     // 退到后台发送消息
     [[NSNotificationCenter defaultCenter] postNotificationName:@"appEnterBackground" object:nil];
+    if (_isServiceStart){//停止本地服务器
+        [self stopServer];
+    }
+    
 }
 - (void)quitClassRoom {
     [[NSNotificationCenter defaultCenter] postNotificationName:@"backgroundQuit" object:nil];
@@ -437,11 +443,16 @@ didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
 
     // 退到后台发送消息
     [[NSNotificationCenter defaultCenter] postNotificationName:@"appEnterForeground" object:nil];
+    if (!_isServiceStart){
+        _isServiceStart = [self startServer];
+    }
 }
 
 - (void)checkConnectionStatus {
     BOOL isConnected = [TXIM_LINSENTER isCurrentUserLoginIM];
-    if (isConnected == NO) { // 连接失败或未连接 需要重新连接
+    NSString *token = UserDefault(TokenKey);
+
+    if (isConnected == NO && ![NSString isEmptyString:token]) { // 连接失败或未连接 需要重新连接
         [USER_MANAGER checkTokenEnableConnectIM];
     }
 }
@@ -938,4 +949,61 @@ didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
 
 }
 
+- (void)openServer {//开启本地服务器
+    self.httpServer = [[HTTPServer alloc]init];
+    [self.httpServer setType:@"_http._tcp."];
+    [self.httpServer setPort:6040];
+    NSString *webPath = [self getCourewareSavePath];
+    
+    NSFileManager *fileManager = [[NSFileManager alloc] init];
+    NSLog(@"%@",webPath);
+    
+    if (![fileManager fileExistsAtPath:webPath]){
+        NSLog(@"File path error!");
+    }else{
+        [self.httpServer setDocumentRoot:webPath];
+        NSLog(@"服务器路径:%@", webPath);
+        self.isServiceStart = [self startServer];
+    }
+    
+}
+
+
+- (NSString *)getCourewareSavePath {
+    //  在Documents目录下创建一个名为CoursewarePath的文件夹
+    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"CoursewarePath"];
+    
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    BOOL isDir = FALSE;
+    BOOL isDirExist = [fileManager fileExistsAtPath:path isDirectory:&isDir];
+    if(!(isDirExist && isDir)) {
+        BOOL bCreateDir = [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
+        if(!bCreateDir){
+            NSLog(@"创建文件夹失败!");
+        }
+//        NSLog(@"创建文件夹成功,文件路径%@",path);
+    }
+    return path;
+}
+
+- (BOOL)startServer {//启动服务
+    BOOL ret = NO;
+    NSError *error = nil;
+    if([self.httpServer start:&error]){
+        NSLog(@"HTTP服务器启动成功端口号为: %hu", [_httpServer listeningPort]);
+        self.serverPort = [NSString stringWithFormat:@"%d",[self.httpServer listeningPort]];
+        ret = YES;
+    }else{
+        NSLog(@"启动HTTP服务器出错: %@", error);
+    }
+    return ret;
+}
+
+- (void)stopServer{//停止服务
+    if (self.httpServer != nil){
+        [self.httpServer stop];
+        self.isServiceStart = NO;
+    }
+}
+
 @end

+ 3 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/BaseViewController/KSBaseViewController.h

@@ -60,6 +60,9 @@ NS_ASSUME_NONNULL_BEGIN
 -(UIImage *)imageCompressForSize:(UIImage *)sourceImage targetSize:(CGSize)size;
 -(BOOL) isConnectionAvailable;
 
+// 判断当前是否Wi-Fi环境
+- (BOOL)isWiFiEnable;
+
 - (void)backAction; // 返回
 -(void)allocTitle:(NSString*)Ntitle withColor:(UIColor *)color;
 

+ 22 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/BaseViewController/KSBaseViewController.m

@@ -137,6 +137,28 @@
     leftButton.tintColor = HexRGB(0x000000);
     self.navigationItem.leftBarButtonItem = leftButton;
 }
+
+// 判断当前是否Wi-Fi环境
+- (BOOL)isWiFiEnable {
+    BOOL isWiFi = NO;
+    Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];
+    switch ([reach currentReachabilityStatus]) {
+        case NotReachable:
+            isWiFi = NO;
+            //NSLog(@"notReachable");
+            break;
+        case ReachableViaWiFi:
+            isWiFi = YES;
+            //NSLog(@"WIFI");
+            break;
+        case ReachableViaWWAN:
+            isWiFi = NO;
+            //NSLog(@"3G");
+            break;
+    }
+    return isWiFi;
+}
+
 - (void)backAction {
     [self.view endEditing:YES];
     // 根据需要返回到不同页面

+ 37 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/CoursewareDownload/CoursewareDownloadManager.h

@@ -0,0 +1,37 @@
+//
+//  CoursewareDownloadManager.h
+//  GuanYueTeamTeacher
+//
+//  Created by 王智 on 2023/1/10.
+//
+
+#import <Foundation/Foundation.h>
+
+#define COURSEWARE_MANAGER ([CoursewareDownloadManager shareInstance])
+
+NS_ASSUME_NONNULL_BEGIN
+// downloadStatus:1下载中 2下载完成 3下载失败,
+// progress:0-100取值范围
+typedef void(^CoursewareDownloadCallback)(NSDictionary *sendParm);
+
+typedef void(^CoursewareCacheCallback)(NSDictionary *parm);
+
+@interface CoursewareDownloadManager : NSObject
+
+@property (nonatomic, strong) NSString *lessonCoursewareDetailId;
+
+@property (nonatomic, assign) BOOL isDownloading;
+
++ (instancetype)shareInstance;
+
+- (void)checkCourseCacheStatus:(NSDictionary *)parm callback:(CoursewareCacheCallback)callback;
+
+- (void)downloadCourseWithParm:(NSDictionary *)parm callback:(CoursewareDownloadCallback)callback;
+
+- (NSString *)queryFileUrlWithParm:(NSDictionary *)parm;
+
+- (void)cancleDownloadCourseware;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 321 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/CoursewareDownload/CoursewareDownloadManager.m

@@ -0,0 +1,321 @@
+//
+//  CoursewareDownloadManager.m
+//  GuanYueTeamTeacher
+//
+//  Created by 王智 on 2023/1/10.
+//
+
+#import "CoursewareDownloadManager.h"
+#import "KnowledgePointListModel.h"
+
+@interface CoursewareDownloadManager ()
+
+@property (nonatomic, copy) CoursewareDownloadCallback callback;
+
+@property (nonatomic, strong) NSMutableArray *knowledgePointArray;
+
+@property (nonatomic, strong) NSMutableArray *undownloadFileArray;
+
+@property (nonatomic, assign) NSInteger currentSuccessIndex;
+
+@property (nonatomic, assign) NSInteger totalSouceCount;
+
+@property (nonatomic, copy) CoursewareCacheCallback cacheCallback;
+
+@property (nonatomic, copy) NSMutableDictionary *lessonCoursewareParm;
+
+@property (nonatomic, assign) float singleFileRate;
+
+@property (nonatomic, assign) BOOL isCancelDownload; // 是否取消下载
+
+@end
+
+@implementation CoursewareDownloadManager
+
++ (instancetype)shareInstance {
+    static CoursewareDownloadManager *manager = nil;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        manager = [[CoursewareDownloadManager alloc] init];
+    });
+    return manager;
+}
+
+#pragma mark ---- 检测缓存
+- (void)checkCourseCacheStatus:(NSDictionary *)parm callback:(CoursewareCacheCallback)callback {
+    if (callback) {
+        self.cacheCallback = callback;
+    }
+    [self checkCacheWithParm:parm];
+}
+
+- (void)checkCacheWithParm:(NSDictionary *)parm {
+    NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
+    [sendParm setValue:[parm ks_stringValueForKey:@"api"] forKey:@"api"];
+    
+    NSMutableDictionary *content = [NSMutableDictionary dictionaryWithDictionary:[parm ks_dictionaryValueForKey:@"content"]];
+    NSMutableArray *courewareArray = [NSMutableArray arrayWithArray:[content ks_arrayValueForKey:@"data"]];
+    NSMutableArray *sourceArray = [NSMutableArray array];
+    for (NSDictionary *parm in courewareArray) {
+        NSArray *knowledgePointList = [parm ks_arrayValueForKey:@"knowledgePointList"];
+        
+        NSMutableArray *listArray = [NSMutableArray array];
+        for (NSDictionary *sourceParm in knowledgePointList) {
+            KnowledgePointListModel *model = [[KnowledgePointListModel alloc] initWithDictionary:sourceParm];
+            [listArray addObject:model];
+        }
+        BOOL isCache = [self checkPointIsCache:listArray];
+        NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:parm];
+        [dic setValue:@(isCache) forKey:@"hasCache"];
+        [sourceArray addObject:dic];
+    }
+    [content setValue:sourceArray forKey:@"data"];
+    [sendParm setValue:content forKey:@"content"];
+    
+    if (self.cacheCallback) {
+        self.cacheCallback(sendParm);
+    }
+}
+
+// 判断当前课件是否缓存
+- (BOOL)checkPointIsCache:(NSArray *)listArray {
+    
+    for (KnowledgePointListModel *model in listArray) {
+        for (MaterialList *listModel in model.materialList) {
+            if ([listModel.type isEqualToString:@"SONG"]) { // 曲目
+                
+            }
+            else { // 下载图片和视频
+                NSString *url = listModel.content;
+                NSString *fileName = [url getUrlFileName];
+                if ([self isNomalFile:fileName]) {
+                    fileName = [NSString stringWithFormat:@"%@%@%@", listModel.materialListIdentifier, [listModel.updateTime replaceAll:@" " WithString:@""],fileName];
+                    NSString *filePath = [[self getCourewareSavePath] stringByAppendingPathComponent:fileName];
+                    BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath];
+                    if (isExist == NO) {
+                        return NO;
+                    }
+                }
+            }
+        }
+    }
+    return YES;
+}
+
+
+#pragma mark ---- 下载
+- (void)downloadCourseWithParm:(NSDictionary *)parm callback:(CoursewareDownloadCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+    if (self.isDownloading) {
+        return;
+    }
+    self.currentSuccessIndex = 0;
+    self.totalSouceCount = 0;
+    [self downloadCourseMessage:parm];
+}
+
+- (void)downloadCourseMessage:(NSDictionary *)parm {
+    self.knowledgePointArray = [NSMutableArray array];
+    NSMutableDictionary *content = [NSMutableDictionary dictionaryWithDictionary:[parm ks_dictionaryValueForKey:@"content"]];
+    NSDictionary *coureParm = [content ks_dictionaryValueForKey:@"data"];
+    self.lessonCoursewareDetailId = [coureParm ks_stringValueForKey:@"lessonCoursewareDetailId"];
+    NSArray *sourceArray = [coureParm ks_arrayValueForKey:@"knowledgePointList"];
+    for (NSDictionary *parm in sourceArray) {
+        KnowledgePointListModel *model = [[KnowledgePointListModel alloc] initWithDictionary:parm];
+        [self.knowledgePointArray addObject:model];
+    }
+    
+    [self checkCoursewareStatus];
+}
+
+- (void)checkCoursewareStatus {
+    
+    self.undownloadFileArray = [NSMutableArray array];
+    for (KnowledgePointListModel *model in self.knowledgePointArray) {
+        for (MaterialList *listModel in model.materialList) {
+            if ([listModel.type isEqualToString:@"SONG"]) { // 曲目
+                
+            }
+            else { // 下载图片和视频
+                self.totalSouceCount++;
+                NSString *url = listModel.content;
+                NSString *fileName = [url getUrlFileName];
+                if ([self isNomalFile:fileName]) {
+                    fileName = [NSString stringWithFormat:@"%@%@%@", listModel.materialListIdentifier, [listModel.updateTime replaceAll:@" " WithString:@""],fileName];
+                    NSString *filePath = [[self getCourewareSavePath] stringByAppendingPathComponent:fileName];
+                    BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath];
+                    if (isExist == NO) {
+                        [self.undownloadFileArray addObject:listModel];
+                    }
+                }
+            }
+        }
+    }
+    self.currentSuccessIndex = self.totalSouceCount - self.undownloadFileArray.count;
+    self.singleFileRate =  1.0 / self.totalSouceCount * 100;
+    
+    [self downloadAllSourceFile];
+}
+
+- (BOOL)isNomalFile:(NSString *)fileName {
+    if ([fileName hasSuffix:@".png"] || [fileName hasSuffix:@".jpg"] || [fileName hasSuffix:@".jepg"] || [fileName hasSuffix:@".mp4"] || [fileName hasSuffix:@".flv"] || [fileName hasSuffix:@".avi"] || [fileName hasSuffix:@".mov"]) {
+        return YES;
+    }
+    return NO;
+}
+
+#pragma mark ---- 课件其他资源
+- (void)downloadAllSourceFile {
+    [self downloadFileIndex:0];
+}
+
+- (NSMutableDictionary *)configParmWithSource:(NSInteger)status progress:(NSInteger)progress {
+    NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
+    [sendParm setValue:@"downloadCoursewareToCache" forKey:@"api"];
+    NSMutableDictionary *content = [NSMutableDictionary dictionary];
+    [content setValue:@(status) forKey:@"downloadStatus"];
+    [content setValue:@(progress) forKey:@"progress"];
+    [content setValue:self.lessonCoursewareDetailId forKey:@"lessonCoursewareDetailId"];
+    [sendParm setValue:content forKey:@"content"];
+    return sendParm;
+}
+
+- (void)downloadFileIndex:(NSInteger)fileIndex {
+    if (self.isCancelDownload) {
+        self.isCancelDownload = NO;
+        self.isDownloading = NO;
+        return;
+    }
+    if (self.undownloadFileArray.count == 0) {
+        NSDictionary *parm = [self configParmWithSource:2 progress:100];
+        if (self.callback) {
+            self.callback(parm);
+        }
+        self.isDownloading = NO;
+        return;
+    }
+    else if (fileIndex > self.undownloadFileArray.count - 1) {
+        if (self.callback) {
+            NSInteger rate = self.currentSuccessIndex * 100 / self.totalSouceCount;
+            if (self.undownloadFileArray.count == 0) {
+                rate = 100;
+            }
+            NSDictionary *parm = [self configParmWithSource:2 progress:rate];
+            if (self.callback) {
+                self.callback(parm);
+            }
+            self.isDownloading = NO;
+        }
+        return;
+    }
+    self.isDownloading = YES;
+    MaterialList *model = self.undownloadFileArray[fileIndex];
+    NSString *url = model.content;
+    [KSNetworkingManager downloadFileRequestWithFileUrl:url progress:^(int64_t bytesRead, int64_t totalBytes) {
+        double progress = bytesRead * 1.0 / totalBytes;
+        NSLog(@"%f",progress);
+        NSInteger rate = (NSInteger) (progress * self.singleFileRate);
+        NSInteger preDownloadRate = self.currentSuccessIndex * 100 / self.totalSouceCount;
+        NSInteger totalRate = rate + preDownloadRate;
+        if (totalRate > 100) {
+            totalRate = 100;
+        }
+        NSDictionary *parm = [self configParmWithSource:1 progress:totalRate];
+        if (self.callback) {
+            self.callback(parm);
+        }
+    } success:^(NSURL * _Nonnull fileUrl) {
+        [self savePathWithLocalPath:[fileUrl resourceSpecifier] sourceModel:model fileIndex:fileIndex];
+
+    } faliure:^(NSError * _Nonnull error) {
+        NSInteger nextIndex = fileIndex + 1;
+        [self downloadFileIndex:nextIndex];
+    }];
+}
+
+- (void)savePathWithLocalPath:(NSString *)localPath sourceModel:(MaterialList *)model fileIndex:(NSInteger)fileIndex {
+    NSString *url = model.content;
+    NSString *fileName = [NSString stringWithFormat:@"%@%@%@", model.materialListIdentifier, [model.updateTime replaceAll:@" " WithString:@""],[url getUrlFileName]];
+    NSString *filePath = [[self getCourewareSavePath] stringByAppendingPathComponent:fileName];
+    NSError *error;
+    
+    BOOL isSuccess = [[NSFileManager defaultManager] moveItemAtPath:localPath toPath:filePath error:&error];
+    if (isSuccess) {
+        self.currentSuccessIndex++;
+        NSLog(@"rename success");
+        // 如果旧文件存在 就删除
+        if ([[NSFileManager defaultManager] fileExistsAtPath:localPath]) {
+            BOOL isDelSuccess = [[NSFileManager defaultManager] removeItemAtPath:localPath error:nil];
+            if (isDelSuccess) {
+                NSLog(@"remove success");
+            } else {
+                NSLog(@"remove fail");
+            }
+        }
+        
+        if (self.callback) {
+            NSInteger rate = self.currentSuccessIndex * 100 / self.totalSouceCount;
+            NSDictionary *parm = [self configParmWithSource:1 progress:rate];
+            if (self.callback) {
+                self.callback(parm);
+            }
+        }
+        NSInteger nextIndex = fileIndex + 1;
+        [self downloadFileIndex:nextIndex];
+    }else{
+        NSLog(@"rename fail");
+        NSInteger nextIndex = fileIndex + 1;
+        [self downloadFileIndex:nextIndex];
+    }
+}
+
+- (NSString *)getCourewareSavePath {
+    //  在Documents目录下创建一个名为CoursewarePath的文件夹
+    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"CoursewarePath"];
+    
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    BOOL isDir = FALSE;
+    BOOL isDirExist = [fileManager fileExistsAtPath:path isDirectory:&isDir];
+    if(!(isDirExist && isDir)) {
+        BOOL bCreateDir = [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
+        if(!bCreateDir){
+            NSLog(@"创建文件夹失败!");
+        }
+//        NSLog(@"创建文件夹成功,文件路径%@",path);
+    }
+    return path;
+}
+
+
+- (NSString *)queryFileUrlWithParm:(NSDictionary *)parm {
+    NSString *locaPath = @"";
+    NSString *url = [parm ks_stringValueForKey:@"url"];
+    NSString *fileName = [NSString stringWithFormat:@"%@%@%@", [parm ks_stringValueForKey:@"materialId"], [[parm ks_stringValueForKey:@"updateTime"] replaceAll:@" " WithString:@""],[url getUrlFileName]];
+    locaPath = [[self getCourewareSavePath] stringByAppendingPathComponent:fileName];
+    BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:locaPath];
+    if (isExist) {
+        return locaPath;
+    }
+    else {
+        return @"";
+    }
+}
+
+- (void)cancleDownloadCourseware {
+
+    self.isCancelDownload = YES;
+    [KSNetworkingManager cancelAllRequest];
+}
+
+
+#pragma mark --- lazying
+- (NSMutableArray *)knowledgePointArray {
+    if (!_knowledgePointArray) {
+        _knowledgePointArray = [NSMutableArray array];
+    }
+    return _knowledgePointArray;
+}
+
+@end

+ 21 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/CoursewareDownload/KnowledgePointListModel.h

@@ -0,0 +1,21 @@
+//
+//  KnowledgePointListModel.h
+//
+//  Created by Steven  on 2023/1/10
+//  Copyright (c) 2023 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "MaterialList.h"
+
+@interface KnowledgePointListModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *internalBaseClassIdentifier;
+@property (nonatomic, strong) NSString *name;
+@property (nonatomic, strong) NSArray *materialList;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 135 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/CoursewareDownload/KnowledgePointListModel.m

@@ -0,0 +1,135 @@
+//
+//  KnowledgePointListModel.m
+//
+//  Created by Steven  on 2023/1/10
+//  Copyright (c) 2023 __MyCompanyName__. All rights reserved.
+//
+
+#import "KnowledgePointListModel.h"
+
+
+NSString *const kKnowledgePointListModelId = @"id";
+NSString *const kKnowledgePointListModelName = @"name";
+NSString *const kKnowledgePointListModelMaterialList = @"materialList";
+
+
+@interface KnowledgePointListModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation KnowledgePointListModel
+
+@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize name = _name;
+@synthesize materialList = _materialList;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
+{
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict
+{
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if(self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.internalBaseClassIdentifier = [self objectOrNilForKey:kKnowledgePointListModelId fromDictionary:dict];
+            self.name = [self objectOrNilForKey:kKnowledgePointListModelName fromDictionary:dict];
+    NSObject *receivedMaterialList = [dict objectForKey:kKnowledgePointListModelMaterialList];
+    NSMutableArray *parsedMaterialList = [NSMutableArray array];
+    if ([receivedMaterialList isKindOfClass:[NSArray class]]) {
+        for (NSDictionary *item in (NSArray *)receivedMaterialList) {
+            if ([item isKindOfClass:[NSDictionary class]]) {
+                [parsedMaterialList addObject:[MaterialList modelObjectWithDictionary:item]];
+            }
+       }
+    } else if ([receivedMaterialList isKindOfClass:[NSDictionary class]]) {
+       [parsedMaterialList addObject:[MaterialList modelObjectWithDictionary:(NSDictionary *)receivedMaterialList]];
+    }
+
+    self.materialList = [NSArray arrayWithArray:parsedMaterialList];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.internalBaseClassIdentifier forKey:kKnowledgePointListModelId];
+    [mutableDict setValue:self.name forKey:kKnowledgePointListModelName];
+    NSMutableArray *tempArrayForMaterialList = [NSMutableArray array];
+    for (NSObject *subArrayObject in self.materialList) {
+        if([subArrayObject respondsToSelector:@selector(dictionaryRepresentation)]) {
+            // This class is a model object
+            [tempArrayForMaterialList addObject:[subArrayObject performSelector:@selector(dictionaryRepresentation)]];
+        } else {
+            // Generic object
+            [tempArrayForMaterialList addObject:subArrayObject];
+        }
+    }
+    [mutableDict setValue:[NSArray arrayWithArray:tempArrayForMaterialList] forKey:kKnowledgePointListModelMaterialList];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description 
+{
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
+{
+    id object = [dict objectForKey:aKey];
+    if ([object isKindOfClass:[NSNumber class]]) {
+        NSNumber *number = object;
+        object = [number stringValue];
+    }
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+    self = [super init];
+
+    self.internalBaseClassIdentifier = [aDecoder decodeObjectForKey:kKnowledgePointListModelId];
+    self.name = [aDecoder decodeObjectForKey:kKnowledgePointListModelName];
+    self.materialList = [aDecoder decodeObjectForKey:kKnowledgePointListModelMaterialList];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_internalBaseClassIdentifier forKey:kKnowledgePointListModelId];
+    [aCoder encodeObject:_name forKey:kKnowledgePointListModelName];
+    [aCoder encodeObject:_materialList forKey:kKnowledgePointListModelMaterialList];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    KnowledgePointListModel *copy = [[KnowledgePointListModel alloc] init];
+    
+    if (copy) {
+
+        copy.internalBaseClassIdentifier = [self.internalBaseClassIdentifier copyWithZone:zone];
+        copy.name = [self.name copyWithZone:zone];
+        copy.materialList = [self.materialList copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 29 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/CoursewareDownload/MaterialList.h

@@ -0,0 +1,29 @@
+//
+//  MaterialList.h
+//
+//  Created by Steven  on 2023/5/14
+//  Copyright (c) 2023 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface MaterialList : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, assign) id adviseStudyTimeSecond;
+@property (nonatomic, strong) NSString *content;
+@property (nonatomic, strong) NSString *knowledgePointId;
+@property (nonatomic, strong) NSString *updateTime;
+@property (nonatomic, strong) NSString *materialListIdentifier;
+@property (nonatomic, strong) NSString *courseTypeCode;
+@property (nonatomic, strong) NSString *sn;
+@property (nonatomic, strong) NSString *type;
+@property (nonatomic, strong) NSString *name;
+@property (nonatomic, strong) NSString *knowledgePointMaterialRelationId;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 162 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/CoursewareDownload/MaterialList.m

@@ -0,0 +1,162 @@
+//
+//  MaterialList.m
+//
+//  Created by Steven  on 2023/5/14
+//  Copyright (c) 2023 __MyCompanyName__. All rights reserved.
+//
+
+#import "MaterialList.h"
+
+
+NSString *const kMaterialListAdviseStudyTimeSecond = @"adviseStudyTimeSecond";
+NSString *const kMaterialListContent = @"content";
+NSString *const kMaterialListKnowledgePointId = @"knowledgePointId";
+NSString *const kMaterialListUpdateTime = @"updateTime";
+NSString *const kMaterialListId = @"id";
+NSString *const kMaterialListCourseTypeCode = @"courseTypeCode";
+NSString *const kMaterialListSn = @"sn";
+NSString *const kMaterialListType = @"type";
+NSString *const kMaterialListName = @"name";
+NSString *const kMaterialListKnowledgePointMaterialRelationId = @"knowledgePointMaterialRelationId";
+
+
+@interface MaterialList ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation MaterialList
+
+@synthesize adviseStudyTimeSecond = _adviseStudyTimeSecond;
+@synthesize content = _content;
+@synthesize knowledgePointId = _knowledgePointId;
+@synthesize updateTime = _updateTime;
+@synthesize materialListIdentifier = _materialListIdentifier;
+@synthesize courseTypeCode = _courseTypeCode;
+@synthesize sn = _sn;
+@synthesize type = _type;
+@synthesize name = _name;
+@synthesize knowledgePointMaterialRelationId = _knowledgePointMaterialRelationId;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
+{
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict
+{
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if(self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.adviseStudyTimeSecond = [self objectOrNilForKey:kMaterialListAdviseStudyTimeSecond fromDictionary:dict];
+            self.content = [self objectOrNilForKey:kMaterialListContent fromDictionary:dict];
+            self.knowledgePointId = [self objectOrNilForKey:kMaterialListKnowledgePointId fromDictionary:dict];
+            self.updateTime = [self objectOrNilForKey:kMaterialListUpdateTime fromDictionary:dict];
+            self.materialListIdentifier = [self objectOrNilForKey:kMaterialListId fromDictionary:dict];
+            self.courseTypeCode = [self objectOrNilForKey:kMaterialListCourseTypeCode fromDictionary:dict];
+            self.sn = [self objectOrNilForKey:kMaterialListSn fromDictionary:dict];
+            self.type = [self objectOrNilForKey:kMaterialListType fromDictionary:dict];
+            self.name = [self objectOrNilForKey:kMaterialListName fromDictionary:dict];
+            self.knowledgePointMaterialRelationId = [self objectOrNilForKey:kMaterialListKnowledgePointMaterialRelationId fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.adviseStudyTimeSecond forKey:kMaterialListAdviseStudyTimeSecond];
+    [mutableDict setValue:self.content forKey:kMaterialListContent];
+    [mutableDict setValue:self.knowledgePointId forKey:kMaterialListKnowledgePointId];
+    [mutableDict setValue:self.updateTime forKey:kMaterialListUpdateTime];
+    [mutableDict setValue:self.materialListIdentifier forKey:kMaterialListId];
+    [mutableDict setValue:self.courseTypeCode forKey:kMaterialListCourseTypeCode];
+    [mutableDict setValue:self.sn forKey:kMaterialListSn];
+    [mutableDict setValue:self.type forKey:kMaterialListType];
+    [mutableDict setValue:self.name forKey:kMaterialListName];
+    [mutableDict setValue:self.knowledgePointMaterialRelationId forKey:kMaterialListKnowledgePointMaterialRelationId];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description 
+{
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
+{
+    id object = [dict objectForKey:aKey];
+    if ([object isKindOfClass:[NSNumber class]]) {
+        NSNumber *number = object;
+        object = [number stringValue];
+    }
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+    self = [super init];
+
+    self.adviseStudyTimeSecond = [aDecoder decodeObjectForKey:kMaterialListAdviseStudyTimeSecond];
+    self.content = [aDecoder decodeObjectForKey:kMaterialListContent];
+    self.knowledgePointId = [aDecoder decodeObjectForKey:kMaterialListKnowledgePointId];
+    self.updateTime = [aDecoder decodeObjectForKey:kMaterialListUpdateTime];
+    self.materialListIdentifier = [aDecoder decodeObjectForKey:kMaterialListId];
+    self.courseTypeCode = [aDecoder decodeObjectForKey:kMaterialListCourseTypeCode];
+    self.sn = [aDecoder decodeObjectForKey:kMaterialListSn];
+    self.type = [aDecoder decodeObjectForKey:kMaterialListType];
+    self.name = [aDecoder decodeObjectForKey:kMaterialListName];
+    self.knowledgePointMaterialRelationId = [aDecoder decodeObjectForKey:kMaterialListKnowledgePointMaterialRelationId];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_adviseStudyTimeSecond forKey:kMaterialListAdviseStudyTimeSecond];
+    [aCoder encodeObject:_content forKey:kMaterialListContent];
+    [aCoder encodeObject:_knowledgePointId forKey:kMaterialListKnowledgePointId];
+    [aCoder encodeObject:_updateTime forKey:kMaterialListUpdateTime];
+    [aCoder encodeObject:_materialListIdentifier forKey:kMaterialListId];
+    [aCoder encodeObject:_courseTypeCode forKey:kMaterialListCourseTypeCode];
+    [aCoder encodeObject:_sn forKey:kMaterialListSn];
+    [aCoder encodeObject:_type forKey:kMaterialListType];
+    [aCoder encodeObject:_name forKey:kMaterialListName];
+    [aCoder encodeObject:_knowledgePointMaterialRelationId forKey:kMaterialListKnowledgePointMaterialRelationId];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    MaterialList *copy = [[MaterialList alloc] init];
+    
+    if (copy) {
+
+        copy.adviseStudyTimeSecond = [self.adviseStudyTimeSecond copyWithZone:zone];
+        copy.content = [self.content copyWithZone:zone];
+        copy.knowledgePointId = [self.knowledgePointId copyWithZone:zone];
+        copy.updateTime = [self.updateTime copyWithZone:zone];
+        copy.materialListIdentifier = [self.materialListIdentifier copyWithZone:zone];
+        copy.courseTypeCode = [self.courseTypeCode copyWithZone:zone];
+        copy.sn = [self.sn copyWithZone:zone];
+        copy.type = [self.type copyWithZone:zone];
+        copy.name = [self.name copyWithZone:zone];
+        copy.knowledgePointMaterialRelationId = [self.knowledgePointMaterialRelationId copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 2 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.h

@@ -28,6 +28,8 @@ NS_ASSUME_NONNULL_BEGIN
 + (void)logoutAction;
 // 返回到登录页面
 + (void)backLoginView;
+// 取消所有请求操作
++ (void)cancelAllRequest;
 
 #pragma mark -------- CLASS REQUEST
 + (void)classroomRequest:(NSString *)method url:(NSString *)url parms:(NSDictionary *)parms success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;

+ 5 - 1
KulexiuForStudent/KulexiuForStudent/Common/Base/KSNetworkingManager.m

@@ -203,6 +203,11 @@
     [tab.selectedViewController presentViewController:navCtrl animated:YES completion:nil];
 }
 
+/// 移除所以当前请求
++ (void)cancelAllRequest {
+    [[VoNetworking sharedManager] cancleAllRequest];
+}
+
 
 // 提示信息
 + (void)showMessage:(NSString *)message {
@@ -290,7 +295,6 @@
         if (faliure) {
             faliure(error);
         }
-        [self showMessage:@"网络错误,请检查您的网络"];
     }];
 }
 

+ 1 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/WebView/KSBaseWKWebViewController.h

@@ -8,6 +8,7 @@
 #import "KSBaseViewController.h"
 #import <WebKit/WebKit.h>
 #import <KSToolLibrary/WeakWebViewScriptMessageDelegate.h>
+#import "CoursewareDownloadManager.h"
 
 NS_ASSUME_NONNULL_BEGIN
 

+ 85 - 0
KulexiuForStudent/KulexiuForStudent/Common/Base/WebView/KSBaseWKWebViewController.m

@@ -35,6 +35,8 @@
 // 错误刷新web 页面
 #import "KSWebLoadRefreshView.h"
 
+#import "KSNewAlertView.h"
+
 typedef NS_ENUM(NSInteger, CHOOSETYPE) {
     CHOOSETYPE_XML,
     CHOOSETYPE_MIDI,
@@ -71,6 +73,8 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
 
 @property (nonatomic, assign) BOOL isDownloadFile;
 
+@property (nonatomic, strong) KSNewAlertView *wifiAlert;
+
 @end
 
 @implementation KSBaseWKWebViewController
@@ -649,6 +653,87 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         NSString *type = [[parm ks_dictionaryValueForKey:@"content"] ks_stringValueForKey:@"type"];
         [USER_MANAGER sendUMEvent:type];
     }
+    // 课件相关
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"getCourseFilePath"]) { // 课件资源查询
+        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
+        NSString *localPath = [COURSEWARE_MANAGER queryFileUrlWithParm:valueDic];
+        BOOL isServiceStart = [AppDelegate shareAppDelegate].httpServer.isRunning;
+        if (![NSString isEmptyString:localPath] && isServiceStart) {
+            localPath = [[localPath componentsSeparatedByString:@"CoursewarePath/"] lastObject];
+            localPath = [NSString stringWithFormat:@"%@%@/%@",@"http://localhost:",[AppDelegate shareAppDelegate].serverPort,localPath];
+            NSMutableDictionary *contentParm = [NSMutableDictionary dictionaryWithDictionary:valueDic];
+            [contentParm setValue:localPath forKey:@"localPath"];
+            NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
+            [sendParm setValue:@"getCourseFilePath" forKey:@"api"];
+            [sendParm setValue:contentParm forKey:@"content"];
+            [self postMessage:sendParm];
+        }
+        else {
+            [self postMessage:parm];
+        }
+    }
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"checkCoursewareCache"]) {
+        MJWeakSelf;
+        [COURSEWARE_MANAGER checkCourseCacheStatus:parm callback:^(NSDictionary * _Nonnull parm) {
+            [weakSelf postMessage:parm];
+        }];
+    }
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"downloadCoursewareToCache"]) {
+        NSDictionary *valueDic = [parm ks_dictionaryValueForKey:@"content"];
+        NSString *lessonCoursewareDetailId = [[valueDic ks_dictionaryValueForKey:@"data"] ks_stringValueForKey:@"lessonCoursewareDetailId"];
+        if (COURSEWARE_MANAGER.isDownloading) {
+            if ([lessonCoursewareDetailId isEqualToString:COURSEWARE_MANAGER.lessonCoursewareDetailId]) {
+                [LOADING_MANAGER MBShowAUTOHidingInWindow:@"当前已有课件资源下载中"];
+                [self downloadWithParm:parm];
+            }
+            else {
+                [LOADING_MANAGER MBShowAUTOHidingInWindow:@"当前已有课件资源下载中"];
+                NSMutableDictionary *contentParm = [NSMutableDictionary dictionary];
+                [contentParm setValue:@(3) forKey:@"status"];
+                [contentParm setValue:@(0) forKey:@"progress"];
+                [contentParm setValue:lessonCoursewareDetailId forKey:@"lessonCoursewareDetailId"];
+
+                NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
+                [sendParm setValue:@"downloadCoursewareToCache" forKey:@"api"];
+                [sendParm setValue:contentParm forKey:@"content"];
+                [self postMessage:sendParm];
+            }
+        }
+        else {
+            if ([self isWiFiEnable] == NO) {
+                self.wifiAlert = [KSNewAlertView shareInstance];
+                MJWeakSelf;
+                [self.wifiAlert configTitle:@"提示" descMessage:@"当前非Wi-Fi环境,是否开始下载?" leftButtonTitle:@"取消" rightButtonTitle:@"确认" leftButtonAction:^{
+                    
+                } rightButtonAction:^{
+                    [weakSelf downloadWithParm:parm];
+                }];
+                [self.wifiAlert showAlert];
+            }
+            else {
+                [self downloadWithParm:parm];
+            }
+        }
+    }
+    else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"cancelDownloadCourseware"]) { // 取消下载课件
+        if (COURSEWARE_MANAGER.isDownloading) { // 如果在下载 取消
+            [COURSEWARE_MANAGER cancleDownloadCourseware];
+        }
+        NSMutableDictionary *content = [NSMutableDictionary dictionaryWithDictionary:[parm ks_dictionaryValueForKey:@"content"]];
+        [content setValue:@(YES) forKey:@"status"];
+        NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
+        [sendParm setValue:@"cancelDownloadCourseware" forKey:@"api"];
+        [sendParm setValue:content forKey:@"content"];
+        [self postMessage:sendParm];
+    }
+    
+}
+
+- (void)downloadWithParm:(NSDictionary *)parm {
+    MJWeakSelf;
+    [COURSEWARE_MANAGER downloadCourseWithParm:parm callback:^(NSDictionary * _Nonnull sendParm) {
+        [weakSelf postMessage:sendParm];
+    }];
 }
 
 - (void)videCropImage:(UIImage *)cover content:(NSDictionary *)content {

+ 4 - 0
KulexiuForStudent/KulexiuForStudent/Common/MediaMerge/AudioMerge/KSNewAlertView.m

@@ -33,6 +33,10 @@
     UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
     tapGesture.delegate = self;
     [self addGestureRecognizer:tapGesture];
+    
+    [self.leftButton setTitleColor:CLIENT_THEMECOLOR forState:UIControlStateNormal];
+    self.leftButton.layer.borderColor = CLIENT_THEMECOLOR.CGColor;
+    [self.rightButton setBackgroundColor:CLIENT_THEMECOLOR];
 }
 
 + (instancetype)shareInstance {

+ 4 - 4
KulexiuForStudent/KulexiuForStudent/Common/MediaMerge/AudioMerge/KSNewAlertView.xib

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
     <device id="retina6_12" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
@@ -55,12 +55,13 @@
                         </button>
                         <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hO7-EM-ujs">
                             <rect key="frame" x="165" y="109.33333333333337" width="135" height="40"/>
+                            <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
                             <constraints>
                                 <constraint firstAttribute="height" constant="40" id="bbj-dv-61F"/>
                             </constraints>
                             <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                             <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
-                            <state key="normal" title="确认" backgroundImage="sureButton_img"/>
+                            <state key="normal" title="确认"/>
                             <userDefinedRuntimeAttributes>
                                 <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
                                     <real key="value" value="20"/>
@@ -118,7 +119,6 @@
         </view>
     </objects>
     <resources>
-        <image name="sureButton_img" width="122" height="40"/>
         <systemColor name="systemBackgroundColor">
             <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
         </systemColor>

+ 2 - 0
KulexiuForStudent/Podfile

@@ -66,6 +66,8 @@ target 'KulexiuForStudent' do
   pod 'QCloudCOSXML/Transfer'
   
   pod 'TZImagePickerController'
+  
+  pod 'CocoaHTTPServer'
 
   target 'KulexiuForStudentTests' do
     inherit! :search_paths

+ 15 - 1
KulexiuForStudent/Podfile.lock

@@ -33,6 +33,13 @@ PODS:
   - CHIPageControl/Jaloro (0.2)
   - CHIPageControl/Paprika (0.2)
   - CHIPageControl/Puya (0.2)
+  - CocoaAsyncSocket (7.6.5)
+  - CocoaHTTPServer (2.4):
+    - CocoaAsyncSocket
+    - CocoaLumberjack
+  - CocoaLumberjack (3.8.5):
+    - CocoaLumberjack/Core (= 3.8.5)
+  - CocoaLumberjack/Core (3.8.5)
   - iOS-KS3SDK (1.0.5)
   - IQKeyboardManager (6.5.12)
   - JCore (2.7.1-noidfa)
@@ -276,6 +283,7 @@ DEPENDENCIES:
   - AlipaySDK-iOS
   - Bugly
   - CHIPageControl
+  - CocoaHTTPServer
   - iOS-KS3SDK (~> 1.0.5)
   - IQKeyboardManager
   - JCore (= 2.7.1-noidfa)
@@ -308,6 +316,9 @@ SPEC REPOS:
     - AlipaySDK-iOS
     - Bugly
     - CHIPageControl
+    - CocoaAsyncSocket
+    - CocoaHTTPServer
+    - CocoaLumberjack
     - iOS-KS3SDK
     - IQKeyboardManager
     - JCore
@@ -346,6 +357,9 @@ SPEC CHECKSUMS:
   AlipaySDK-iOS: 9289d94792535cd14c5c241c720a7e981edd7035
   Bugly: b8715e6ec4004b7f7fbffab0643ba80545aee3da
   CHIPageControl: a787bf7205c9b7e7fbfc412be36c5e8636b68f86
+  CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
+  CocoaHTTPServer: 71538be9be526cf950cb4d9c9465153ea45cac99
+  CocoaLumberjack: 6a459bc897d6d80bd1b8c78482ec7ad05dffc3f0
   iOS-KS3SDK: 688f6c6a3b91af8e0bd0bd9c1e727cd5315293dd
   IQKeyboardManager: b1fd66ccf7a79095bdcc4a2735231586f744216e
   JCore: b9d49b2e5364cce65dec86056c60b1b72825893a
@@ -379,6 +393,6 @@ SPEC CHECKSUMS:
   Whiteboard: 9d5a68d3738bd0ba8cd98820c506d13108976696
   YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30
 
-PODFILE CHECKSUM: 9d52ffd7fa742aaeb012b6fb8c0483976998ff6b
+PODFILE CHECKSUM: cedb9502ced3d1195ca6fd8fa48e5b6cb6de2f1a
 
 COCOAPODS: 1.15.2

+ 15 - 1
KulexiuForStudent/Pods/Manifest.lock

@@ -33,6 +33,13 @@ PODS:
   - CHIPageControl/Jaloro (0.2)
   - CHIPageControl/Paprika (0.2)
   - CHIPageControl/Puya (0.2)
+  - CocoaAsyncSocket (7.6.5)
+  - CocoaHTTPServer (2.4):
+    - CocoaAsyncSocket
+    - CocoaLumberjack
+  - CocoaLumberjack (3.8.5):
+    - CocoaLumberjack/Core (= 3.8.5)
+  - CocoaLumberjack/Core (3.8.5)
   - iOS-KS3SDK (1.0.5)
   - IQKeyboardManager (6.5.12)
   - JCore (2.7.1-noidfa)
@@ -276,6 +283,7 @@ DEPENDENCIES:
   - AlipaySDK-iOS
   - Bugly
   - CHIPageControl
+  - CocoaHTTPServer
   - iOS-KS3SDK (~> 1.0.5)
   - IQKeyboardManager
   - JCore (= 2.7.1-noidfa)
@@ -308,6 +316,9 @@ SPEC REPOS:
     - AlipaySDK-iOS
     - Bugly
     - CHIPageControl
+    - CocoaAsyncSocket
+    - CocoaHTTPServer
+    - CocoaLumberjack
     - iOS-KS3SDK
     - IQKeyboardManager
     - JCore
@@ -346,6 +357,9 @@ SPEC CHECKSUMS:
   AlipaySDK-iOS: 9289d94792535cd14c5c241c720a7e981edd7035
   Bugly: b8715e6ec4004b7f7fbffab0643ba80545aee3da
   CHIPageControl: a787bf7205c9b7e7fbfc412be36c5e8636b68f86
+  CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
+  CocoaHTTPServer: 71538be9be526cf950cb4d9c9465153ea45cac99
+  CocoaLumberjack: 6a459bc897d6d80bd1b8c78482ec7ad05dffc3f0
   iOS-KS3SDK: 688f6c6a3b91af8e0bd0bd9c1e727cd5315293dd
   IQKeyboardManager: b1fd66ccf7a79095bdcc4a2735231586f744216e
   JCore: b9d49b2e5364cce65dec86056c60b1b72825893a
@@ -379,6 +393,6 @@ SPEC CHECKSUMS:
   Whiteboard: 9d5a68d3738bd0ba8cd98820c506d13108976696
   YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30
 
-PODFILE CHECKSUM: 9d52ffd7fa742aaeb012b6fb8c0483976998ff6b
+PODFILE CHECKSUM: cedb9502ced3d1195ca6fd8fa48e5b6cb6de2f1a
 
 COCOAPODS: 1.15.2

File diff suppressed because it is too large
+ 4767 - 4491
KulexiuForStudent/Pods/Pods.xcodeproj/project.pbxproj


+ 20 - 0
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -24,6 +24,26 @@
 			<key>isShown</key>
 			<false/>
 		</dict>
+		<key>CocoaAsyncSocket.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>CocoaHTTPServer.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>CocoaLumberjack-CocoaLumberjackPrivacy.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
+		<key>CocoaLumberjack.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+		</dict>
 		<key>IQKeyboardManager.xcscheme</key>
 		<dict>
 			<key>isShown</key>

+ 49 - 0
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-acknowledgements.markdown

@@ -78,6 +78,55 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 
+## CocoaAsyncSocket
+
+Public Domain License
+
+The CocoaAsyncSocket project is in the public domain.
+
+The original TCP version (AsyncSocket) was created by Dustin Voss in January 2003.
+Updated and maintained by Deusty LLC and the Apple development community.
+
+
+## CocoaHTTPServer
+
+Software License Agreement (BSD License)
+
+Copyright (c) 2011, Deusty, LLC
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above
+  copyright notice, this list of conditions and the
+  following disclaimer.
+
+* Neither the name of Deusty nor the names of its
+  contributors may be used to endorse or promote products
+  derived from this software without specific prior
+  written permission of Deusty, LLC.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+## CocoaLumberjack
+
+BSD 3-Clause License
+
+Copyright (c) 2010-2024, Deusty, LLC
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+3. Neither the name of Deusty nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission of Deusty, LLC.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
 ## IQKeyboardManager
 
 MIT License

+ 67 - 0
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-acknowledgements.plist

@@ -115,6 +115,73 @@ SOFTWARE.</string>
 		</dict>
 		<dict>
 			<key>FooterText</key>
+			<string>Public Domain License
+
+The CocoaAsyncSocket project is in the public domain.
+
+The original TCP version (AsyncSocket) was created by Dustin Voss in January 2003.
+Updated and maintained by Deusty LLC and the Apple development community.
+</string>
+			<key>License</key>
+			<string>public domain</string>
+			<key>Title</key>
+			<string>CocoaAsyncSocket</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Software License Agreement (BSD License)
+
+Copyright (c) 2011, Deusty, LLC
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above
+  copyright notice, this list of conditions and the
+  following disclaimer.
+
+* Neither the name of Deusty nor the names of its
+  contributors may be used to endorse or promote products
+  derived from this software without specific prior
+  written permission of Deusty, LLC.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</string>
+			<key>License</key>
+			<string>BSD</string>
+			<key>Title</key>
+			<string>CocoaHTTPServer</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>BSD 3-Clause License
+
+Copyright (c) 2010-2024, Deusty, LLC
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+3. Neither the name of Deusty nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission of Deusty, LLC.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+</string>
+			<key>License</key>
+			<string>BSD</string>
+			<key>Title</key>
+			<string>CocoaLumberjack</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
 			<string>MIT License
 
 Copyright (c) 2013-2017 Iftekhar Qurashi

+ 4 - 0
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests-resources.sh

@@ -98,6 +98,7 @@ EOM
 }
 if [[ "$CONFIGURATION" == "Debug" ]]; then
   install_resource "${PODS_ROOT}/AlipaySDK-iOS/AlipaySDK.bundle"
+  install_resource "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjackPrivacy.bundle"
   install_resource "${PODS_ROOT}/MJRefresh/MJRefresh/MJRefresh.bundle"
   install_resource "${PODS_ROOT}/RSKImageCropper/RSKImageCropper/RSKImageCropperStrings.bundle"
   install_resource "${PODS_ROOT}/TIMCommon/TIMCommon/Resources/TIMCommon.bundle"
@@ -126,6 +127,7 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then
 fi
 if [[ "$CONFIGURATION" == "DEV" ]]; then
   install_resource "${PODS_ROOT}/AlipaySDK-iOS/AlipaySDK.bundle"
+  install_resource "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjackPrivacy.bundle"
   install_resource "${PODS_ROOT}/MJRefresh/MJRefresh/MJRefresh.bundle"
   install_resource "${PODS_ROOT}/RSKImageCropper/RSKImageCropper/RSKImageCropperStrings.bundle"
   install_resource "${PODS_ROOT}/TIMCommon/TIMCommon/Resources/TIMCommon.bundle"
@@ -154,6 +156,7 @@ if [[ "$CONFIGURATION" == "DEV" ]]; then
 fi
 if [[ "$CONFIGURATION" == "TEST" ]]; then
   install_resource "${PODS_ROOT}/AlipaySDK-iOS/AlipaySDK.bundle"
+  install_resource "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjackPrivacy.bundle"
   install_resource "${PODS_ROOT}/MJRefresh/MJRefresh/MJRefresh.bundle"
   install_resource "${PODS_ROOT}/RSKImageCropper/RSKImageCropper/RSKImageCropperStrings.bundle"
   install_resource "${PODS_ROOT}/TIMCommon/TIMCommon/Resources/TIMCommon.bundle"
@@ -182,6 +185,7 @@ if [[ "$CONFIGURATION" == "TEST" ]]; then
 fi
 if [[ "$CONFIGURATION" == "Release" ]]; then
   install_resource "${PODS_ROOT}/AlipaySDK-iOS/AlipaySDK.bundle"
+  install_resource "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjackPrivacy.bundle"
   install_resource "${PODS_ROOT}/MJRefresh/MJRefresh/MJRefresh.bundle"
   install_resource "${PODS_ROOT}/RSKImageCropper/RSKImageCropper/RSKImageCropperStrings.bundle"
   install_resource "${PODS_ROOT}/TIMCommon/TIMCommon/Resources/TIMCommon.bundle"

File diff suppressed because it is too large
+ 1 - 2
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests.debug.xcconfig


File diff suppressed because it is too large
+ 1 - 2
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent-KulexiuForStudentUITests/Pods-KulexiuForStudent-KulexiuForStudentUITests.release.xcconfig


+ 49 - 0
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent/Pods-KulexiuForStudent-acknowledgements.markdown

@@ -78,6 +78,55 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 
+## CocoaAsyncSocket
+
+Public Domain License
+
+The CocoaAsyncSocket project is in the public domain.
+
+The original TCP version (AsyncSocket) was created by Dustin Voss in January 2003.
+Updated and maintained by Deusty LLC and the Apple development community.
+
+
+## CocoaHTTPServer
+
+Software License Agreement (BSD License)
+
+Copyright (c) 2011, Deusty, LLC
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above
+  copyright notice, this list of conditions and the
+  following disclaimer.
+
+* Neither the name of Deusty nor the names of its
+  contributors may be used to endorse or promote products
+  derived from this software without specific prior
+  written permission of Deusty, LLC.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+## CocoaLumberjack
+
+BSD 3-Clause License
+
+Copyright (c) 2010-2024, Deusty, LLC
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+3. Neither the name of Deusty nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission of Deusty, LLC.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
 ## IQKeyboardManager
 
 MIT License

+ 67 - 0
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent/Pods-KulexiuForStudent-acknowledgements.plist

@@ -115,6 +115,73 @@ SOFTWARE.</string>
 		</dict>
 		<dict>
 			<key>FooterText</key>
+			<string>Public Domain License
+
+The CocoaAsyncSocket project is in the public domain.
+
+The original TCP version (AsyncSocket) was created by Dustin Voss in January 2003.
+Updated and maintained by Deusty LLC and the Apple development community.
+</string>
+			<key>License</key>
+			<string>public domain</string>
+			<key>Title</key>
+			<string>CocoaAsyncSocket</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Software License Agreement (BSD License)
+
+Copyright (c) 2011, Deusty, LLC
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above
+  copyright notice, this list of conditions and the
+  following disclaimer.
+
+* Neither the name of Deusty nor the names of its
+  contributors may be used to endorse or promote products
+  derived from this software without specific prior
+  written permission of Deusty, LLC.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</string>
+			<key>License</key>
+			<string>BSD</string>
+			<key>Title</key>
+			<string>CocoaHTTPServer</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>BSD 3-Clause License
+
+Copyright (c) 2010-2024, Deusty, LLC
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+3. Neither the name of Deusty nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission of Deusty, LLC.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+</string>
+			<key>License</key>
+			<string>BSD</string>
+			<key>Title</key>
+			<string>CocoaLumberjack</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
 			<string>MIT License
 
 Copyright (c) 2013-2017 Iftekhar Qurashi

+ 4 - 0
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent/Pods-KulexiuForStudent-resources.sh

@@ -98,6 +98,7 @@ EOM
 }
 if [[ "$CONFIGURATION" == "Debug" ]]; then
   install_resource "${PODS_ROOT}/AlipaySDK-iOS/AlipaySDK.bundle"
+  install_resource "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjackPrivacy.bundle"
   install_resource "${PODS_ROOT}/MJRefresh/MJRefresh/MJRefresh.bundle"
   install_resource "${PODS_ROOT}/RSKImageCropper/RSKImageCropper/RSKImageCropperStrings.bundle"
   install_resource "${PODS_ROOT}/TIMCommon/TIMCommon/Resources/TIMCommon.bundle"
@@ -126,6 +127,7 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then
 fi
 if [[ "$CONFIGURATION" == "DEV" ]]; then
   install_resource "${PODS_ROOT}/AlipaySDK-iOS/AlipaySDK.bundle"
+  install_resource "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjackPrivacy.bundle"
   install_resource "${PODS_ROOT}/MJRefresh/MJRefresh/MJRefresh.bundle"
   install_resource "${PODS_ROOT}/RSKImageCropper/RSKImageCropper/RSKImageCropperStrings.bundle"
   install_resource "${PODS_ROOT}/TIMCommon/TIMCommon/Resources/TIMCommon.bundle"
@@ -154,6 +156,7 @@ if [[ "$CONFIGURATION" == "DEV" ]]; then
 fi
 if [[ "$CONFIGURATION" == "TEST" ]]; then
   install_resource "${PODS_ROOT}/AlipaySDK-iOS/AlipaySDK.bundle"
+  install_resource "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjackPrivacy.bundle"
   install_resource "${PODS_ROOT}/MJRefresh/MJRefresh/MJRefresh.bundle"
   install_resource "${PODS_ROOT}/RSKImageCropper/RSKImageCropper/RSKImageCropperStrings.bundle"
   install_resource "${PODS_ROOT}/TIMCommon/TIMCommon/Resources/TIMCommon.bundle"
@@ -182,6 +185,7 @@ if [[ "$CONFIGURATION" == "TEST" ]]; then
 fi
 if [[ "$CONFIGURATION" == "Release" ]]; then
   install_resource "${PODS_ROOT}/AlipaySDK-iOS/AlipaySDK.bundle"
+  install_resource "${PODS_CONFIGURATION_BUILD_DIR}/CocoaLumberjack/CocoaLumberjackPrivacy.bundle"
   install_resource "${PODS_ROOT}/MJRefresh/MJRefresh/MJRefresh.bundle"
   install_resource "${PODS_ROOT}/RSKImageCropper/RSKImageCropper/RSKImageCropperStrings.bundle"
   install_resource "${PODS_ROOT}/TIMCommon/TIMCommon/Resources/TIMCommon.bundle"

File diff suppressed because it is too large
+ 1 - 2
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent/Pods-KulexiuForStudent.debug.xcconfig


File diff suppressed because it is too large
+ 1 - 2
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudent/Pods-KulexiuForStudent.release.xcconfig


+ 2 - 2
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudentTests/Pods-KulexiuForStudentTests.debug.xcconfig

@@ -4,9 +4,9 @@ EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
 FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AlipaySDK-iOS" "${PODS_ROOT}/Bugly" "${PODS_ROOT}/TXIMSDK_Plus_iOS" "${PODS_ROOT}/TXLiteAVSDK_Professional/TXLiteAVSDK_Professional" "${PODS_XCFRAMEWORKS_BUILD_DIR}/TXLiteAVSDK_Professional/Professional"
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) ENABLE_SCENARIO_SDK
 GENERATE_INFOPLIST_FILE = YES
-HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JPush" "${PODS_ROOT}/Headers/Public/JXCategoryView" "${PODS_ROOT}/Headers/Public/JXPagingView" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/NTLBridge" "${PODS_ROOT}/Headers/Public/QCloudCOSXML" "${PODS_ROOT}/Headers/Public/QCloudCore" "${PODS_ROOT}/Headers/Public/RSKImageCropper" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SSZipArchive" "${PODS_ROOT}/Headers/Public/SocketRocket" "${PODS_ROOT}/Headers/Public/TIMCommon" "${PODS_ROOT}/Headers/Public/TUIChat" "${PODS_ROOT}/Headers/Public/TUIConversation" "${PODS_ROOT}/Headers/Public/TUICore" "${PODS_ROOT}/Headers/Public/TUIGroup" "${PODS_ROOT}/Headers/Public/TUISearch" "${PODS_ROOT}/Headers/Public/TYCyclePagerView" "${PODS_ROOT}/Headers/Public/TZImagePickerController" "${PODS_ROOT}/Headers/Public/Whiteboard" "${PODS_ROOT}/Headers/Public/YYModel" "${PODS_ROOT}/Headers/Public/iOS-KS3SDK" "${PODS_ROOT}/Headers/Public/lottie-ios" ${PODS_ROOT}/TXIMSDK_Plus_iOS/ImSDK_Plus.framework/Headers/, ${PODS_ROOT}/TXIMSDK_Plus_iOS/ImSDK_Plus.framework/cpluscplus/include/ ${PODS_ROOT}/TXLiteAVSDK_Professional/TXLiteAVSDK_Professional/TXLiteAVSDK_Professional.xcframework/ios-arm64_armv7/TXLiteAVSDK_Professional.framework/Headers/
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/CocoaAsyncSocket" "${PODS_ROOT}/Headers/Public/CocoaHTTPServer" "${PODS_ROOT}/Headers/Public/CocoaLumberjack" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JPush" "${PODS_ROOT}/Headers/Public/JXCategoryView" "${PODS_ROOT}/Headers/Public/JXPagingView" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/NTLBridge" "${PODS_ROOT}/Headers/Public/QCloudCOSXML" "${PODS_ROOT}/Headers/Public/QCloudCore" "${PODS_ROOT}/Headers/Public/RSKImageCropper" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SSZipArchive" "${PODS_ROOT}/Headers/Public/SocketRocket" "${PODS_ROOT}/Headers/Public/TIMCommon" "${PODS_ROOT}/Headers/Public/TUIChat" "${PODS_ROOT}/Headers/Public/TUIConversation" "${PODS_ROOT}/Headers/Public/TUICore" "${PODS_ROOT}/Headers/Public/TUIGroup" "${PODS_ROOT}/Headers/Public/TUISearch" "${PODS_ROOT}/Headers/Public/TYCyclePagerView" "${PODS_ROOT}/Headers/Public/TZImagePickerController" "${PODS_ROOT}/Headers/Public/Whiteboard" "${PODS_ROOT}/Headers/Public/YYModel" "${PODS_ROOT}/Headers/Public/iOS-KS3SDK" "${PODS_ROOT}/Headers/Public/lottie-ios" "$(SDKROOT)/usr/include/libxml2" ${PODS_ROOT}/TXIMSDK_Plus_iOS/ImSDK_Plus.framework/Headers/, ${PODS_ROOT}/TXIMSDK_Plus_iOS/ImSDK_Plus.framework/cpluscplus/include/ ${PODS_ROOT}/TXLiteAVSDK_Professional/TXLiteAVSDK_Professional/TXLiteAVSDK_Professional.xcframework/ios-arm64_armv7/TXLiteAVSDK_Professional.framework/Headers/
 OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/CHIPageControl/CHIPageControl.modulemap" -fmodule-map-file="${PODS_ROOT}/Headers/Public/SSZipArchive/SSZipArchive.modulemap" -fmodule-map-file="${PODS_ROOT}/Headers/Public/TIMCommon/TIMCommon.modulemap" -fmodule-map-file="${PODS_ROOT}/Headers/Public/TUICore/TUICore.modulemap"
-OTHER_LDFLAGS = $(inherited) -l"c++" -l"iconv" -l"icucore" -l"resolv" -l"sqlite3" -l"stdc++" -l"z" -framework "AVFoundation" -framework "AVKit" -framework "Accelerate" -framework "AssetsLibrary" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreMotion" -framework "CoreServices" -framework "CoreTelephony" -framework "CoreText" -framework "Foundation" -framework "GLKit" -framework "ImSDK_Plus" -framework "ImageIO" -framework "MetalKit" -framework "Photos" -framework "PhotosUI" -framework "QuartzCore" -framework "ReplayKit" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -framework "TXFFmpeg" -framework "TXSoundTouch" -framework "UIKit" -framework "VideoToolbox" -framework "WebKit"
+OTHER_LDFLAGS = $(inherited) -l"c++" -l"iconv" -l"icucore" -l"resolv" -l"sqlite3" -l"stdc++" -l"xml2" -l"z" -framework "AVFoundation" -framework "AVKit" -framework "Accelerate" -framework "AssetsLibrary" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreMotion" -framework "CoreServices" -framework "CoreTelephony" -framework "CoreText" -framework "Foundation" -framework "GLKit" -framework "ImSDK_Plus" -framework "ImageIO" -framework "MetalKit" -framework "Photos" -framework "PhotosUI" -framework "QuartzCore" -framework "ReplayKit" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -framework "TXFFmpeg" -framework "TXSoundTouch" -framework "UIKit" -framework "VideoToolbox" -framework "WebKit"
 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/CHIPageControl/CHIPageControl.modulemap" -Xcc -fmodule-map-file="${PODS_ROOT}/Headers/Public/SSZipArchive/SSZipArchive.modulemap" -Xcc -fmodule-map-file="${PODS_ROOT}/Headers/Public/TIMCommon/TIMCommon.modulemap" -Xcc -fmodule-map-file="${PODS_ROOT}/Headers/Public/TUICore/TUICore.modulemap"
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

+ 2 - 2
KulexiuForStudent/Pods/Target Support Files/Pods-KulexiuForStudentTests/Pods-KulexiuForStudentTests.release.xcconfig

@@ -4,9 +4,9 @@ EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
 FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AlipaySDK-iOS" "${PODS_ROOT}/Bugly" "${PODS_ROOT}/TXIMSDK_Plus_iOS" "${PODS_ROOT}/TXLiteAVSDK_Professional/TXLiteAVSDK_Professional" "${PODS_XCFRAMEWORKS_BUILD_DIR}/TXLiteAVSDK_Professional/Professional"
 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) ENABLE_SCENARIO_SDK
 GENERATE_INFOPLIST_FILE = YES
-HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JPush" "${PODS_ROOT}/Headers/Public/JXCategoryView" "${PODS_ROOT}/Headers/Public/JXPagingView" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/NTLBridge" "${PODS_ROOT}/Headers/Public/QCloudCOSXML" "${PODS_ROOT}/Headers/Public/QCloudCore" "${PODS_ROOT}/Headers/Public/RSKImageCropper" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SSZipArchive" "${PODS_ROOT}/Headers/Public/SocketRocket" "${PODS_ROOT}/Headers/Public/TIMCommon" "${PODS_ROOT}/Headers/Public/TUIChat" "${PODS_ROOT}/Headers/Public/TUIConversation" "${PODS_ROOT}/Headers/Public/TUICore" "${PODS_ROOT}/Headers/Public/TUIGroup" "${PODS_ROOT}/Headers/Public/TUISearch" "${PODS_ROOT}/Headers/Public/TYCyclePagerView" "${PODS_ROOT}/Headers/Public/TZImagePickerController" "${PODS_ROOT}/Headers/Public/Whiteboard" "${PODS_ROOT}/Headers/Public/YYModel" "${PODS_ROOT}/Headers/Public/iOS-KS3SDK" "${PODS_ROOT}/Headers/Public/lottie-ios" ${PODS_ROOT}/TXIMSDK_Plus_iOS/ImSDK_Plus.framework/Headers/, ${PODS_ROOT}/TXIMSDK_Plus_iOS/ImSDK_Plus.framework/cpluscplus/include/ ${PODS_ROOT}/TXLiteAVSDK_Professional/TXLiteAVSDK_Professional/TXLiteAVSDK_Professional.xcframework/ios-arm64_armv7/TXLiteAVSDK_Professional.framework/Headers/
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/CocoaAsyncSocket" "${PODS_ROOT}/Headers/Public/CocoaHTTPServer" "${PODS_ROOT}/Headers/Public/CocoaLumberjack" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JPush" "${PODS_ROOT}/Headers/Public/JXCategoryView" "${PODS_ROOT}/Headers/Public/JXPagingView" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/NTLBridge" "${PODS_ROOT}/Headers/Public/QCloudCOSXML" "${PODS_ROOT}/Headers/Public/QCloudCore" "${PODS_ROOT}/Headers/Public/RSKImageCropper" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SSZipArchive" "${PODS_ROOT}/Headers/Public/SocketRocket" "${PODS_ROOT}/Headers/Public/TIMCommon" "${PODS_ROOT}/Headers/Public/TUIChat" "${PODS_ROOT}/Headers/Public/TUIConversation" "${PODS_ROOT}/Headers/Public/TUICore" "${PODS_ROOT}/Headers/Public/TUIGroup" "${PODS_ROOT}/Headers/Public/TUISearch" "${PODS_ROOT}/Headers/Public/TYCyclePagerView" "${PODS_ROOT}/Headers/Public/TZImagePickerController" "${PODS_ROOT}/Headers/Public/Whiteboard" "${PODS_ROOT}/Headers/Public/YYModel" "${PODS_ROOT}/Headers/Public/iOS-KS3SDK" "${PODS_ROOT}/Headers/Public/lottie-ios" "$(SDKROOT)/usr/include/libxml2" ${PODS_ROOT}/TXIMSDK_Plus_iOS/ImSDK_Plus.framework/Headers/, ${PODS_ROOT}/TXIMSDK_Plus_iOS/ImSDK_Plus.framework/cpluscplus/include/ ${PODS_ROOT}/TXLiteAVSDK_Professional/TXLiteAVSDK_Professional/TXLiteAVSDK_Professional.xcframework/ios-arm64_armv7/TXLiteAVSDK_Professional.framework/Headers/
 OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/CHIPageControl/CHIPageControl.modulemap" -fmodule-map-file="${PODS_ROOT}/Headers/Public/SSZipArchive/SSZipArchive.modulemap" -fmodule-map-file="${PODS_ROOT}/Headers/Public/TIMCommon/TIMCommon.modulemap" -fmodule-map-file="${PODS_ROOT}/Headers/Public/TUICore/TUICore.modulemap"
-OTHER_LDFLAGS = $(inherited) -l"c++" -l"iconv" -l"icucore" -l"resolv" -l"sqlite3" -l"stdc++" -l"z" -framework "AVFoundation" -framework "AVKit" -framework "Accelerate" -framework "AssetsLibrary" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreMotion" -framework "CoreServices" -framework "CoreTelephony" -framework "CoreText" -framework "Foundation" -framework "GLKit" -framework "ImSDK_Plus" -framework "ImageIO" -framework "MetalKit" -framework "Photos" -framework "PhotosUI" -framework "QuartzCore" -framework "ReplayKit" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -framework "TXFFmpeg" -framework "TXSoundTouch" -framework "UIKit" -framework "VideoToolbox" -framework "WebKit"
+OTHER_LDFLAGS = $(inherited) -l"c++" -l"iconv" -l"icucore" -l"resolv" -l"sqlite3" -l"stdc++" -l"xml2" -l"z" -framework "AVFoundation" -framework "AVKit" -framework "Accelerate" -framework "AssetsLibrary" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreMotion" -framework "CoreServices" -framework "CoreTelephony" -framework "CoreText" -framework "Foundation" -framework "GLKit" -framework "ImSDK_Plus" -framework "ImageIO" -framework "MetalKit" -framework "Photos" -framework "PhotosUI" -framework "QuartzCore" -framework "ReplayKit" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -framework "TXFFmpeg" -framework "TXSoundTouch" -framework "UIKit" -framework "VideoToolbox" -framework "WebKit"
 OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/CHIPageControl/CHIPageControl.modulemap" -Xcc -fmodule-map-file="${PODS_ROOT}/Headers/Public/SSZipArchive/SSZipArchive.modulemap" -Xcc -fmodule-map-file="${PODS_ROOT}/Headers/Public/TIMCommon/TIMCommon.modulemap" -Xcc -fmodule-map-file="${PODS_ROOT}/Headers/Public/TUICore/TUICore.modulemap"
 PODS_BUILD_DIR = ${BUILD_DIR}
 PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

Some files were not shown because too many files changed in this diff