微信可以检测到用户截屏行为(Home + Power),并在稍后点击附加功能按钮时询问用户是否要发送刚才截屏的图片,这个用户体验非常好。于是乎, 我也想着实现这个功能。


在iOS7之前, 如果用户截屏,系统会自动取消屏幕上的所有 touch 事件,(使用 touchesCancelled:withEvent: 这个方法)那么我们就可以检测这个方法的调用,然后加载本地最新图片再加以判断来实现我们的目的。但在 iOS 7 之后,截屏不再会取消屏幕的 touch 事件,所以导致了 Snapchat 和 Facebook Poke 之类的应用在 iOS 7 刚发布时依赖于系统这个行为的功能受到影响。

如果不采取任何新措施, 我们可以让应用启动后在后台循环检测相册内最新一张照片,看它的是否符合截屏的特征。这种方法可行,但这是个笨方法,需要用户允许你的程序访问相册才可以,并且一直在后台循环会消耗更多的系统资源。

当然, 苹果封闭了一些东西, 肯定也会给你开放其他东西, 不会让你走上绝路的。

iOS7提供一个崭新的推送方法:UIApplicationUserDidTakeScreenshotNotification。只要像往常一样订阅即可知道什么时候截图了。
注意:UIApplicationUserDidTakeScreenshotNotification 将会在截图完成之后显示。现在在截图截取之前无法得到通知。

希望苹果会在iOS8当中增加 UIApplicationUserWillTakeScreenshotNotification。(只有did, 没有will显然不是苹果的风格...)

下面就写了个小demo, 检测用户截屏, 并且获取截屏照片, 显示在右下角。

(需要在真机上运行, 至少, 模拟器上我不知道如何模拟截屏行为(Home + Power), 如果你知道, 还望告知)


源码git下载链接:colin1994/TakeScreenshotTest

一。注册通知:

    //注册通知    [[NSNotificationCenter defaultCenter] addObserver:self                                             selector:@selector(userDidTakeScreenshot:)                                                 name:UIApplicationUserDidTakeScreenshotNotification object:nil];

二。监听截屏:

执行操作, 也就是实现上面通知对应的响应函数  -- userDidTakeScreenshot

//截屏响应- (void)userDidTakeScreenshot:(NSNotification *)notification{    NSLog(@"检测到截屏");        //人为截屏, 模拟用户截屏行为, 获取所截图片    UIImage *image_ = [self imageWithScreenshot];        //添加显示    UIImageView *imgvPhoto = [[UIImageView alloc]initWithImage:image_];    imgvPhoto.frame = CGRectMake(self.window.frame.size.width/2, self.window.frame.size.height/2, self.window.frame.size.width/2, self.window.frame.size.height/2);        //添加边框    CALayer * layer = [imgvPhoto layer];    layer.borderColor = [                         [UIColor whiteColor] CGColor];    layer.borderWidth = 5.0f;    //添加四个边阴影    imgvPhoto.layer.shadowColor = [UIColor blackColor].CGColor;    imgvPhoto.layer.shadowOffset = CGSizeMake(0, 0);    imgvPhoto.layer.shadowOpacity = 0.5;    imgvPhoto.layer.shadowRadius = 10.0;    //添加两个边阴影    imgvPhoto.layer.shadowColor = [UIColor blackColor].CGColor;    imgvPhoto.layer.shadowOffset = CGSizeMake(4, 4);    imgvPhoto.layer.shadowOpacity = 0.5;    imgvPhoto.layer.shadowRadius = 2.0;    [self.window addSubview:imgvPhoto];}

我这里的 userDidTakeScreenshot 总共做了3件事

1.打印检测到截屏

2.获取截屏图片。调用[self imageWithScreenshot]; 这里的imageWithScreenshot是人为截屏, 模拟用户截屏操作, 获取截屏图片。

3.显示截屏图片, 以屏幕1/4大小显示在右下角, 并且加上白色边框和阴影效果突出显示。

三。获取截屏图片

/** *  截取当前屏幕 * *  @return NSData * */- (NSData *)dataWithScreenshotInPNGFormat{    CGSize imageSize = CGSizeZero;    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;    if (UIInterfaceOrientationIsPortrait(orientation))        imageSize = [UIScreen mainScreen].bounds.size;    else        imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width);        UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);    CGContextRef context = UIGraphicsGetCurrentContext();    for (UIWindow *window in [[UIApplication sharedApplication] 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);        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);}/** *  返回截取到的图片 * *  @return UIImage * */- (UIImage *)imageWithScreenshot{    NSData *imageData = [self dataWithScreenshotInPNGFormat];    return [UIImage imageWithData:imageData];}

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

iOS开发-检测用户截屏 并获取所截图片相关推荐

  1. ios——如何完成截屏操作并将截屏结果保存到设备本地相册

    ios工程--(UIView)获取设备相册权限截取屏幕内容并保存到设备本地相册 设备/引擎:Mac(11.6)/cocos 开发工具:Xcode(13.0) 开发需求:对某个玩法进行截屏操作,并以图片 ...

  2. ios截屏功能html,滚动截屏APP - iPhone上的长截图工具

    话说长截图功能也算是一种刚需了,如今安卓好多手机系统都会自带此功能.很难想象的是,安卓手机标配的「长截图」功能,对果粉来说是多么的奢侈.iPhone没有自带的长截图功能,只能借助第三方APP,比如Ta ...

  3. android悬浮球截屏,vivoX27怎么双击悬浮球截屏?获取屏幕截图依旧方便快速!

    在此前一段时间中,iphone手机有一项功能在抖音中非常的火爆,那就是双击iphone的小白点进行截图的功能,让你不再依赖于截屏快捷键或是实体快捷键也能进行轻松的截图. 而今天我们要说的,是vivoX ...

  4. 滚动截屏软件_华为指关节截屏不如三指截屏好用?一步到位,实践出真知

    华为手机的指关节截屏功能想必只要是用过的朋友都知道,熟悉的朋友更会以此为依赖,比如我,现在换了个其他品牌手机用,一到截屏的时候还是会不由自主地拿指关节划区截屏,因为指关节截屏不仅仅是双击截屏,这个划区 ...

  5. Windows定时截屏、后台自动截屏工具,带有密码保护功能 —— 定时执行专家

    目录 一.软件简介 二.使用教程 1.软件下载 2.软件的安装方法 3.无察觉自动截屏(例如:间隔每 10分钟,执行 1次) 一.软件简介 <定时执行专家>是一款制作精良.功能强大.简单易 ...

  6. 华为Android10版怎么截屏,华为Mate 10怎么截屏 三种智能截屏方式图文教程

    相信所有用户在使用手机的过程中都会使用到截屏功能,那么在华为新款旗舰Mate10 上如何截屏,共有哪些截屏方式呢?下面就让小编给大家带来最详细的Mate10 智能截屏教程. 相信,华为的老用户们应该都 ...

  7. IOS开发基础之使用AFNetworking框架下载服务器资源图片

    IOS开发基础之使用AFNetworking框架下载服务器资源图片 info.plist加入这句 <key>NSAppTransportSecurity</key> <d ...

  8. 计算机图片怎么截图快捷键,电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图?...

    电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图? 网际百科资讯    知识宝库    2020-3-18    43955    0评论 电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图?给你推 ...

  9. 推荐一款截屏翻译工具|截屏提取文字|划词翻译

    推荐一款截屏翻译工具|截屏提取文字|划词翻译   大家有没有过这样的经历,搜索一篇阅读心得或者心得体会的时候,看到自己感兴趣的一篇文章,打算复制下来上交"任务"时,发现复制不了,连 ...

最新文章

  1. [置顶] ros的navigation之———gmapping应用详解(in ros)
  2. shiro 实现登录验证功能
  3. 羽毛球双打“七宗罪”~很详细!
  4. Android中的Handler总结
  5. 项目权限管理大纲(RBAC+SpringSecurity)
  6. IBM MQ Explore使用
  7. 随想录(搭建自己嵌入式项目的编译系统)
  8. 如果 AI 技术可以让你永生,你愿意么?
  9. Java项目的命名规范
  10. 怎样才能查到4S店保养记录,4S店维修保养记录怎样查询,Javascript学习指南
  11. 第7周 文件和数据格式化
  12. 为何现在只剩下 风吹乱我的发
  13. mp4转换m3u8格式php,m3u8格式怎么转换mp4 ts格式转换 - 下载的m3u8、ts如何转换成mp4...
  14. 全栈工程师需要了解掌握的技术栈
  15. excel表格打印每页都有表头_分享|1分钟学会,让打印的表格每页自带标题行
  16. 微信V3版本支付下单、查询支付订单状态、订单退款接入正式项目中并引入策略模式实操
  17. MySQL优化那些事
  18. nyoj 1273 宣传墙
  19. 如何系统地自学python100天_Github上发布了一个Python学习秘笈,从萌新到王者的100天Python学习之旅...
  20. JAVA 基本数据结构--数组、链表、ArrayList、Linkedlist、hashmap、hashtab等

热门文章

  1. 京东T7开创“新算法宝典”,图文并茂,全新演绎,太酷了
  2. 联想YOGA Pro14s酷睿版和华硕灵耀Pro14 2022酷睿版的区别 选哪个好
  3. 联通押宝iPhone 4到底是福是祸?
  4. opencv中CV_8UC3什么意思
  5. EXCEL 下拉时不使用自动增加
  6. 4.30-5.1cf补题
  7. 教你用AI十步绘制一个小清新的风车插画
  8. c语言冷门小知识,C/C++冷门知识点你知道多少呢?
  9. ChatGPT机会与变现大全
  10. 大文件读写优化问题。现有两个文件,一个837M的order.tbl,一个3.62G的lineitem.tbl,对这两个表进行嵌套连接