首先声明下面的技术方案并非我的原创,也是通过百度搜索并验证是可行的,并把具体实现方式公布出来,希望可以帮到有同样需求的小伙伴门,共同进步~~

需求:为IOS自已开发的应用的所有画面添加防截屏、防录制的功能

解决依据是根据UITextField只要设置了setSecureTextEntry为true后,在进行录屏或者截屏的时候都会被系统隐去。

由于我们的app中即有非故事板画面又有故事板画面,所以只能一个画面一个画面的添加; 也可以创建一个非故事板类型的超类,来负责自动替换根UIView。

解决方案:

1、如果是非故事板类型的ViewController,在viewDidLoad方法开始处将self.view替换为防截屏的UIView,参见下面的示例代码:

- (void)viewDidLoad {[super viewDidLoad];// 防截屏UITextField *bgTextField = [[UITextField alloc] init];[bgTextField setSecureTextEntry:true];UIView *bgView = bgTextField.subviews.firstObject;[bgView setUserInteractionEnabled:true];self.view = bgView;// 其它初始化代码
}

2、如果是故事板类型的ViwController的,需要将故事板中将UIView改为SecurityScreenShortView(通过继承UIView后,在初始化方法中初始化防截屏安全区)即可,过程如下所示:
  1)、打开故事板设计画面;
  2)、选中相应ViewController的根UIView;
  3)、在最右侧设计器中将Class中的UIView改为SecurityScreenShortView后保存即可

SecurityScreenShortView.h

//
//  SecurityScreenShortView.h
//
//  Created by 杜燕军 on 2022/8/1.
//#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN
API_AVAILABLE(ios(13.2))
@interface SecurityScreenShortView : UIView@property (nonatomic, strong) UITextField *textField;
@property (nonatomic, strong) UIView *safeZone;+ (UIView *)creactWithFrame:(CGRect)frame;
@endNS_ASSUME_NONNULL_END

SecurityScreenShortView.m

//
//  SecurityScreenShortView.m
//
//  Created by 杜燕军 on 2022/8/1.
//#import "SecurityScreenShortView.h"@implementation SecurityScreenShortView+ (UIView *)creactWithFrame:(CGRect)frame {return [[SecurityScreenShortView alloc] initWithFrame:frame];
}- (instancetype)initWithCoder:(NSCoder *)coder {self = [super initWithCoder:coder];if (self) {[self addSafeZoneView];}return self;
}- (instancetype)initWithFrame:(CGRect)frame {self = [super initWithFrame:frame];if (self) {[self addSafeZoneView];}return self;
}- (void)addSafeZoneView {[self addSubview:self.safeZone];UILayoutPriority lowPriority = UILayoutPriorityDefaultLow - 1;UILayoutPriority heightPriority = UILayoutPriorityDefaultHigh - 1;self.safeZone.translatesAutoresizingMaskIntoConstraints = NO;[self.safeZone setContentHuggingPriority:lowPriority forAxis:UILayoutConstraintAxisVertical];[self.safeZone setContentHuggingPriority:lowPriority forAxis:UILayoutConstraintAxisHorizontal];[self.safeZone setContentCompressionResistancePriority:heightPriority forAxis:UILayoutConstraintAxisVertical];[self.safeZone setContentCompressionResistancePriority:heightPriority forAxis:UILayoutConstraintAxisHorizontal];[self addConstraints:@[[NSLayoutConstraint constraintWithItem:self.safeZone attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1 constant:0],[NSLayoutConstraint constraintWithItem:self.safeZone attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1 constant:0],[NSLayoutConstraint constraintWithItem:self.safeZone attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1 constant:0],[NSLayoutConstraint constraintWithItem:self.safeZone attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTrailing multiplier:1 constant:0],]];
}- (void)addSubview:(UIView *)view {if (self.safeZone == view) {[super addSubview:view];}else{[self.safeZone addSubview:view];}
}- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index {if (self.safeZone == view) {[super insertSubview:view atIndex:index];}else{[self.safeZone insertSubview:view atIndex:index];}
}- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview {if (self.safeZone == view) {[super insertSubview:view aboveSubview:siblingSubview];}else{[self.safeZone insertSubview:view aboveSubview:siblingSubview];}
}- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview {if (self.safeZone == view) {[super insertSubview:view belowSubview:siblingSubview];}else{[self.safeZone insertSubview:view belowSubview:siblingSubview];}
}- (UITextField *)textField{if(!_textField){_textField = [[UITextField alloc]init];_textField.secureTextEntry = YES;_textField.enabled = NO;}return _textField;
}- (UIView *)safeZone{if(!_safeZone){// 获取配置参数“是否开启防截屏”,默认值是0(未开启防截屏功能)此处不需要可以删除int noScreenShortEnable = [[ParamManager manager] getIntParam:@“noScreen” :0];if (noScreenShortEnable == 1) {// 防截屏_safeZone = self.textField.subviews.firstObject ?: [[UIView alloc] init];_safeZone.userInteractionEnabled = YES;for (UIView *v in _safeZone.subviews) {[v removeFromSuperview];}} else {// 非防截屏_safeZone = [[UIView alloc] init];}        }return _safeZone;
}@end

故事板设置参照图

引用的方案链接:

1、简书-shyizne 【iOS防截屏-完全解决】

2、由于github故障的原因,所以故事板的链接找不到了;

IOS APP画面防截屏相关推荐

  1. Android App内部防截屏技术

    我胡汉三又回来了!! 日常吐槽: 又有新需求了感觉特别坑,身为一名开发者,我怎么看不懂需求是什么鬼 求大佬带!! 这个是我的第二篇博客,我写博客呢并不是为了出名,我就是单纯的把我出过的问题搞上来,等下 ...

  2. iOS安全之防止手机截屏/录屏导致泄密的方案: iOS11之后防止用户录屏方案、基于DRM防截屏/录屏 | 蓄力计划

    文章目录 前言 I.防止手机截屏泄密方案 1.1 应用被挂起时,在当前页面添加一层高斯模糊 1.2 监听收款码界面截图,对付款码进行高斯模糊,防止信息泄露 1.3 iOS11之后防止用户录屏方案 1. ...

  3. uni-app 实现安卓防截屏(整个应用或某个页面)

    uni-app 实现安卓防截屏 如果想要在App中全局禁止截屏,那么可以在App.vue中调用. 如果想要某个页面防截屏就在某个页面调用,但是在离开这个页面的时候要恢复截屏,否则全局还是禁止截屏的状态 ...

  4. uni-app app上实现截屏保存图片到本地

    uni-app app上实现截屏保存图片到本地 uni-app app上实现截屏保存图片到本地 <template> <view class="content"& ...

  5. ios android 截屏 分享,iOS 系统自带截屏分享

    分享一篇iOS系统自带截屏分享 使用方案 UIImage *image = [KJTools kj_shareWithHideBlock:^bool{ /// 隐藏不需要截图的区域 return YE ...

  6. Android防录屏防截屏功能失效、不起作用

    有关Android防录屏功能网上有很多资料,在这里还是稍微说一下,实现方法就是在Activity.onCreate中,添加以下代码: getWindow().addFlags(WindowManage ...

  7. iOS开发-检测用户截屏 并获取所截图片

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

  8. iOS 系统自带截屏分享

    分享一篇iOS系统自带截屏分享 使用方案 UIImage *image = [KJTools kj_shareWithHideBlock:^bool{/// 隐藏不需要截图的区域return YES; ...

  9. 自己制作精美的App Store 软件截屏

    当用户搜索到App的时候,一般都会先看截图,如果截图效果不好,可能用户就不会下载. 不想自己辛苦写的认为还不错的软件,因为截图的原因,而降低了很多下载量吧. 轻轻松松做出这样高大上的截屏效果来. Sc ...

最新文章

  1. 模型的第一层:详解torch.nn.Embedding和torch.nn.Linear
  2. 分析动态代理给Spring事务埋下的坑
  3. python写用用户名密码程序_Python创建用户名和密码程序
  4. 某一列高度变化_高度近视,老了后会瞎吗?
  5. (转载)解决umount: /home: device is busy
  6. python散点图拟合曲线-使用python通过点拟合曲线
  7. Flex网站作品“妙句网”简化版推出(服务端为.Net WebService)
  8. 问题之mybatis-plus中的TableField、Tableld的区别
  9. .net core 基于 IHostedService 实现定时任务
  10. ubuntu mysql集群搭建_ubuntu server部署mysql集群
  11. python简单选择排序_Python实现冒泡,插入,选择排序简单实例
  12. Kali WiFi嗅探破解与字典生成
  13. OpenGL超级宝典(第7版)之第八章基元处理
  14. 抖音实战~手机号一键注册登录流程(验证码)
  15. Echarts带渐变色的折线图
  16. csf格式转换--逼自己一把
  17. 自动化!windows端自动化抢购茅台python脚本
  18. 国际象棋棋盘64个格子能容纳多少粒米
  19. MapX系列-- 开源Mitab
  20. C#窗体猜数字小游戏AB

热门文章

  1. 一维到三维的推广(1D and 3D generalizations of models)
  2. Android 5.1 长按power键流程分析
  3. Super expression must either be null or a function错误
  4. [BUGKU] [REVERSE] 逆向入门
  5. Oracle日期格式转换 to_date,to_char,to_timetamp 相互转换
  6. 无尽神域服务器维护,关于对无尽神域的感受亲爱的无尽神域开发团队:
  7. Ubuntu还需要做什么才能替代Windows
  8. 工厂自动化系统,架构设计图
  9. Java实现生成和解析二维码
  10. nodejs生成二维码