147 lines
4.8 KiB
Plaintext
147 lines
4.8 KiB
Plaintext
import { NotificationCenter } from 'Foundation';
|
||
import { CGRect } from "CoreFoundation";
|
||
import { UIApplication, UIView, UITextField, UIScreen, UIDevice } from "UIKit"
|
||
import { UTSiOS } from "DCloudUTSFoundation"
|
||
import { DispatchQueue } from 'Dispatch';
|
||
import { SetUserCaptureScreenOptions, OnUserCaptureScreenCallbackResult, OnUserCaptureScreen, OffUserCaptureScreen, SetUserCaptureScreen, UserCaptureScreenCallback, SetUserCaptureScreenSuccess, SetUserCaptureScreenFail } from "../interface.uts"
|
||
|
||
/**
|
||
* 定义监听截屏事件工具类
|
||
*/
|
||
class CaptureScreenTool {
|
||
static listener : UserCaptureScreenCallback | null;
|
||
static secureView : UIView | null;
|
||
|
||
// 监听截屏
|
||
static listenCaptureScreen(callback : UserCaptureScreenCallback | null) {
|
||
this.listener = callback
|
||
|
||
// 注册监听截屏事件及回调方法
|
||
// target-action 回调方法需要通过 Selector("方法名") 构建
|
||
const method = Selector("userDidTakeScreenshot")
|
||
NotificationCenter.default.addObserver(this, selector = method, name = UIApplication.userDidTakeScreenshotNotification, object = null)
|
||
}
|
||
|
||
// 捕获截屏回调的方法
|
||
// target-action 的方法前需要添加 @objc 前缀
|
||
@objc static userDidTakeScreenshot() {
|
||
// 回调
|
||
const res: OnUserCaptureScreenCallbackResult = {
|
||
}
|
||
this.listener?.(res)
|
||
}
|
||
|
||
// 移除监听事件
|
||
static removeListen(callback : UserCaptureScreenCallback | null) {
|
||
this.listener = null
|
||
NotificationCenter.default.removeObserver(this)
|
||
}
|
||
|
||
static createSecureView() : UIView | null {
|
||
let field = new UITextField(frame = CGRect.zero)
|
||
field.isSecureTextEntry = true
|
||
if (field.subviews.length > 0 && UIDevice.current.systemVersion != '15.1') {
|
||
let view = field.subviews[0]
|
||
view.subviews.forEach((item) => {
|
||
item.removeFromSuperview()
|
||
})
|
||
view.isUserInteractionEnabled = true
|
||
return view
|
||
}
|
||
return null
|
||
}
|
||
|
||
// 开启防截屏
|
||
static onAntiScreenshot(option : SetUserCaptureScreenOptions) {
|
||
// uts方法默认会在子线程中执行,涉及 UI 操作必须在主线程中运行,通过 DispatchQueue.main.async 方法可将代码在主线程中运行
|
||
DispatchQueue.main.async(execute = () : void => {
|
||
let secureView = this.createSecureView()
|
||
let window = UTSiOS.getKeyWindow()
|
||
let rootView = window.rootViewController == null ? null : window.rootViewController!.view
|
||
if (secureView != null && rootView != null) {
|
||
let rootSuperview = rootView!.superview
|
||
if (rootSuperview != null) {
|
||
this.secureView = secureView
|
||
rootSuperview!.addSubview(secureView!)
|
||
rootView!.removeFromSuperview()
|
||
secureView!.addSubview(rootView!)
|
||
let rect = rootView!.frame
|
||
secureView!.frame = UIScreen.main.bounds
|
||
rootView!.frame = rect
|
||
}
|
||
}
|
||
let res: SetUserCaptureScreenSuccess = {
|
||
}
|
||
option.success?.(res)
|
||
option.complete?.(res)
|
||
})
|
||
}
|
||
|
||
// 关闭防截屏
|
||
static offAntiScreenshot(option : SetUserCaptureScreenOptions) {
|
||
DispatchQueue.main.async(execute = () : void => {
|
||
if (this.secureView != null) {
|
||
let window = UTSiOS.getKeyWindow()
|
||
let rootView = window.rootViewController == null ? null : window.rootViewController!.view
|
||
if (rootView != null && this.secureView!.superview != null) {
|
||
let rootSuperview = this.secureView!.superview
|
||
if (rootSuperview != null) {
|
||
rootSuperview!.addSubview(rootView!)
|
||
this.secureView!.removeFromSuperview()
|
||
}
|
||
}
|
||
this.secureView = null
|
||
}
|
||
let res: SetUserCaptureScreenSuccess = {
|
||
}
|
||
option.success?.(res)
|
||
option.complete?.(res)
|
||
})
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 开启截图监听
|
||
*/
|
||
export const onUserCaptureScreen : OnUserCaptureScreen = function (callback : UserCaptureScreenCallback | null) {
|
||
CaptureScreenTool.listenCaptureScreen(callback)
|
||
}
|
||
|
||
/**
|
||
* 关闭截屏监听
|
||
*/
|
||
export const offUserCaptureScreen : OffUserCaptureScreen = function (callback : UserCaptureScreenCallback | null) {
|
||
CaptureScreenTool.removeListen(callback)
|
||
}
|
||
|
||
/**
|
||
* 开启/关闭防截屏
|
||
*/
|
||
export const setUserCaptureScreen : SetUserCaptureScreen = function (options : SetUserCaptureScreenOptions) {
|
||
if (UIDevice.current.systemVersion < "13.0") {
|
||
let res: SetUserCaptureScreenFail = {
|
||
errCode: 12001,
|
||
errSubject: "uni-usercapturescreen",
|
||
errMsg: "setUserCaptureScreen:system not support"
|
||
}
|
||
options.fail?.(res);
|
||
options.complete?.(res);
|
||
|
||
} else if (UIDevice.current.systemVersion == "15.1") {
|
||
let res: SetUserCaptureScreenFail = {
|
||
errCode: 12010,
|
||
errSubject: "uni-usercapturescreen",
|
||
errMsg: "setUserCaptureScreen:system internal error"
|
||
}
|
||
options.fail?.(res);
|
||
options.complete?.(res);
|
||
} else {
|
||
if (options.enable == true) {
|
||
CaptureScreenTool.offAntiScreenshot(options)
|
||
} else {
|
||
CaptureScreenTool.onAntiScreenshot(options)
|
||
}
|
||
}
|
||
}
|
||
|