現在是手機時代,所有東西都有手機 App。從理髮店到大型零售商,每一項業務都有自己的 App,以便更貼近顧客。雖然這真的很方便,但在使用這些 App 的同時,也存在著暴露大量機密信息的風險,這個問題在處理付款及其他敏感信息時,就變得更加重要。作為這些 App 的開發人員,我們有責任進行檢查,以確保 App 不會造成隱私和安全性問題。其中一種解決方法,就是檢測/防止螢幕截圖和螢幕錄製的動作,並直接採取動作、或通知使用者採取適當的動作。
範例
以下是螢幕截圖和螢幕錄製可能會洩露的敏感信息:
1. 可能會記錄登入資料
針對任何需要登入才能訪問敏感信息的 App,我們都需要確保只有已登記的人才能登入。如果登入時允許螢幕截圖和螢幕錄製,就有可能會洩露機密信息。
2. 錄製串流內容
讓我們以一個串流內容 App Netflix 為例,相信大家都知道什麼是 Netflix,我們會在 App 上按月訂閱串流的內容。如果 App 允許進行螢幕錄製,使用者就可以使用設備的錄製功能,錄製 App 的內容,日後即使不再訂閱 App 都可以觀看內容。
3. 付款資料
針對任何處理付款/交易的零售或銀行 App,從安全角度來看,我們需要注意從 App 上可以取得的任何信息,以保護使用者的帳戶。如果我們不謹慎處理,就可能會導致 App 上的資料洩漏,保密交易細節也可能會被入侵。
實作方法
1. 如何禁止螢幕截圖
開發者很簡單就可以禁止/檢測螢幕截圖的動作,就是監聽 iOS 11 以上版本可用的 userDidTakeScreenshotNotification 通知。讓我們來看看實作的方法:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
NotificationCenter.default.addObserver(self, selector: #selector(didTakeScreenshot(notification:)), name: UIApplication.userDidTakeScreenshotNotification, object: nil)
}
@objc func didTakeScreenshot(notification:Notification) -> Void {
print("Screen Shot Taken")
}
}
在以上的程式碼中,我們把自己添加為 userDidTakeScreenshotNotification 通知的觀察者 (observer),並捕獲 didTakeScreenShot 函數。每次使用者嘗試進行螢幕截圖時,就會觸發 didTakeScreenShot 函數。此時,開發者就可以按自己所想的方法來處理,例如我們可以顯示一個警告訊息,通知使用者後強制退出 App。你可以看看以下範例:
2. 如何禁止螢幕錄製
我們可以在 UIScreen 檢查是否有 isCaptured 屬性,來檢測螢幕有沒有被截圖/錄製。讓我們來看看以下的範例程式碼:
func isRecording() ->Bool {
for screen in UIScreen.screens {
if (screen.isCaptured) {
print("screen is recorded")
return true
}
}
return false
}
我們也可以按需要呼叫 isRecording 方法,來檢測螢幕是否有被錄製。我們可以在視圖生命週期的不同階段呼叫這個方法,或是設一個計時器,來定期檢測是否有螢幕錄製行為。以下是檢測螢幕錄製的範例:
總結
從 App 的安全和隱私角度來看,檢測螢幕截圖和錄製是非常有用的。這可以為擁有數百萬潛在使用者的 App 增加信任和可靠程度。希望你也可以在留言分享你的用例,以及使用過的螢幕截圖方法。