欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

截屏状态监听 - iOS

程序员文章站 2023-10-27 11:59:22
既接到电话状态监听的需求之后再次添加了截屏状态的监听,当使用 App 时若用户执行截屏操作需要对当前状态进行监听操作,下面有两种方法,其中可以替换截屏的图片内容(Plan A),也可以弹出提示框(Plan B),废话不多说步骤如下. 此次分享到此结束,希望内容能对大家实际有所帮助,有什么不足之处欢迎 ......

既接到电话状态监听的需求之后再次添加了截屏状态的监听,当使用 App 时若用户执行截屏操作需要对当前状态进行监听操作,下面有两种方法,其中可以替换截屏的图片内容(Plan A),也可以弹出提示框(Plan B),废话不多说步骤如下.

  1 #pragma mark - 监听截屏
  2 // Plan A
  3 /**
  4  监听设备截屏
  5  */
  6 - (void)registerTakeScreenShotNotice {
  7     kWeakSelf(self);
  8     NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
  9     [kNotificationCenter addObserverForName:UIApplicationUserDidTakeScreenshotNotification
 10                                      object:nil
 11                                       queue:mainQueue
 12                                  usingBlock:^(NSNotification * _Nonnull note) {
 13                                      
 14                                      NSLog(@"考试截屏");
 15                                      [weakself userDidTakeScreenshot];//屏幕响应
 16                                  }];
 17 }
 18 /**
 19  截屏响应
 20  */
 21 - (void)userDidTakeScreenshot {
 22     NSLog(@"检测到截屏");
 23     //人为操作,获取截屏图片数据
 24     UIImage *image = [self imageWithScreenshot];
 25     NSLog(@"userDidTakeScreenshot:\n%@", image);
 26     
 27     UIImageView *imageScreenshot = [[UIImageView alloc] initWithImage:image];// 此处 image 资源可根据实际需求进行操作,展示当前截屏图片或者替换成一张固定的图片方式等等等!
 28     imageScreenshot.frame = CGRectMake(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
 29     [self.wkWebView addSubview:imageScreenshot];// 展示在当前 View 层级
 30 }
 31 /**
 32  返回截屏数据
 33  
 34  @return 返回截屏数据
 35  */
 36 - (UIImage *)imageWithScreenshot {
 37     NSData *imageData = [self dataWithScreenshotInPNGFormat];
 38     return [UIImage imageWithData:imageData];
 39 }
 40 /**
 41  获取当前屏幕
 42  
 43  @return 获取当前屏幕
 44  */
 45 - (NSData *)dataWithScreenshotInPNGFormat {
 46     // Source (Under MIT License):
 47     CGSize imageSize = CGSizeZero;
 48     UIInterfaceOrientation orientation = kApplication.statusBarOrientation;
 49     if (UIInterfaceOrientationIsPortrait(orientation)) {
 50         imageSize = SCREEN_RECT.size;
 51     }
 52     else {
 53         imageSize = CGSizeMake(SCREEN_HEIGHT, SCREEN_WIDTH);
 54     }
 55     
 56     UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
 57     CGContextRef context = UIGraphicsGetCurrentContext();
 58     for (UIWindow *window in [kApplication windows]) {
 59         CGContextSaveGState(context);
 60         CGContextTranslateCTM(context, window.center.x, window.center.y);
 61         CGContextConcatCTM(context, window.transform);
 62         CGContextTranslateCTM(context, -window.bounds.size.width * window.layer.anchorPoint.x, -window.bounds.size.height * window.layer.anchorPoint.y);
 63         
 64         // Correct for the screen orientation
 65         if (orientation == UIInterfaceOrientationLandscapeLeft) {
 66             CGContextRotateCTM(context, M_PI_2);
 67             CGContextTranslateCTM(context, 0, -imageSize.width);
 68         }
 69         else if (orientation == UIInterfaceOrientationLandscapeRight) {
 70             CGContextRotateCTM(context, -M_PI_2);
 71             CGContextTranslateCTM(context, -imageSize.height, 0);
 72         }
 73         else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
 74             CGContextRotateCTM(context, M_PI);
 75             CGContextTranslateCTM(context, -imageSize.width, -imageSize.height);
 76         }
 77         
 78         if ([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
 79             [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES];
 80         }
 81         else {
 82             [window.layer renderInContext:context];
 83         }
 84         
 85         CGContextRestoreGState(context);
 86     }
 87     
 88     UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
 89     UIGraphicsEndImageContext();
 90     
 91     return UIImagePNGRepresentation(image);
 92 }
 93  
 94 // Plan B
 95 - (void)intercepScreenshots {
 96 //    kWeakSelf(self);
 97 //    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
 98 //    [kNotificationCenter addObserverForName:UIApplicationUserDidTakeScreenshotNotification object:nil queue:mainQueue usingBlock:^(NSNotification * _Nonnull note) {
 99 //        [weakself checkScreenshots];
100 //    }];
101     [kNotificationCenter addObserver:self
102                             selector:@selector(checkScreenshots)
103                                 name:UIApplicationUserDidTakeScreenshotNotification
104                               object:nil];
105 }
106 - (void)checkScreenshots {
107     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示"
108                                                         message:@"勿截图"
109                                                        delegate:self
110                                               cancelButtonTitle:@"YES"
111                                               otherButtonTitles:@"NO", nil];
112     [alertView show];
113 }

 


 

此次分享到此结束,希望内容能对大家实际有所帮助,有什么不足之处欢迎指点共同进步!