首页监测自测修改

This commit is contained in:
NSArray
2026-03-05 18:07:03 +08:00
parent c5b5149bb1
commit 82a432f77a
11 changed files with 117 additions and 53 deletions
@@ -84,8 +84,8 @@
// 最新地址
//#define Http @"http://192.168.1.47"//王昊
//#define Http @"https://xj-api.mcrm.vip:8888"//
#define Http @"http://192.168.1.47"//王昊
#define Http @"https://xj-api.mcrm.vip:8888"//
//#define Http @"http://192.168.1.47"//王昊
#define H5DevHost @"xj-api.mcrm.vip:8888"//
#define IntervenH5 @"https://xj-admin.mcrm.vip:8888"
#define SCHEME @"https" //
@@ -9,13 +9,37 @@
@interface XJBaseWebViewVC ()<UINavigationControllerDelegate, UIImagePickerControllerDelegate>
@property (nonatomic, strong)NSURL *originalUrl;
@property (nonatomic, copy)NSString *videoUrl;
@property (nonatomic, copy)NSString *messageType;
// 以下三个属性声明后未使用,暂时保留
//@property (nonatomic, strong)NSURL *originalUrl;
//@property (nonatomic, copy)NSString *videoUrl;
//@property (nonatomic, copy)NSString *messageType;
@end
// ── 弱引用代理 ──────────────────────────────────────────────────────────────
// WKUserContentController 对 addScriptMessageHandler 的 handler 是强引用。
// 如果直接传 selfself → wkWebView → configuration → userContentController → self
// 形成循环引用,VC 永远无法释放。
// 解决方案:用一个弱引用中间对象转发消息。
@interface XJWeakScriptMessageHandler : NSObject <WKScriptMessageHandler>
@property (nonatomic, weak) id<WKScriptMessageHandler> delegate;
+ (instancetype)handlerWithDelegate:(id<WKScriptMessageHandler>)delegate;
@end
@implementation XJWeakScriptMessageHandler
+ (instancetype)handlerWithDelegate:(id<WKScriptMessageHandler>)delegate {
XJWeakScriptMessageHandler *handler = [[XJWeakScriptMessageHandler alloc] init];
handler.delegate = delegate;
return handler;
}
- (void)userContentController:(WKUserContentController *)userContentController
didReceiveScriptMessage:(WKScriptMessage *)message {
[self.delegate userContentController:userContentController didReceiveScriptMessage:message];
}
@end
// ────────────────────────────────────────────────────────────────────────────
@implementation XJBaseWebViewVC
@@ -32,10 +56,18 @@
}
- (void)backVC {
[self.navigationController popViewControllerAnimated:YES];
}
- (void)dealloc {
// 移除所有 scriptMessageHandler,配合 XJWeakScriptMessageHandler 彻底避免内存泄漏
WKUserContentController *ucc = self.wkWebView.configuration.userContentController;
[ucc removeScriptMessageHandlerForName:@"JSCallback"];
[ucc removeScriptMessageHandlerForName:@"htmlBack"];
[ucc removeScriptMessageHandlerForName:@"finishActivity"];
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
if (_wkWebView) {
@@ -51,14 +83,14 @@
[super viewWillDisappear:animated];
_wkWebView.navigationDelegate = nil;
_wkWebView.UIDelegate = nil;
//清除cookies
NSHTTPCookie *cookie;
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [storage cookies]) {
[storage deleteCookie:cookie];
}
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[self clearWebViewCache];
// ⚠️ 以下代码会清除整个 App 的所有 Cookie,影响其他模块登录状态,已注释
// NSHTTPCookie *cookie;
// NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
// for (cookie in [storage cookies]) {
// [storage deleteCookie:cookie];
// }
// [[NSURLCache sharedURLCache] removeAllCachedResponses];
// [self clearWebViewCache];
}
#pragma mark - Create UI
@@ -69,18 +101,36 @@
preferences.javaScriptCanOpenWindowsAutomatically = YES;
preferences.minimumFontSize = 10;
configuration.preferences = preferences;
[configuration.userContentController addScriptMessageHandler:self name:@"JSCallback"];
[configuration.userContentController addScriptMessageHandler:self name:@"htmlBack"];
// ── 统一使用 configuration 自带的 userContentController ──────────────────
// Bug 修复:原先在下方又新建了 wkUController 并覆盖 configuration.userContentController
// 导致此处注册的 JSCallback / htmlBack 被丢弃,永远收不到 JS 消息。
// Bug 修复:改用 XJWeakScriptMessageHandler 代理,防止循环引用内存泄漏。
XJWeakScriptMessageHandler *weakHandler = [XJWeakScriptMessageHandler handlerWithDelegate:self];
[configuration.userContentController addScriptMessageHandler:weakHandler name:@"JSCallback"];
[configuration.userContentController addScriptMessageHandler:weakHandler name:@"htmlBack"];
[configuration.userContentController addScriptMessageHandler:weakHandler name:@"finishActivity"]; // 不带参数的调用
// 原写法(已废弃):直接传 self 会造成循环引用
// [configuration.userContentController addScriptMessageHandler:self name:@"JSCallback"];
// [configuration.userContentController addScriptMessageHandler:self name:@"htmlBack"];
// ────────────────────────────────────────────────────────────────────────
//防止搜索框自动放大 注入js代码
WKUserContentController *userController = [WKUserContentController new];
// 原代码中 userController 声明后从未使用,已移除
// WKUserContentController *userController = [WKUserContentController new];
NSString *jScript = @"var script = document.createElement('meta');script.name = 'viewport';script.content='width=device-width,user-scalable=no';document.getElementsByTagName('head')[0].appendChild(script);";
WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
WKUserContentController * wkUController = [[WKUserContentController alloc] init];
[wkUController addScriptMessageHandler: self name: @"finishActivity"];//不带参数的调用
[wkUController addUserScript:wkUScript];
configuration.userContentController= wkUController;
// 原写法(已废弃):新建 wkUController 并覆盖 configuration.userContentController
// 导致上方注册的 JSCallback / htmlBack 全部失效
// WKUserContentController * wkUController = [[WKUserContentController alloc] init];
// [wkUController addScriptMessageHandler: self name: @"finishActivity"];
// [wkUController addUserScript:wkUScript];
// configuration.userContentController = wkUController;
[configuration.userContentController addUserScript:wkUScript];
self.wkWebView = [[WKWebView alloc]initWithFrame:CGRectMake(0, 0, WIDTH, MyViewHEIGHT) configuration:configuration];
self.wkWebView.navigationDelegate = self;
@@ -201,10 +251,13 @@
#pragma mark - 自定义
- (void)onBackClicked{
if ( self.wkWebView.canGoBack){
if (self.wkWebView.canGoBack) {
[self.wkWebView goBack];
} else {
// 原写法:只清缓存没有 pop,页面会卡住
// [self clearWebViewCache];
[self clearWebViewCache];
[self.navigationController popViewControllerAnimated:YES];
}
}
@@ -226,19 +279,18 @@
}
}
- (NSString *)URLEncodedString:(NSString *)urlString{
NSString *encodePath ;
if (!IOS7) {
encodePath = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}else{
NSString *encodePath;
encodePath = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
}return encodePath;
return encodePath;
}
#pragma mark - SETTER
- (void)setRightType:(RightNavType)rightType{
_rightType = rightType;
}
// setRightType: 与自动合成的 setter 完全相同,无需 override,保留注释备查
//- (void)setRightType:(RightNavType)rightType{
// _rightType = rightType;
//}
- (void)setWebUrl:(NSString *)webUrl{
_webUrl = webUrl;
@@ -310,16 +310,16 @@
};
MJWeakSelf
self.watchDataView.tabSelectBlock = ^(NSInteger index, NSString *title) {
// tab 0 完整高度,其他收缩(header 40 + tab 52 + 内容区 68 = 160
CGFloat height = (index == 0) ? 250 : 160;
[weakSelf.watchDataView mas_updateConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(height);
}];
[UIView animateWithDuration:0.25 animations:^{
[weakSelf layoutIfNeeded];
}];
};
// self.watchDataView.tabSelectBlock = ^(NSInteger index, NSString *title) {
// // tab 0 完整高度,其他收缩(header 40 + tab 52 + 内容区 68 = 160
// CGFloat height = (index == 0) ? 250 : 250;
// [weakSelf.watchDataView mas_updateConstraints:^(MASConstraintMaker *make) {
// make.height.mas_equalTo(height);
// }];
// [UIView animateWithDuration:0.25 animations:^{
// [weakSelf layoutIfNeeded];
// }];
// };
self.watchDataView.watchMoreBlock = ^{
if ([self.homeTopDelegate respondsToSelector:@selector(watchDetailClick)]) {
[self.homeTopDelegate watchDetailClick];
@@ -284,7 +284,7 @@ weekLabel;
if ([HQCommonUtils isLogin]) {
// 已登录,等待数据回调
} else {
_emptyLabel.text = @"~ 暂未登录 ~";
_emptyLabel.text = @" 暂未登录 ";
_emptyLabel.hidden = NO;
_tabScrollView.hidden = false;
_collectionView.hidden = false;
@@ -449,7 +449,7 @@ weekLabel;
_dataList = [dataList copy];
if (![HQCommonUtils isLogin]) {
_emptyLabel.text = @"~ 暂未登录 ~";
_emptyLabel.text = @" 暂未登录 ";
_emptyLabel.hidden = NO;
_collectionView.hidden = YES;
_tabScrollView.hidden = YES;
@@ -529,7 +529,7 @@ weekLabel;
- (void)p_startAutoScroll {
[self p_stopAutoScroll];
if (_dataList.count <= 1) return;
_autoScrollTimer = [NSTimer scheduledTimerWithTimeInterval:3.0
_autoScrollTimer = [NSTimer scheduledTimerWithTimeInterval:5.0
target:self
selector:@selector(p_autoScrollToNext)
userInfo:nil
@@ -556,7 +556,6 @@ static CGFloat const kEmptyTableMinHeight = 250; // 或屏幕高度的一半
}
//banner图
if ([tag isEqualToString:@"LIST"]) {
//请求成功 yes 继续轮询
DLog(@"轮询111---%@",response);
@@ -585,7 +584,10 @@ static CGFloat const kEmptyTableMinHeight = 250; // 或屏幕高度的一半
dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(120 * NSEC_PER_SEC)),
dispatch_get_main_queue(), ^{
[weakSelf getMessageListData];
if ([HQCommonUtils isLogin]) {
//请求消息列表
[weakSelf getMessageListData];
}
});
}
if ([tag isEqualToString:@"WEARWATCH"]) {
@@ -342,9 +342,7 @@ static CGFloat const kEmptyTableMinHeight = 300; // 或屏幕高度的一半
[self getData];
}
}
if ([tag isEqualToString:@"IMAPI"]) {
@@ -476,7 +474,11 @@ static CGFloat const kEmptyTableMinHeight = 300; // 或屏幕高度的一半
- (void)foundQuestionAction {
if (![HQCommonUtils isLogin]) {
KPostNotification(KNotificationLoginStateChange, @NO);
return;
}
RoomDoctorRecordsVC * foundVC = [[RoomDoctorRecordsVC alloc] init];
[self.navigationController pushViewController:foundVC animated:true];
@@ -484,6 +486,12 @@ static CGFloat const kEmptyTableMinHeight = 300; // 或屏幕高度的一半
- (void)smallQuestionAction {
if (![HQCommonUtils isLogin]) {
KPostNotification(KNotificationLoginStateChange, @NO);
return;
}
if ([ESCTUIManager TUIUserStatus] == false) {
[self loginImAccount];
@@ -503,7 +511,11 @@ static CGFloat const kEmptyTableMinHeight = 300; // 或屏幕高度的一半
- (void)myQuestionAction {
if (![HQCommonUtils isLogin]) {
KPostNotification(KNotificationLoginStateChange, @NO);
return;
}
XJQustionRecordViewController * myVC = [[XJQustionRecordViewController alloc] init];
[self.navigationController pushViewController:myVC animated:true];
@@ -1,17 +1,15 @@
{
"images" : [
{
"filename" : "homePageHeardTop.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "homePageHeardTop@2x.png",
"filename" : "组 7.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "homePageHeardTop@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB