iOS防截屏方案(基于DRM)

背景

在iOS開發(fā)的一些業(yè)務場景中,可能有一些敏感信息(如付款的二維碼等)婉支,我們不希望被隨意傳播。應用內(nèi)禁止截屏澜建,可以一定程度上磅摹,提高敏感信息被傳播的門檻(可能需要另外一臺手機拍照滋迈,并手機間傳輸)。

然而户誓,由于iOS系統(tǒng)的特殊性饼灿,常規(guī)方法無法完全禁止用戶截屏落地成系統(tǒng)圖片。目前帝美,網(wǎng)上的解決方案碍彭,主要有兩種:

    1. 監(jiān)聽截屏后通知(UIApplicationUserDidTakeScreenshotNotification),并進行提示悼潭。
    1. 讓用戶安裝禁用屏幕快照和屏幕錄制的配置文件庇忌。

前者無法禁止截屏內(nèi)容落地,后者閹割了手機功能舰褪,導致其他應用也無法截屏皆疹。二者均不能滿足需求。

其他刪除本地相冊的方案在新系統(tǒng)上不能滿足需求占拍。

本文在研究了參考資料給出的一些建議略就,使用DRM最終實現(xiàn)了對控件的防止截屏功能。

該方案有以下特點:

  • 可以做到真正意義防止敏感內(nèi)容落地晃酒。
  • 沒有用到私有api表牢,是蘋果原生支持的。
  • 支持主流系統(tǒng)版本贝次。

注: 本文方案只能對敏感控件進行防截屏處理崔兴,無法做到全局任何位置防截屏(全部控件加drm,代價太大)蛔翅。

使用DRM實現(xiàn)防止截屏

演示demo: https://github.com/ohswift/VTAntiScreenCapture

蘋果系統(tǒng)是支持DRM(Digital Rights Management敲茄,數(shù)字版權(quán)管理)的。它表現(xiàn)在山析,當你播放一個加密了的hls流時折汞,你進行截屏(用手機截屏或用Xcode截屏),該視頻控件會顯示空白盖腿。

所以,我們的思路就很清晰了损同。我們可以把一個敏感信息的控件翩腐,轉(zhuǎn)化為帶DRM加密的視頻,然后播放膏燃。此后茂卦,系統(tǒng)進行截屏時,該控件就會消失组哩,達到防止敏感內(nèi)容落地的目的等龙。

你可以在敏感信息控件后放個背景处渣,用來在截屏時敏感控件消失后,做更友好的提示蛛砰。如demo所示罐栈。

演示工程的效果如下:

image

如demo所示,截屏截不到真實的內(nèi)容泥畅,敏感信息會被過濾荠诬。

我們的整個流程差不多如下:

1) 根據(jù)控件內(nèi)容生成mp4文件

2) 啟動webserver

3) 本地播放帶DRM加密的hls流

其中1) 不是重點,我們將放后面講位仁。我們先驗證DRM是否真的可以做到防止截屏柑贞。假設,我們已經(jīng)把一個文本內(nèi)容轉(zhuǎn)換為mp4了(demo工程中的text.mp4)聂抢。那么钧嘶,我們首先讓這個視頻可以播放起來。

啟動webserver

我們需要把該mp4拷貝到一個目錄后琳疏,啟動webServer有决,如demo中,我們把它拷到tmp目錄下(演示用轿亮,實際可以做到mp4數(shù)據(jù)也不落地)疮薇。

[_webServer addGETHandlerForBasePath:@"/" directoryPath:dir indexFilename:nil cacheAge:3600 allowRangeRequests:YES];
[_webServer startWithPort:8989 bonjourName:nil];

然后,就可以播放該mp4流了我注。

[Self.player playURL:@"http://localhost:8989/text.mp4" inView:self.labelContainer];

播放帶hls加密的流

如果你按上面播放按咒,發(fā)現(xiàn)只是單純的展示內(nèi)容,并沒有防截屏的效果但骨。我們需要加密播放流励七。

你可能需要一些AVPlayer播放視頻的基礎,可以參考[iOS]仿微博視頻邊下邊播之封裝播放器Playing Offline HLS with AES-128 encryption iOS奔缠。

當你理解了AVAssetResourceLoaderDelegate了后掠抬,就可以開始了。我們讓播放器去播放一個私有協(xié)議的m3u8文件校哎。

[self.player playURL:@"jedi://text.m3u8" inView:self.labelContainer];

而當它無法解析時两波,就需要走AVAssetResourceLoaderDelegate,我們在其中闷哆,返回寫死的text.m3u8數(shù)據(jù)腰奋。

#EXTM3U
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-VERSION:5
#EXT-X-TARGETDURATION:1
#EXT-X-KEY:METHOD=SAMPLE-AES,URI="jedi://text.key"
#EXTINF:0.067,
http://localhost:8989/text.mp4
#EXT-X-ENDLIST

m3u8中寫入了mp4的url地址,同時抱怔,也通過EXT-X-KEY來描述當前的加密key劣坊,說明當前的流是經(jīng)過加密的。

同樣屈留,這里的key的獲取也是用的私有協(xié)議局冰,同樣需要走AVAssetResourceLoaderDelegate测蘑。所以,最終AVAssetResourceLoaderDelegate中的方法看起來如下:

-(BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest{
    NSString *url = loadingRequest.request.URL.absoluteString;
    if ([url isEqualToString:@"jedi://text.m3u8"]) {
        NSData *data = [[self gen_m3u8] dataUsingEncoding:NSUTF8StringEncoding];
        [loadingRequest.dataRequest respondWithData:data];
        [loadingRequest finishLoading];
    }
    else if([url isEqualToString:@"jedi://text.key"]) {
        NSMutableData *data = [NSMutableData dataWithLength:16];
        [data resetBytesInRange:NSMakeRange(0, [data length])];
        [loadingRequest.dataRequest respondWithData:[data copy]];
        [loadingRequest finishLoading];
    }

    return YES;
}

這里康二,我們返回的key是16字節(jié)純0的數(shù)據(jù)碳胳,其實mp4文件并沒有加密,只是讓系統(tǒng)以為加密了赠摇,好在截屏時進行保護固逗。

如果你看到此,應該已經(jīng)基本掌握了防止截屏的大致流程了藕帜。如果效果無法達到的話烫罩,可以隨時參照demo中的示例。

編碼生成mp4

這里用AVAssetWriterCVPixelBuffer即可生成mp4洽故。這里參考了https://github.com/caferrara/img-to-video.git的代碼贝攒。

VTMP4Encoder中包含根據(jù)view生成mp4的邏輯,這里不展開时甚,感興趣的可以查看代碼隘弊。

注:要注意,AVAssetWriter要設置shouldOptimizeForNetworkUse = YES荒适,讓它支持faststart,否則在m3u8中播放不了梨熙。

生成的mp4可以在demo中試用,或在mac端啟nginx配置m3u8測試刀诬。

封裝成SDK

TODO咽扇。 目前只大概封裝了encoder,完整的封裝陕壹,敬請期待质欲。

TODO

  • 優(yōu)化生成mp4算法

  • 獲取mp4也用AVAssetResourceLoaderDelegate實現(xiàn)
    目前mp4獲取主要借助GCDWebServer,下個版本考慮去掉對GCDWebServer的依賴糠馆。

  • 添加對錄屏嘶伟、投屏時的監(jiān)聽和處理
    目前可以做到防止手機截屏和通過Xcode的截屏,但沒有監(jiān)控錄屏和投屏(這種監(jiān)聽很容易實現(xiàn)又碌,待補充)九昧。

參考資料

1. Prevent screen capture in an iOS app

2. Playing Offline HLS with AES-128 encryption iOS

3. [iOS]仿微博視頻邊下邊播之封裝播放器

4. img-to-video

5.俞子將 簡書

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毕匀,一起剝皮案震驚了整個濱河市铸鹰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌期揪,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件规个,死亡現(xiàn)場離奇詭異凤薛,居然都是意外死亡姓建,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門缤苫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來速兔,“玉大人,你說我怎么就攤上這事活玲』凉罚” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵舒憾,是天一觀的道長镀钓。 經(jīng)常有香客問我,道長镀迂,這世上最難降的妖魔是什么丁溅? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮探遵,結(jié)果婚禮上窟赏,老公的妹妹穿的比我還像新娘。我一直安慰自己箱季,他們只是感情好涯穷,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著藏雏,像睡著了一般拷况。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诉稍,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天蝠嘉,我揣著相機與錄音,去河邊找鬼杯巨。 笑死蚤告,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的服爷。 我是一名探鬼主播杜恰,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仍源!你這毒婦竟也來了心褐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤笼踩,失蹤者是張志新(化名)和其女友劉穎逗爹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚎于,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡掘而,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年挟冠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袍睡。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡知染,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斑胜,到底是詐尸還是另有隱情控淡,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布止潘,位于F島的核電站掺炭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏覆山。R本人自食惡果不足惜竹伸,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望簇宽。 院中可真熱鬧勋篓,春花似錦、人聲如沸魏割。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钞它。三九已至拜银,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遭垛,已是汗流浹背尼桶。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锯仪,地道東北人泵督。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像庶喜,于是被迫代替她去往敵國和親小腊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 背景 在iOS開發(fā)的一些業(yè)務場景中久窟,可能有一些敏感信息(如付款的二維碼等)秩冈,我們不希望被隨意傳播。應用內(nèi)禁止截屏斥扛,...
    俞子將閱讀 35,632評論 19 84
  • 直播云解決方案整理 [TOC] 1.又拍云直播 又拍直播云(UPLive)入问,基于又拍云內(nèi)容分發(fā)網(wǎng)絡為直播應用提供超...
    MaxWellPro閱讀 7,815評論 0 21
  • 她的生活像一座蜂箱,里面充滿了相連的小格子間,在每一個格子間里芬失,是她的一種生活狀態(tài)卷仑。她如貓一般慵懶,漫不經(jīng)心地游走...
    米妖喵閱讀 239評論 0 0
  • 【文/時間簡史】 雖美好亦或殘酷粘昨;雖激情亦或縹緲垢啼;雖勵志亦或狗血~ 我們對它們的向往也僅僅只是獲...
    時間羈旅閱讀 456評論 0 0
  • 控件的狀態(tài) 控件內(nèi)容的對齊方式 監(jiān)聽方法
    點呀點閱讀 290評論 0 1