前言
想必很多同學(xué)都有遇到過或者想過怎么能防止系統(tǒng)截圖,但通過大量的搜索并沒有找到具體的實(shí)現(xiàn)方案雁竞。
一俩块、 常見方案
1.1 系統(tǒng)通知
UIApplication.userDidTakeScreenshotNotification
這個(gè)系統(tǒng)通知是在完成截屏動(dòng)作后,系統(tǒng)給到 App
的浓领,在收到這個(gè)通知后做處理玉凯,并不能達(dá)到防護(hù)的效果。
微信的付款嗎就是這樣的實(shí)現(xiàn)联贩,在截屏后提供一個(gè)警示內(nèi)容漫仆。
1.2 小紅書
在使用小紅書的截屏的時(shí)候頂部狀態(tài)欄會(huì)添加一個(gè)小紅書的水印如下圖:
它是怎么實(shí)現(xiàn)的呢?我有兩個(gè)猜測:
第一種:水印一直在泪幌,劉海后面
因?yàn)榉莿⒑F翛]有這個(gè)水印盲厌,所以估計(jì)是這樣,但是通過切換到任務(wù)管理器狀態(tài)并沒有看到有那個(gè)水印祸泪。
第二種:通過什么黑科技加上的吗浩?
不是第一種,難道真的是又什么黑科技没隘?
繼續(xù)驗(yàn)證
我覺得肯定是第一種懂扼,覺得任務(wù)切換的狀態(tài)下是不是那個(gè)水印被系統(tǒng)隱藏掉。想道還有 QuickTime 可以投屏來驗(yàn)證。
破案阀湿,果然是藏在劉海后面的赶熟,沒有繼續(xù)深入的價(jià)值了??♂?。
1.3 ScreenShieldKit
在尋找解決方案的時(shí)候發(fā)現(xiàn)了這樣一個(gè)SDK ScreenShieldKit
Contact us for more information and to receive a free evaluation SDK!
這句話一看就是收錢的了陷嘴,抱著能白嫖絕不三連的宗旨映砖,先略過暫不深入研究。(開玩笑灾挨,如果你覺得我的方案不錯(cuò)邑退,本文求贊評(píng)轉(zhuǎn)+Star!)
1.4 愛奇藝
愛奇藝使用的是截圖后直接讀取用戶相冊(cè)刪除圖片的方式進(jìn)行的劳澄,不給權(quán)限地技,截圖就不會(huì)被刪除。
1.5 UITextField
當(dāng)我們將一個(gè) UITextField
的 isSecureTextEntry
設(shè)置為 true
的時(shí)候浴骂,會(huì)隱去輸入的文案用 圓點(diǎn)
替代乓土。并且在進(jìn)行錄屏或者截屏的時(shí)候都會(huì)被系統(tǒng)隱去。
下面用我的個(gè)人項(xiàng)目 夢見賬本
如下圖我正在用 QuickTime
進(jìn)行錄屏:
那么我們是否可以使用這種特性呢溯警?
二趣苏、 RyukieSwifty/ScreenShield
基于 UITextField
的效果我實(shí)現(xiàn)了一個(gè) ScreenShieldView
可以很方便的進(jìn)行使用。
GitHub: RyukieSwifty/ScreenShield
如果覺得不錯(cuò)的話梯轻,歡迎留個(gè)??哦
2.1 使用方式
Cocoapods 導(dǎo)入
pod 'RyukieSwifty/ScreenShield'
使用
例如對(duì)整個(gè)控制器的 View
進(jìn)行截屏防護(hù):
import UIKit
import RyukieSwifty
class TransactionAddViewController: UIViewController {
// MARK: - Life
override func loadView() {
view = ScreenShieldView.create()
}
...
}
2.2 如何實(shí)現(xiàn)的
按照向里面添加子視圖的方式驗(yàn)證具體的原因食磕,最后發(fā)現(xiàn)這個(gè)效果是由一個(gè)私有類實(shí)現(xiàn)的 _UITextLayoutCanvasView
。他本質(zhì)上也是一個(gè) UIView
喳挑,所以理論上只要我們能夠創(chuàng)建出來一個(gè)它彬伦,那么就可以將想要保護(hù)的內(nèi)容添加進(jìn)去。
由于它是私有類伊诵,無法直接創(chuàng)建单绑,并且如果直接通過字符串區(qū)創(chuàng)建也擔(dān)心有審核風(fēng)險(xiǎn),于是我通過下面的方式來創(chuàng)建曹宴。
private func makeSecureView() -> UIView? {
let field = UITextField()
field.isSecureTextEntry = true
let fv = field.subviews.first
fv?.subviews.forEach { $0.removeFromSuperview() }
fv?.isUserInteractionEnabled = true
return fv
}
當(dāng)前手頭沒有更多的系統(tǒng)版本設(shè)備可以測試搂橙,已經(jīng)驗(yàn)證的
13.7 ~ 15.3.1
是沒問題的。不排除會(huì)存在某些版本上
UITextField
的結(jié)構(gòu)發(fā)生了調(diào)整導(dǎo)致失效的問題笛坦,如果有区转,歡迎在 GitHub 提issue
。
總結(jié)
不知道各位有沒有其他的實(shí)現(xiàn)方式版扩,有的話歡迎一起交流废离。
如果本文有幫到你,歡迎贊評(píng)轉(zhuǎn)+Star礁芦!
??
- Wechat: RyukieW
- 微信公眾號(hào):LabLawliet
- ?? 技術(shù)文章歸檔
- ?? Github
我的個(gè)人項(xiàng)目 | 掃雷Elic 無盡天梯 | 夢見賬本 | 隱私訪問記錄 |
---|---|---|---|
類型 | 游戲 | 財(cái)務(wù) | 工具 |
AppStore | Elic | Umemi | 隱私訪問記錄 |