1. 程式人生 > >iOS 防止錄屏和截圖的監聽

iOS 防止錄屏和截圖的監聽

iOS實現不了不讓截圖或者錄屏,但是提供的截圖或者錄屏的監聽方法,我們也可以通過監聽方法來拿到截圖的圖片,為此參考了支付寶和微信支付時,截圖的處理方式。

 通過上圖發現,其實圖片都已經儲存到本地相簿中,程式監聽到了截圖的事件,然後給予友好的提示,接下來說下實現的方法。

截圖狀態獲取

編輯相簿中最新照片的方法iOS8之後就已經失效,框架“Photos”也在iOS10之後失效。

搜尋發現UIApplication中僅有使用者截圖後的通知,應用中只會收到已經截圖的通知並沒辦法干預。

?

1

2

// This notification is posted after the user takes a screenshot (for example by pressing both the home and lock screen buttons)

UIKIT_EXTERN NSNotificationName const UIApplicationUserDidTakeScreenshotNotification NS_AVAILABLE_IOS(7_0);

雖然無法直接干預,但可以知道使用者截圖了就可以用其它的方式來限制使用者的行為或者彈出提示告訴使用者。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

-(void)viewDidAppear:(

BOOL)animated{

[super viewDidAppear:animated];

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(screenshots) name:UIApplicationUserDidTakeScreenshotNotification object:nil];

}

-(void)screenshots

{

UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:nil message:@

"[安全提醒]該功能用於收付款時使用。不要截圖,錄製或分享給他人以保障資金賬戶安全。" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"確定", nil];

[alert1 show];

-(void)dealloc

{

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationUserDidTakeScreenshotNotification object:nil];

}

錄屏狀態獲取

iOS 11中新增了錄屏功能,之前的系統要想錄屏,只能通過Airplay 或者螢幕映象軟體,例如 Reflector。有了錄屏功能確實方便了使用者,但對於一些做內容的公司和網站,特別是視訊網站,並不希望自己的付費視訊被錄製並在網際網路上傳播。

iOS 11 SDK 中新增了UIScreen的API用以告知應用當前螢幕正在錄屏。當UIScreen.isCaptured 為true時,表示當前螢幕正在被錄製、映象或被Airplay 傳送。

當錄屏狀態發生變化時,UIKit會發送UIScreenCapturedDidChange的notification,該notification的object引數即為isCaptured屬性發生變化的 UIScreen物件,另外,notification沒有userInfo引數。

我們可以在應用中接收此通知,來對使用者的錄屏行為做相應的處理。比如,在視訊app中,我們可以新增通知來監測 UIScreen.isCaptured 的變化,當UIScreen.isCaptured為true時,暫停視屏播放,並彈出提示告知使用者,由於正在錄屏,不予播放視屏。

基於此,我們可以在應用中接收此通知,來對使用者的錄屏行為做相應的處理

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

-(void)viewWillAppear:(BOOL)animated{

[super viewWillAppear:animated];

// 監測當前裝置是否處於錄屏狀態

UIScreen * sc = [UIScreen mainScreen];

if (@available(iOS 11.0, *)) {

if (sc.isCaptured) {

[self screenshots];

}

} else {

// Fallback on earlier versions

}

if (@available(iOS 11.0, *)) {

// 檢測到當前裝置錄屏狀態發生變化

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(screenshots) name:UIScreenCapturedDidChangeNotification object:nil];

} else {

// Fallback on earlier versions

}

}

-(void) screenshots

{

UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:nil message:@"[安全提醒]該功能用於收付款時使用。不要截圖,錄製或分享給他人以保障資金賬戶安全。" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"確定", nil];

[alert1 show];

-(void)dealloc

{

if (@available(iOS 11.0, *)) {

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIScreenCapturedDidChangeNotification object:nil];

} else {

// Fallback on earlier versions

}

}

上述監測錄屏狀態只是在iOS11之後,而且只是單單的檢測到錄屏狀態並且沒有辦法去關閉錄屏狀態或者修改錄製到的內容。

找了一些資料,沒有找到實現如果截圖後讓截圖存在本地相簿的圖片變為黑色和錄屏支援所有系統版本的方法,哪位大牛有相關的程式碼實現或者思路,請告知參考下。