// // H5View.m // TestGameWeb // // Created by Mac on 2024/1/30. // #import "H5View.h" #import "CircularProgressBar.h" #import #import "CustomView.h" #import "UnityFramework.h" #import @implementation H5View{ WKWebView * webview; WKWebView * webview_1; CircularProgressBar* bar; //奖励按钮进度条 UIView * flyBtn; //飞行奖励按钮节点,也可以用UIButton但要屏蔽事件 UIImageView* flyBg; //飞行奖励闪光背景 UIImageView* rewardBtn; //奖励按钮节点 NSTimer* updateTimer; //动效定时器 CGPoint points[4]; //飞行按钮飞行点位 NSInteger pointIndex; //当前飞行下标 BOOL canFly; //是否可飞行 CGPoint targetPoint; //飞行的下一个点 CGPoint delta; //飞行移动的delta BOOL canCheckTouch; //加这个变量来防止检测点击事件出现多次 BOOL canCT; //点击是否可穿透 NSString* lastUrl; //记录上一次打开的url BOOL inited; //当前view是否被初始化 CGPoint hitTestLocation; //hitest 点击的点 float bgAngle; //飞行按钮背景图的角度 BOOL is_first_btn; //是否是第一次生成网页按钮 int flyCtRate;//飞行按钮穿透概率 float stopTouchTime; int otherH5switch; //是否自动刷h5界面 int H5Refreshtime; //h5刷新默认间隔时间 int Dailyrefreshtimes; //每天h5剩余刷新次数 UIScrollView *scrollView; BOOL is_transparent; BOOL dark_though; NSMutableArray * dark_though_rate; NSMutableArray * dark_though_rate_1; float Dark_stopRefeshTime; float Dark_stopRefeshTime_1; NSMutableArray *dark_H5Refreshtime; //h5刷新默认间隔时间 NSMutableArray *dark_Dailyrefreshtimes; //每天h5剩余刷新次数 NSMutableArray *dark_url_array; BOOL inH5ui; NSMutableArray *light_url_array; BOOL isClickProgress; BOOL isClickFly; int light_though_rate; BOOL isShowFlyBtn; BOOL isShowRewardBtn; BOOL isMultiView; float top_; float height_; BOOL is_gift; int offset_y; int offset_y1; // UITapGestureRecognizer *tapGesture; // UITapGestureRecognizer *tapGesture_1; BOOL in_game; NSMutableArray *web_through_array; NSString* webview_url; NSString* webview_1_url; NSMutableArray *ClickAddtime; BOOL webview_IsCLickAd; BOOL webview_1_IsCLickAd; // float web_1_through_time; // float web_2_through_time; int dark_webview1_random_refresh_time; int dark_webview2_random_refresh_time; BOOL webview_state; BOOL webview_1_state; // float web_1_disable_time; // float web_2_disable_time; } //单利模式 +(id) shared{ static H5View *view = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{view = [[self alloc] init];}); return view; } //初始化页面 -(void)initView{ if (inited)return; [self initFlyBtn]; [self setHidden:YES]; //默认为隐藏状态 [self hideView]; canCheckTouch = true; inited = true; Dark_stopRefeshTime=0; Dark_stopRefeshTime_1=0; dark_though_rate= [NSMutableArray array]; dark_though_rate_1= [NSMutableArray array]; [dark_though_rate addObject:@0]; [dark_though_rate addObject:@0]; [dark_though_rate_1 addObject:@0]; [dark_though_rate_1 addObject:@0]; // NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.1 // target:self // selector:@selector(timerAction:) // userInfo:nil // repeats:YES]; NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES]; // 将 timer 添加到 NSRunLoopCommonModes 模式 [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; CustomView *custom = [[CustomView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)]; custom.backgroundColor = [UIColor clearColor]; custom.userInteractionEnabled=YES; [self.window.rootViewController.view addSubview:custom]; UnityFramework *unityFramework = [UnityFramework getInstance]; UnityAppController *appController = [unityFramework appController]; // 获取 Unity 根节点视图 // UIView *unityRootView = [appController rootView]; // unityRootView.alpha=0.2; } -(void)initWebview:(int)type{ NSLog(@"kkkkkkkkkkkkkkkkkkkkkk%d",type); if(type==2&&!isMultiView) return; if (webview != nil) { // 移除WebView的委托 if(type==1){ webview.navigationDelegate = nil; // 停止加载和清理缓存 [webview stopLoading]; [webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; [NSURLCache.sharedURLCache removeAllCachedResponses]; // 从视图层次结构中移除WebView [webview removeFromSuperview]; webview = nil; } } if (webview_1 != nil) { // 移除WebView的委托 if(type==2){ webview_1.navigationDelegate = nil; // 停止加载和清理缓存 [webview_1 stopLoading]; [webview_1 loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; [NSURLCache.sharedURLCache removeAllCachedResponses]; // 从视图层次结构中移除WebView [webview_1 removeFromSuperview]; webview_1 = nil; } } WKWebViewConfiguration *webViewConfiguration = [[WKWebViewConfiguration alloc] init]; if(is_transparent){ webViewConfiguration.allowsInlineMediaPlayback = YES; webViewConfiguration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeAll; NSString *css = @"body { -webkit-user-select: none;user-select: none; }"; NSString *jsCSS = [NSString stringWithFormat:@"var style = document.createElement('style'); style.innerHTML = '%@'; document.head.appendChild(style);", css]; // NSString *js = // @"(function() { " // "var elements = document.querySelectorAll('input, textarea, select'); " // "elements.forEach(function(element) { " // "element.disabled = true; " // "}); " // "})();" // " document.addEventListener('touchstart', function(event) {" // " const target = event.target;" // " if (target.matches('.ad-class') || target.closest('.ad-class')) {" // 替换 '.ad-class' 为广告元素的实际类名 // " setTimeout(function() {" // " const touchCancelEvent = new TouchEvent('touchcancel', {" // " bubbles: true," // " cancelable: true," // " touches: []," // " targetTouches: []," // " changedTouches: event.changedTouches," // " shiftKey: event.shiftKey" // " });" // " target.dispatchEvent(touchCancelEvent);" // " }, 1000);" // " event.preventDefault();" // 禁用默认触摸事件 // " }" // "}, { passive: false });"; NSString *js = @"(function() { " // 禁用所有表单元素 "var elements = document.querySelectorAll('input, textarea, select'); " "elements.forEach(function(element) { " " element.disabled = true; " "}); " // 禁用所有音频和视频 "document.querySelectorAll('audio, video').forEach(function(el) { " " el.muted = true; " " el.pause(); " "}); " // 处理触摸事件,阻止广告类元素的触摸 "document.addEventListener('touchstart', function(event) {" " const target = event.target;" " if (target.matches('.ad-class') || target.closest('.ad-class')) {" // 替换 '.ad-class' 为广告元素的实际类名 " setTimeout(function() {" " const touchCancelEvent = new TouchEvent('touchcancel', {" " bubbles: true," " cancelable: true," " touches: []," " targetTouches: []," " changedTouches: event.changedTouches," " shiftKey: event.shiftKey" " });" " target.dispatchEvent(touchCancelEvent);" " }, 1000);" " event.preventDefault();" // 禁用默认触摸事件 " }" "}, { passive: false });" "})();"; NSString *combinedJS = [NSString stringWithFormat:@"%@ %@", jsCSS, js]; WKUserScript *userScript = [[WKUserScript alloc] initWithSource:combinedJS injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO]; [webViewConfiguration.userContentController addUserScript:userScript]; } if(type==1) { webview = [[WKWebView alloc] initWithFrame:self.frame configuration:webViewConfiguration]; [self addSubview:webview]; webview.allowsLinkPreview = NO; [self insertSubview:webview atIndex:0]; // webview .alpha=0.5; } if(type==2){ webview_1 = [[WKWebView alloc] initWithFrame:self.frame configuration:webViewConfiguration]; [self addSubview:webview_1]; webview_1.allowsLinkPreview = NO; [self insertSubview:webview_1 atIndex:0]; } webview.navigationDelegate=self; webview_1.navigationDelegate=self; // webview.tag = 1; // webview_1.tag = 2; webview.UIDelegate=self; webview_1.UIDelegate=self; // 将WebView添加到当前视图的最后面 // [self insertSubview:webview atIndex:0]; // 将WebView添加到当前视图的最后面 //[self insertSubview:webview_1 atIndex:1]; // if (webview.superview == nil) // [self ChangeViewRect:!is_transparent]; // [self showWebview:@"https://baidu.com"]; } //- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { // // NSLog(@"pppppppppppppppppJavaScript 点击了链接: "); // if ([message.name isEqualToString:@"linkClicked"]) { // NSString *urlString = message.body; // // // // 在这里处理链接点击,例如加载链接 // NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; // [webview loadRequest:request]; // } //} - (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures { if (!navigationAction.targetFrame.isMainFrame) { [webView loadRequest:navigationAction.request]; } return nil; } //当前view的显/隐 -(void)showView:(BOOL)show{ if (!show){ [self hideView]; }else{ //[self setHidden:NO]; // NSLog(@"xianshimingchuantouuuuuuuuuuuuuu1----%d", inH5ui); if(!inH5ui) return; // NSLog(@"xianshimingchuantouuuuuuuuuuuuuu2----%d", show); if(is_transparent){ webview.hidden=YES; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@""] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0]; [webview loadRequest:request]; [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delayShowH5) object:nil]; [self performSelector:@selector(delayShowH5) withObject:nil afterDelay:1.5]; } [self.superview bringSubviewToFront:self]; is_transparent=NO; if (isShowRewardBtn) { [rewardBtn setHidden:NO]; } else { [rewardBtn setHidden:YES]; } [self showWebview:lastUrl]; //打开webview时url为上一次 [self ChangeViewRect:true]; [self startFlyAnim]; //每一次显示时强行执行飞行按钮的动画 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { self .alpha=1; } } } //隐藏view -(void)hideView{ [self stopUpdate]; if(!is_transparent){ webview.hidden=YES; webview_1.hidden=YES; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@""] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0]; [webview loadRequest:request]; [webview_1 loadRequest:request]; [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delayShowH5) object:nil]; [self performSelector:@selector(delayShowH5) withObject:nil afterDelay:0.5]; } is_transparent=YES; [self.superview sendSubviewToBack:self]; self.userInteractionEnabled=TRUE; [flyBtn setHidden:YES]; [rewardBtn setHidden:YES]; Dark_stopRefeshTime=0; Dark_stopRefeshTime_1=0; [self showDarkWebview:1]; [self showDarkWebview:2]; [self ChangeViewRect:false]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { self .alpha=0; } } -(void)delayShowH5{ webview.hidden=NO; webview_1.hidden=NO; } -(void)setInH5View:(BOOL)flag{ // NSLog(@"aaaaaaaaaaaaaaaaaa%d",flag); inH5ui=flag; } -(void)upDataH5times:(char*)weblink times:(int)times is_dark:(BOOL)is_dark{ NSString *myNSString = [[NSString alloc] initWithUTF8String:weblink]; if(is_dark){ for (int counter = 0; counter < dark_url_array.count; counter++) { if( [dark_url_array[counter][0] isEqualToString:myNSString]){ dark_url_array[counter][2]=@(times); // dark_though_rate[[dark_url_array[counter][4] intValue]-1]=@([dark_url_array[counter][3] intValue]); break; } } } else{ for (int counter = 0; counter < light_url_array.count; counter++) { if( [light_url_array[counter][0] isEqualToString:myNSString]){ light_url_array[counter][2]=@(times); light_though_rate=[light_url_array[counter][3] intValue]; // NSLog(@"[uuuuuuuuuuuuuuuuu: %s剩余的可刷新次数%u", weblink, times); break; } } } } - (void)timerAction:(NSTimer *)timer { // 定时器触发时执行的操作 stopTouchTime+=1; Dark_stopRefeshTime+=1; Dark_stopRefeshTime_1+=1; if(is_transparent){ if([dark_Dailyrefreshtimes[0] intValue]>0&&Dark_stopRefeshTime>dark_webview1_random_refresh_time){ dark_Dailyrefreshtimes[0]=@([dark_Dailyrefreshtimes[0] intValue]-1); UnitySendMessage("WebviewManager", "H5AutoRefresh","dark_Dailyrefreshtimes|0" ); Dark_stopRefeshTime=0; dark_webview1_random_refresh_time=[dark_H5Refreshtime[0] intValue] + arc4random_uniform([dark_H5Refreshtime[1] intValue] - [dark_H5Refreshtime[0] intValue] + 1); NSLog(@"hhhhhhhhhhhh3333333kkkk%d",dark_webview1_random_refresh_time); [self showDarkWebview:1]; [self ChangeViewRect:false]; } if([dark_Dailyrefreshtimes[1] intValue]>0&&Dark_stopRefeshTime_1>dark_webview2_random_refresh_time){ dark_Dailyrefreshtimes[1]=@([dark_Dailyrefreshtimes[1] intValue]-1); UnitySendMessage("WebviewManager", "H5AutoRefresh","dark_Dailyrefreshtimes|1" ); Dark_stopRefeshTime_1=0; dark_webview2_random_refresh_time=[dark_H5Refreshtime[2] intValue] + arc4random_uniform([dark_H5Refreshtime[3] intValue] - [dark_H5Refreshtime[2] intValue] + 1); NSLog(@"hhhhhhhhhhhh3333333kkkk%d",dark_webview2_random_refresh_time); [self showDarkWebview:2]; [self ChangeViewRect:false]; } } else{ if(otherH5switch!=1 ) return; if(Dailyrefreshtimes<=0 ) return; if(stopTouchTime>H5Refreshtime){ UnitySendMessage("WebviewManager", "H5AutoRefresh","Dailyrefreshtimes" ); [self showWebview:lastUrl]; [self ChangeViewRect:true]; stopTouchTime=0; Dailyrefreshtimes--; } } } // 处理网页开始加载 //- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation { // NSLog(@"WebView with tag %ld started loading", (long)webView.tag); // [self injectJavaScriptIntoWebView:webView]; // 在开始加载时重新注入 JavaScript //} // //// 处理网页加载完成 //- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { // NSLog(@"WebView with tag %ld finished loading", (long)webView.tag); // [self injectJavaScriptIntoWebView:webView]; // 在加载完成时重新注入 JavaScript //} - (void)yourMethodToCall { if(!is_transparent) { webview.hidden=NO; } } //显示webview -(void)showWebview:(NSString*)url{ if (is_transparent) return; //view在隐藏状态下不显示webview,因为目前只需要处理明webview 的显示。 // NSLog(@"xianshimingchuantouuuuuuuuuuuuuu3----%d"); [self initWebview:1]; float maxvalue=0; for (int counter = 0; counter < light_url_array.count; counter++) { if([light_url_array[counter][2] intValue]>0 ){ maxvalue+=[light_url_array[counter][1] floatValue]; } } float random3 ; float rate=0; if(maxvalue>0){ random3=arc4random_uniform(maxvalue); for (int counter = 0; counter < light_url_array.count; counter++) { if([light_url_array[counter][2] intValue]==0) continue; float myFloat = [light_url_array[counter][1] floatValue]; light_though_rate=[light_url_array[counter][3] intValue]; rate+=myFloat; if(random3<=rate){ url=light_url_array[counter][0]; light_url_array[counter][2]=@([light_url_array[counter][2] floatValue]-1); break; } } } else{ random3=arc4random_uniform(100); for (int counter = 0; counter < light_url_array.count; counter++) { float myFloat = [light_url_array[counter][1] floatValue]; light_though_rate=[light_url_array[counter][3] intValue]; rate+=myFloat; if(random3<=rate){ url=light_url_array[counter][0]; break; } } } // NSLog(@"xianshimingchuantouuuuuuuuuuuuuu3----%@",url); UnitySendMessage("WebviewManager", "SendH5Event", "test"); stopTouchTime=0; //@"https://tool.lu/timestamp/?ivk_sa=1023231z"@"https://fanyi.baidu.com/ if(url.length==0) return; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] ]; [webview loadRequest:request]; webview_IsCLickAd=YES; if (webview.superview == nil) [self insertSubview:webview atIndex:0]; UnitySendMessage("WebviewManager", "H5AutoRefresh",[[url stringByAppendingString:@"|h5"] UTF8String]); } -(void)showDarkWebview:(int)type{ if(!is_gift) return; [self initWebview:type]; NSString* url=@""; UnitySendMessage("WebviewManager", "SendH5Event", "test"); float maxvalue=0; float random3 ; float rate=0; if(type==1){ for (int counter = 0; counter < dark_url_array.count; counter++) { if([dark_url_array[counter][2] intValue]>0 ){ if([dark_url_array[counter][4] intValue]!=1 ) continue; maxvalue+=[dark_url_array[counter][1] floatValue]; } } if(maxvalue>0){ random3=arc4random_uniform(maxvalue); for (int counter = 0; counter < dark_url_array.count; counter++) { if([dark_url_array[counter][2] intValue]<=0) continue; if([dark_url_array[counter][4] intValue]!=1 ) continue; float myFloat = [dark_url_array[counter][1] floatValue]; dark_though_rate[0]=@([dark_url_array[counter][3] intValue]); dark_though_rate[1]=@([dark_url_array[counter][5] intValue]); rate+=myFloat; if(random3<=rate){ url=dark_url_array[counter][0]; dark_url_array[counter][2]=@([dark_url_array[counter][2] floatValue]-1); break; } } } else{ random3=arc4random_uniform(100); for (int counter = 0; counter < dark_url_array.count; counter++) { if([dark_url_array[counter][4] intValue]!=1 ) continue; float myFloat = [dark_url_array[counter][1] floatValue]; dark_though_rate[0]=@([dark_url_array[counter][3] intValue]); dark_though_rate[1]=@([dark_url_array[counter][5] intValue]); rate+=myFloat; if(random3<=rate){ url=dark_url_array[counter][0]; break; } } } //url=@"https://wing0107.minigame.vip/";//zhushi if(url.length!=0) webview_url=url; else return; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; webview_IsCLickAd=NO; webview_state=!webview_state; NSLog(@"33333333333333333%d",webview_state); [webview loadRequest:request]; } else if(type==2){ if(!isMultiView) return; for (int counter = 0; counter < dark_url_array.count; counter++) { if([dark_url_array[counter][2] intValue]>0 ){ if([dark_url_array[counter][4] intValue]!=2 ) continue; maxvalue+=[dark_url_array[counter][1] floatValue]; } } rate=0; if(maxvalue>0){ random3=arc4random_uniform(maxvalue); for (int counter = 0; counter < dark_url_array.count; counter++) { if([dark_url_array[counter][2] intValue]<=0) continue; if([dark_url_array[counter][4] intValue]!=2 ) continue; float myFloat = [dark_url_array[counter][1] floatValue]; // dark_though_rate=[dark_url_array[counter][3] intValue]; // dark_though_rate[[dark_url_array[counter][4] intValue]-1]=@([dark_url_array[counter][3] intValue]); dark_though_rate_1[0]=@([dark_url_array[counter][3] intValue]); dark_though_rate_1[1]=@([dark_url_array[counter][5] intValue]); rate+=myFloat; if(random3<=rate){ url=dark_url_array[counter][0]; dark_url_array[counter][2]=@([dark_url_array[counter][2] floatValue]-1); break; } } } else{ random3=arc4random_uniform(100); for (int counter = 0; counter < dark_url_array.count; counter++) { if([dark_url_array[counter][4] intValue]!=2 ) continue; float myFloat = [dark_url_array[counter][1] floatValue]; // dark_though_rate[[dark_url_array[counter][4] intValue]-1]=@([dark_url_array[counter][3] intValue]); dark_though_rate_1[0]=@([dark_url_array[counter][3] intValue]); dark_though_rate_1[1]=@([dark_url_array[counter][5] intValue]); rate+=myFloat; if(random3<=rate){ url=dark_url_array[counter][0]; break; } } } if(url.length!=0) webview_1_url=url; else return; NSMutableURLRequest *request_1 = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] ]; webview_1_IsCLickAd=NO; webview_1_state=!webview_1_state; [webview_1 loadRequest:request_1]; // NSLog(@"333333333333333331%@",url); } UnitySendMessage("WebviewManager", "H5AutoRefresh",[[url stringByAppendingString:@"|h6"] UTF8String]); } //隐藏webview -(void)hideWebview{ [webview removeFromSuperview]; } //设置飞行进度条进度 -(void)setIconProgress:(float)value{ [bar setProgress:value]; // NSLog(@"bbbbbbbbbbbbbbbbbbbbb%f",value); if(value>=1){ UnitySendMessage("WebviewManager", "TouchClickPoint", "finish"); } } //初始化飞行按钮 -(void)initFlyBtn{ flyBtn = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; [self addSubview:flyBtn]; //飞行闪光底图 flyBg = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"7"]]; flyBg.frame = CGRectMake(0, 0, 100, 100); [flyBtn addSubview:flyBg]; [flyBtn setUserInteractionEnabled:NO]; UIImageView* icon = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"3"]]; icon.frame = CGRectMake(30, 30, 139*0.35, 97*0.35); [flyBtn addSubview:icon]; //飞行点位 float sw = self.frame.size.width; float sh = self.frame.size.height; points[0] = CGPointMake(sw * 0.5,0); points[1] = CGPointMake(-20,sh * 0.25); points[2] = CGPointMake(sw - flyBtn.frame.size.width+20,sh * 0.5); points[3] = CGPointMake(-20,sh - 220); } //执行飞行按钮的动画 -(void)startFlyAnim{ if (!isShowFlyBtn) { flyBtn.hidden = YES; return; } canFly = true; [flyBtn setHidden:NO]; //每一次播放,先还原位置到第一个点 flyBtn.transform = CGAffineTransformMakeTranslation(points[0].x, points[0].y); pointIndex = 0; [self flyAnim]; // float random3 = arc4random_uniform(100) ; // if(random3is_transparent) { // // NSLog(@"Element info11111111122223333: %d", Dark_stopRefeshTime); // UnitySendMessage("WebviewManager", "ClickAdEvent", [[webview_url stringByAppendingString:@"|h6"] UTF8String]); // // Dark_stopRefeshTime-=[ClickAddtime[0] intValue]; // if(!webview_IsCLickAd) Dark_stopRefeshTime-= [self randomValueBetween]; // webview_IsCLickAd=YES; // // NSLog(@"Element info11111111122223333: %d", Dark_stopRefeshTime); // } // else { // UnitySendMessage("WebviewManager", "ClickAdEvent", [[webview_url stringByAppendingString:@"|h5"] UTF8String]); // } // // } //// else { //// NSLog(@"Result does not contain 'iframe' string"); //// } // } // }]; //} - (int)randomValueBetween{ int lowerBound =[ClickAddtime[0] intValue]; int upperBound =[ClickAddtime[1] intValue]; NSLog(@"Tap detected at location: %d", lowerBound); NSLog(@"Tap detected at location: %d", upperBound); return lowerBound + arc4random_uniform((upperBound - lowerBound + 1)); } //- (void)handleTap_1:(UITapGestureRecognizer *)sender { // CGPoint location = [sender locationInView:webview_1]; // NSLog(@"Tap detected at location: %@", NSStringFromCGPoint(location)); // // // 模拟点击事件传递给第二个 WKWebView // NSString *js = [NSString stringWithFormat:@"\ // var element = document.elementFromPoint(%f, %f);\ // if (element) {\ // var elementType = element.tagName.toLowerCase();\ // var elementName = element.getAttribute('id') || element.getAttribute('class') || 'no-name';\ // console.log('Element info: ' + elementType + ' ' + elementName);\ // var events = ['mousedown', 'mouseup', 'click'];\ // events.forEach(function(eventType) {\ // var event = new MouseEvent(eventType, {\ // bubbles: true,\ // cancelable: true,\ // view: window,\ // clientX: %f,\ // clientY: %f\ // });\ // element.dispatchEvent(event);\ // });\ // elementType + ' ' + elementName;\ // } else {\ // 'no-element';\ // }\ // ", location.x, location.y, location.x, location.y]; // // [webview_1 evaluateJavaScript:js completionHandler:^(id result, NSError *error) { // if (error) { // // NSLog(@"Error simulating mouse events1111111112222: %@", error); // } else { // // NSLog(@"Element info1111111112222: %@", result); // // // 判断 result 是否包含 iframe 字符串 // if ([result isKindOfClass:[NSString class]] && [(NSString *)result containsString:@"iframe"]) { // // // NSLog(@"Element info11111111122223333: %d", Dark_stopRefeshTime_1); //// UnitySendMessage("WebviewManager", "ClickAdEvent", [[webview_1_url stringByAppendingString:@"|h6"] UTF8String]); //// if(!webview_1_IsCLickAd) Dark_stopRefeshTime_1-=[self randomValueBetween]; //// webview_1_IsCLickAd=YES; // // NSLog(@"Element info11111111122223333: %d", Dark_stopRefeshTime_1); // } //// else { //// NSLog(@"Result does not contain 'iframe' string"); //// } // } // }]; //} //hitTest 能在不接受点击事件的view也能捕获多点位的信息 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { hitTestLocation = point; // NSLog(@"Hit point11111110 x: %f, y:%f", hitTestLocation.x, hitTestLocation.y); // if(inH5ui&& hitTestLocation.y<100){ // hitTestLocation.y+=66; // } // if (canCheckTouch){ //NSLog(@"Hit point11111112 x: %f, y:%f", hitTestLocation.x, hitTestLocation.y); [self checkPointInsideBtn:hitTestLocation]; [self delayInvoke:0.3 cb:^(void){ self->canCheckTouch = YES; }];//加个定时器来防止出发多次检测点击 CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width; // 获取屏幕高度 CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height; NSString *jsCode = [NSString stringWithFormat:@"%f|%f",hitTestLocation.x/screenWidth, hitTestLocation.y/screenHeight]; if (dark_though){ // NSLog(@"Hit point1111113 x: %f, y:%f", hitTestLocation.x, hitTestLocation.y); UnitySendMessage("WebviewManager", "TouchClickPoint",[jsCode UTF8String]); } } canCheckTouch = false; // if(is_transparent&&dark_though){ // if(point.y>self.frame.size.height){ // point.y-=top_; // } // } // if(tapGesture==nil) { // tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; // // tapGesture_1 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap_1:)]; // // } UIView* touchedView; int click_web=1; if(!dark_though){ touchedView=[super hitTest:point withEvent:event]; } else{ //判断点击到了哪个webview上 float random_ = arc4random_uniform(100) ; // random_=-1;//zhushi if(!is_transparent|| random_<[web_through_array[0] intValue]){ // if(true){ touchedView=[webview hitTest:point withEvent:event]; // tapGesture.delegate=touchedView; // [touchedView addGestureRecognizer:tapGesture]; } else { touchedView=[webview_1 hitTest:point withEvent:event]; click_web=2; // tapGesture_1.delegate=touchedView; // [touchedView addGestureRecognizer:tapGesture_1]; } } // [self.webView2 addGestureRecognizer:tapGesture]; if(is_transparent&&dark_though){//暗穿透 float random3 = arc4random_uniform(100) ; // NSLog(@"eeeeeeeeeeeeeeeeeee%i",dark_though_rate); // random3=-1;//zhushi // NSLog(@"Point coordinates: max = %f,",self.bounds.size.width); if(isMultiView){ if(click_web==1){ if(webview_state){ if(random3< [dark_though_rate[0] intValue]){ return touchedView; } else return nil; } else{ if(random3< [dark_though_rate[1] intValue]){ return touchedView; } else return nil; } } else{ if(webview_1_state){ if(random3< [dark_though_rate_1[0] intValue]){ return touchedView; } else return nil; } else{ if(random3< [dark_though_rate_1[1] intValue]){ return touchedView; } else return nil; } } } else{ // if(random3< [dark_though_rate[0] intValue]){ // return touchedView; // } // else return nil; if(webview_state){ if(random3< [dark_though_rate[0] intValue]){ return touchedView; } else return nil; } else{ if(random3< [dark_though_rate[1] intValue]){ return touchedView; } else return nil; } } } else if(isClickProgress&&!is_transparent){//明穿透,点击能量环时 float random3 = arc4random_uniform(100) ; //NSLog(@"eeeeeeeeeeeeeeeeeee%i",light_though_rate); if(random3< light_though_rate){ return touchedView; } else return nil; } else if(isClickFly&&!is_transparent){ float random3 = arc4random_uniform(100) ; // NSLog(@"eeeeeeeeeeeeeeeeeee%i",light_though_rate); if(random3< flyCtRate){ return touchedView; } else return nil; } else return touchedView; } //设置全屏 -(void)setFullScreen{ self.frame = self.bounds; } - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { // NSLog(@"网页开始加载: %@", webView.URL.absoluteString); if (navigationAction.navigationType == WKNavigationTypeLinkActivated && !navigationAction.targetFrame.isMainFrame) { decisionHandler(WKNavigationActionPolicyCancel); [webView loadRequest:navigationAction.request]; } else { decisionHandler(WKNavigationActionPolicyAllow); } } - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation { if(!is_transparent) return; NSString *urlString = webView.URL.absoluteString; if (webView == webview) { BOOL isSameDomain1 = [self areDomainsSameForURL:webview_url url2:urlString]; if(!isSameDomain1&&([urlString length]>100||([urlString rangeOfString:@"adclick" options:NSCaseInsensitiveSearch].location != NSNotFound || [urlString rangeOfString:@"googleads" options:NSCaseInsensitiveSearch].location != NSNotFound))){ if(!webview_IsCLickAd) { NSLog(@"网页开始加载: %@", webView.URL.absoluteString); NSLog(@"网页开始加载: %@", webview_url); Dark_stopRefeshTime-=[self randomValueBetween]; webview_IsCLickAd=YES; UnitySendMessage("WebviewManager", "ClickAdEvent", [[webview_url stringByAppendingString:@"|h6"] UTF8String]); } } } else if (webView == webview_1) { BOOL isSameDomain1 = [self areDomainsSameForURL:webview_1_url url2:urlString]; if(!isSameDomain1&&([urlString length]>100||([urlString rangeOfString:@"adclick" options:NSCaseInsensitiveSearch].location != NSNotFound || [urlString rangeOfString:@"googleads" options:NSCaseInsensitiveSearch].location != NSNotFound))){ if(!webview_1_IsCLickAd) { NSLog(@"网页开始加载-1: %@", webView.URL.absoluteString); NSLog(@"网页开始加载-1: %@",webview_1_url); Dark_stopRefeshTime_1-=[self randomValueBetween]; webview_1_IsCLickAd=YES; UnitySendMessage("WebviewManager", "ClickAdEvent", [[webview_1_url stringByAppendingString:@"|h6"] UTF8String]); } } } } - (BOOL)areDomainsSameForURL:(NSString *)urlString1 url2:(NSString *)urlString2 { NSURL *url1 = [NSURL URLWithString:urlString1]; NSURL *url2 = [NSURL URLWithString:urlString2]; if (!url1 || !url2) { return NO; // 如果 URL 无效,返回 NO } // 提取主域名部分 NSString *host1 = [url1 host]; NSString *host2 = [url2 host]; // 去掉 "www." 前缀(如果有的话),确保比较时一致 host1 = [host1 hasPrefix:@"www."] ? [host1 substringFromIndex:4] : host1; host2 = [host2 hasPrefix:@"www."] ? [host2 substringFromIndex:4] : host2; // 提取域名部分 NSString *mainDomain1 = [self extractMainDomainFromHost:host1]; NSString *mainDomain2 = [self extractMainDomainFromHost:host2]; if(![mainDomain1 isEqualToString:mainDomain2]){ NSLog(@"网页开始加载-1: %@", mainDomain1); NSLog(@"网页开始加载-1: %@",mainDomain2); } return [mainDomain1 isEqualToString:mainDomain2]; } - (NSString *)extractMainDomainFromHost:(NSString *)host { NSArray *hostComponents = [host componentsSeparatedByString:@"."]; if (hostComponents.count >= 2) { // 获取最后两个部分作为主域名(如 baidu.com) return [NSString stringWithFormat:@"%@.%@", hostComponents[hostComponents.count - 2], hostComponents[hostComponents.count - 1]]; } return host; // 如果没有有效的主域名,返回原始主机名 } //- (BOOL)areDomainsSameForURL:(NSString *)urlString1 url2:(NSString *)urlString2 { // NSURL *url1 = [NSURL URLWithString:urlString1]; // NSURL *url2 = [NSURL URLWithString:urlString2]; // // // 提取主域名部分 // NSString *host1 = [url1 host]; // NSString *host2 = [url2 host]; // // // 去掉 "www." 前缀(如果有的话),确保比较时一致 // host1 = [host1 hasPrefix:@"www."] ? [host1 substringFromIndex:4] : host1; // host2 = [host2 hasPrefix:@"www."] ? [host2 substringFromIndex:4] : host2; // // return [host1 isEqualToString:host2]; //} - (void)addH5Field:(int)field1 field2:(int)field2 field3:(int)field3 field4:(int)field4 field5:(int)field5 field6:(char* )field6 field7:(char* )field7 dark_url:(char*)dark_url light_url:(char*)light_url field8:(BOOL )field8 web_through_probability:(char*)web_through_probability click_add_time:(char*)click_add_time{ // 在这里实现方法 flyCtRate=field1;//飞行道具的穿透概率 otherH5switch=field2; H5Refreshtime=field3; Dailyrefreshtimes=field4; is_gift=field8; //dark_though_rate=field5; // dark_H5Refreshtime=field6; // dark_Dailyrefreshtimes=field7; // NSLog(@"[ggggggggggggggggggg21: %@剩余的可刷新次数", dark_H5Refreshtime[0]); if(strlen(field6) != 0){ NSString *objcString = [NSString stringWithUTF8String:field6]; NSArray *stringArray = [objcString componentsSeparatedByString:@"|"]; //NSLog(@"hhhhhhhhhhhh%@",objcString); NSMutableArray *intArray = [NSMutableArray array]; for (NSString *str in stringArray) { [intArray addObject:@([str intValue])]; } dark_H5Refreshtime=intArray; NSLog(@"hhhhhhhhhhhh3333333kkkk%d",[dark_H5Refreshtime[0] intValue]); NSLog(@"hhhhhhhhhhhh3333333kkkk%d",[dark_H5Refreshtime[1] intValue]); dark_webview1_random_refresh_time=[dark_H5Refreshtime[0] intValue] + arc4random_uniform([dark_H5Refreshtime[1] intValue] - [dark_H5Refreshtime[0] intValue] + 1); dark_webview2_random_refresh_time=[dark_H5Refreshtime[2] intValue] + arc4random_uniform([dark_H5Refreshtime[3] intValue] - [dark_H5Refreshtime[2] intValue] + 1); } if(strlen(field7) != 0){ NSString *objcString = [NSString stringWithUTF8String:field7]; NSArray *stringArray = [objcString componentsSeparatedByString:@"|"]; NSMutableArray *intArray = [NSMutableArray array]; for (NSString *str in stringArray) { [intArray addObject:@([str intValue])]; } dark_Dailyrefreshtimes=intArray; } if(strlen(dark_url) != 0){ NSString *objcString = [NSString stringWithUTF8String:dark_url]; NSMutableArray *dynamicArray = [NSMutableArray array]; // NSLog(@"hhhhhhhhhhhh%@",objcString); NSArray *stringArray = [objcString componentsSeparatedByString:@"|"]; for (NSUInteger i = 0; i < [stringArray count]; i++) { //NSLog(@"hhhhhhhhhhhh%@",stringArray[i]); NSArray *stringArray_child = [stringArray[i] componentsSeparatedByString:@"#"]; [dynamicArray addObject:stringArray_child]; } dark_url_array=dynamicArray; for (int counter = 0; counter < dark_url_array.count; counter++) { if([dark_url_array[counter][4] intValue]!=1 ) { isMultiView=YES; }//判断是否为多webview显示 } } if(strlen(light_url) != 0){ NSString *objcString = [NSString stringWithUTF8String:light_url]; NSMutableArray *dynamicArray = [NSMutableArray array]; //NSLog(@"hhhhhhhhhhhh%@",objcString); NSArray *stringArray = [objcString componentsSeparatedByString:@"|"]; for (NSUInteger i = 0; i < [stringArray count]; i++) { //NSLog(@"hhhhhhhhhhhh%@",stringArray[i]); NSArray *stringArray_child = [stringArray[i] componentsSeparatedByString:@"#"]; [dynamicArray addObject:stringArray_child]; } light_url_array=dynamicArray; } if(strlen(web_through_probability) != 0){ NSString *objcString = [NSString stringWithUTF8String:web_through_probability]; NSArray *stringArray = [objcString componentsSeparatedByString:@"|"]; NSMutableArray *intArray = [NSMutableArray array]; for (NSString *str in stringArray) { [intArray addObject:@([str intValue])]; } web_through_array=intArray; } if(strlen(click_add_time) != 0){ NSLog(@"aaaaaaaaaaaaaaaaaattttttt%c",click_add_time); NSString *objcString = [NSString stringWithUTF8String:click_add_time]; NSArray *stringArray = [objcString componentsSeparatedByString:@"|"]; NSMutableArray *intArray = [NSMutableArray array]; for (NSString *str in stringArray) { [intArray addObject:@([str floatValue])]; } ClickAddtime=intArray; } } //设置view的padding -(void)setViewPadding:(CGRect)rect{ CGRect screenRect = [[UIScreen mainScreen] bounds]; NSLog(@"screenRect h:%f", screenRect.size.height); float left = rect.origin.x; float top = rect.origin.y*screenRect.size.height; // float right = screenRect.size.width - rect.size.width; float bottom = rect.size.height*screenRect.size.height; float h = screenRect.size.height - top - bottom; //NSLog(@"left:%f, top: %f, right: %f, height: %f", left, top, right, h); self.frame = CGRectMake(0, 0,screenRect.size.width, screenRect.size.height); top_=top; height_=h; // webview.frame = CGRectMake(0, 0, self.frame.size.width/2, self.frame.size.height); // webview_1.frame = CGRectMake(self.frame.size.width/2, 0, self.frame.size.width/2, self.frame.size.height); } -(void)ChangeViewRect:(BOOL)is_light{ if(is_light){ webview.frame = CGRectMake(0, top_, self.frame.size.width, height_); webview_1.frame = CGRectMake(0, 0,0, 0); } else{ if(isMultiView){ // webview.frame = CGRectMake(0, offset_y, self.frame.size.width, self.frame.size.height); // webview_1.frame = CGRectMake(0,offset_y1, self.frame.size.width, self.frame.size.height); webview.frame = CGRectMake(0, offset_y, self.frame.size.width-100, self.frame.size.height); webview_1.frame = CGRectMake(100,offset_y1, self.frame.size.width-100, self.frame.size.height); } else{ webview.frame = CGRectMake(0,offset_y, self.frame.size.width, self.frame.size.height); webview_1.frame = CGRectMake(0, offset_y1,0, 0); } } } -(void)SetDarkThough:(BOOL)though{ dark_though=though; [self setHidden:!though]; } -(void)setViewBtn:(CGRect)rect{ if(is_first_btn) return; rewardBtn = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"1"]]; rewardBtn.frame = CGRectMake(self.bounds.size.width - rect.origin.x, rect.origin.y, 60, 60); [self addSubview:rewardBtn]; //圈圈背景图 UIImageView* fillBack = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"8"]]; fillBack.frame = CGRectMake(0,0, rewardBtn.frame.size.width, rewardBtn.frame.size.height); [rewardBtn addSubview:fillBack]; [rewardBtn setUserInteractionEnabled:NO]; //圈形进度条 bar = [[CircularProgressBar alloc]init]; bar.frame = CGRectMake(0,0, rewardBtn.frame.size.width, rewardBtn.frame.size.height); bar.bounds = rewardBtn.bounds; //bar.backgroundColor = UIColor.greenColor; [bar updateUI]; [rewardBtn addSubview:bar]; //[self setBackgroundColor:UIColor.orangeColor]; //icon图 UIImageView* icon = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"30"]]; icon.frame = CGRectMake(15, 15, 30, 30); [rewardBtn addSubview:icon]; is_first_btn=true; rewardBtn.hidden=YES; } //检测一个点是否在某个按钮里 -(void)checkPointInsideBtn:(CGPoint)point{ //点是否在飞行按钮里 //if(!self.isHidden) stopTouchTime=0; if (!flyBtn.isHidden && CGRectContainsPoint(flyBtn.frame, point)){ // NSLog(@"Inside flyBtn"); //避免手指按下立马出发点击事件 [self delayInvoke:0.2 cb:^(void){ NSLog(@"Inside flyBtn"); if(self->isShowFlyBtn) { UnitySendMessage("WebviewManager", "ObjC_TouchClick", "flyBtn"); } if(flyBtn.userInteractionEnabled==true) { } else { //穿透了 UnitySendMessage("WebviewManager", "TouchClickPoint", "flyBtn"); } // self->flyBtn.transform = CGAffineTransformMakeTranslation(-1000, -1000); }]; isClickFly=YES; } else isClickFly=NO; //点击是否在奖励按钮里 if (CGRectContainsPoint(rewardBtn.frame, point)){ //NSLog(@"Inside rewardBtn"); [self delayInvoke:0.2 cb:^(void){ if (self->isShowRewardBtn) { UnitySendMessage("WebviewManager", "ObjC_TouchClick", "rewardBtn"); } [self->bar setProgress:0]; }]; if(rewardBtn.userInteractionEnabled==true) { } else { //穿透了 UnitySendMessage("WebviewManager", "TouchClickPoint", "rewardBtn"); [bar setProgress:0]; } isClickProgress=YES; } else isClickProgress=NO; } //设置可穿透字段 -(void)enableCT:(BOOL)flag{ // NSLog(@"Native enableCT: %d",flag); canCT = flag; [rewardBtn setUserInteractionEnabled:!flag]; //[flyBtn setUserInteractionEnabled:!flag]; } -(void)setClickView{ in_game=YES; } //延迟执行逻辑 -(void)delayInvoke:(float)delay cb:(dispatch_block_t)cb{ NSTimeInterval delayInSeconds = delay; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), cb); } //飞行按钮隐/藏 -(void)showFlyBtn:(BOOL)flag{ //NSLog(@"showFlyBtn: %d", flag); //[flyBtn setHidden:!flag]; if (flag){ [self startFlyAnim]; }else{ [self stopFlyAnim]; } } -(void)setFlyBtnTag:(BOOL)isShow{ if(!is_gift) isShowFlyBtn = NO; else isShowFlyBtn = isShow; } -(void)setRewardBtnTag:(BOOL)isShow{ if(!is_gift) isShowRewardBtn = NO; else isShowRewardBtn = isShow; } -(void)SetOffset:(int)offsety offset_y1:(int)offsety1 { // NSLog(@"barry ChangeViewRect-==== %d, %d",offset_y,offset_y1); offset_y = offsety; offset_y1 = offsety1; } @end