既接到电话状态监听的需求之后再次添加了截屏状态的监听, 当使用 App 时若用户执行截屏操作需要对当前状态进行监听操作, 下面有两种方法, 其中可以替换截屏的图片内容 (Plan A), 也可以弹出提示框 (Plan B), 废话不多说步骤如下.
- #pragma mark - 监听截屏
- // Plan A
- /**
- 监听设备截屏
- */
- - (void)registerTakeScreenShotNotice {
- kWeakSelf(self);
- NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
- [kNotificationCenter addObserverForName:UIApplicationUserDidTakeScreenshotNotification
- object:nil
- queue:mainQueue
- usingBlock:^(NSNotification * _Nonnull note) {
- NSLog(@"考试截屏");
- [weakself userDidTakeScreenshot];// 屏幕响应
- }];
- }
- /**
- 截屏响应
- */
- - (void)userDidTakeScreenshot {
- NSLog(@"检测到截屏");
- // 人为操作, 获取截屏图片数据
- UIImage *image = [self imageWithScreenshot];
- NSLog(@"userDidTakeScreenshot:\n%@", image);
- UIImageView *imageScreenshot = [[UIImageView alloc] initWithImage:image];// 此处 image 资源可根据实际需求进行操作, 展示当前截屏图片或者替换成一张固定的图片方式等等等!
- imageScreenshot.frame = CGRectMake(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
- [self.wkwebView addSubview:imageScreenshot];// 展示在当前 View 层级
- }
- /**
- 返回截屏数据
- @return 返回截屏数据
- */
- - (UIImage *)imageWithScreenshot {
- NSData *imageData = [self dataWithScreenshotInPNGFormat];
- return [UIImage imageWithData:imageData];
- }
- /**
- 获取当前屏幕
- @return 获取当前屏幕
- */
- - (NSData *)dataWithScreenshotInPNGFormat {
- // Source (Under MIT License):
- CGSize imageSize = CGSizeZero;
- UIInterfaceOrientation orientation = kApplication.statusBarOrientation;
- if (UIInterfaceOrientationIsPortrait(orientation)) {
- imageSize = SCREEN_RECT.size;
- }
- else {
- imageSize = CGSizeMake(SCREEN_HEIGHT, SCREEN_WIDTH);
- }
- UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
- CGContextRef context = UIGraphicsGetCurrentContext();
- for (UIWindow *window in [kApplication windows]) {
- CGContextSaveGState(context);
- CGContextTranslateCTM(context, window.center.x, window.center.y);
- CGContextConcatCTM(context, window.transform);
- CGContextTranslateCTM(context, -window.bounds.size.width * window.layer.anchorPoint.x, -window.bounds.size.height * window.layer.anchorPoint.y);
- // Correct for the screen orientation
- if (orientation == UIInterfaceOrientationLandscapeLeft) {
- CGContextRotateCTM(context, M_PI_2);
- CGContextTranslateCTM(context, 0, -imageSize.width);
- }
- else if (orientation == UIInterfaceOrientationLandscapeRight) {
- CGContextRotateCTM(context, -M_PI_2);
- CGContextTranslateCTM(context, -imageSize.height, 0);
- }
- else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
- CGContextRotateCTM(context, M_PI);
- CGContextTranslateCTM(context, -imageSize.width, -imageSize.height);
- }
- if ([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
- [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES];
- }
- else {
- [window.layer renderInContext:context];
- }
- CGContextRestoreGState(context);
- }
- UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return UIImagePNGRepresentation(image);
- }
- // Plan B
- - (void)intercepScreenshots {
- // kWeakSelf(self);
- // NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
- // [kNotificationCenter addObserverForName:UIApplicationUserDidTakeScreenshotNotification object:nil queue:mainQueue usingBlock:^(NSNotification * _Nonnull note) {
- // [weakself checkScreenshots];
- // }];
- [kNotificationCenter addObserver:self
- selector:@selector(checkScreenshots)
- name:UIApplicationUserDidTakeScreenshotNotification
- object:nil];
- }
- - (void)checkScreenshots {
- UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示"
- message:@"勿截图"
- delegate:self
- cancelButtonTitle:@"YES"
- otherButtonTitles:@"NO", nil];
- [alertView show];
- }
此次分享到此结束, 希望内容能对大家实际有所帮助, 有什么不足之处欢迎指点共同进步!
来源: http://www.bubuko.com/infodetail-2720733.html