安全錄屏實(shí)現(xiàn)

info.plist文件中添加
NSExtensionUsageDescription:此應(yīng)用需要訪問擴(kuò)展功能實(shí)現(xiàn)安全錄屏

實(shí)現(xiàn)方式一: UIScreenCapturedDidChangeNotification

錄屏開啟時(shí)规求,畫面黑屏,聲音可錄入

.h
/// 安全錄屏的黑色視圖
@property (nonatomic, strong) UIView *safeScreenView;
.m
// 安全錄屏
- (UIView *)safeScreenView {
    if (!_safeScreenView) {
        _safeScreenView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KScreenW, KScreenH)];
      
        [_safeScreenView setUserInteractionEnabled:NO];
        _safeScreenView.backgroundColor = [UIColor blackColor];
        [_safeScreenView setMultipleTouchEnabled:NO];
    }
    return  _safeScreenView;
}

- (void)showSafeScreen {
    [self.window addSubview:self.safeScreenView];
    [self.window bringSubviewToFront:self.safeScreenView];
    [self.safeScreenView setHidden: NO];
}

- (void)hideSafeScreen {
    [self.safeScreenView setHidden: YES];
}

對于直播間內(nèi),涉及到 推拉流問題弊决,最好不要對聲道進(jìn)行處理

#pragma mark- 安全錄屏
- (void)handleSafeScreen {
//    AVAudioSession * session = [AVAudioSession sharedInstance];
//    @try {
//        [session setCategory: AVAudioSessionCategoryPlayAndRecord mode:AVAudioSessionModeDefault options: AVAudioSessionCategoryOptionMixWithOthers error:nil];
//        [session setActive:YES error:nil];
//    } @catch (NSException *exception) {
//        NSLog(@"安全錄屏配置音頻會(huì)話失敗:%@", exception.reason);
//        [NetRequest postLog:[NSString stringWithFormat: @"安全錄屏配置音頻會(huì)話失敗:%@", exception.reason] isFailure:true];
//    }
    
    [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(screenListenUpdate) name:UIScreenCapturedDidChangeNotification object:nil];
    [self screenListenUpdate];
}

- (void)screenListenUpdate {
    BOOL isSafeSwith = NO;
    /// 0不可以錄屏  1可以錄屏
    if (UIScreen.mainScreen.isCaptured && self.baseModel.user_extra_info != nil && self.baseModel.user_extra_info.is_screen_safe_switch == 0) {
        isSafeSwith = YES;
    }
    AppDelegate *delegate = (AppDelegate *)UIApplication.sharedApplication.delegate;
    
    if (isSafeSwith == YES) {
        [delegate showSafeScreen];
        NSLog(@"開啟安全錄屏");
        
    } else {
        NSLog(@"關(guān)閉安全錄屏");
        [delegate hideSafeScreen];
    }
}

實(shí)現(xiàn)方式二 具则,通過UITextField绪妹,將無法截屏的頁面添加至SafeView上

在UIViewContoller中

let secureTextField = SafeView(frame: .zero)
override func loadView() {
        view = secureTextField
    }

其中關(guān)于SafeView的完整實(shí)現(xiàn)代碼

class SafeView: UIView {
    
    private var safeZone: UIView?
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        safeZone = makeSecureView(secureEnabled: true)
        safeZone?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        self.addSubview(safeZone!)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func makeSecureView(secureEnabled: Bool) -> UIView {
        let tf = UITextField(frame: self.frame)
        tf.isSecureTextEntry = secureEnabled
        let secureView = tf.subviews.first

        secureView?.isUserInteractionEnabled = true

        secureView?.subviews.forEach { $0.removeFromSuperview() }
        
        return secureView ?? UIView(frame: self.frame)
    }
    
    public override func addSubview(_ view: UIView) {
        guard
            let safe = safeZone,
            view != safeZone
        else {
            super.addSubview(view)
            return
        }
        safe.addSubview(view)
    }
    
    public override func insertSubview(_ view: UIView, belowSubview siblingSubview: UIView) {
        guard
            let safe = safeZone,
            view != safeZone
        else {
            super.insertSubview(view, belowSubview: siblingSubview)
            return
        }
        safe.insertSubview(view, belowSubview: siblingSubview)
    }
    
    public override func insertSubview(_ view: UIView, aboveSubview siblingSubview: UIView) {
        guard
            let safe = safeZone,
            view != safeZone
        else {
            super.insertSubview(view, aboveSubview: siblingSubview)
            return
        }
        safe.insertSubview(view, aboveSubview: siblingSubview)
    }
    
    public override func insertSubview(_ view: UIView, at index: Int) {
        guard
            let safe = safeZone,
            view != safeZone
        else {
            super.insertSubview(view, at: index)
            return
        }
        safe.insertSubview(view, at: index)
    }
    
    public override func exchangeSubview(at index1: Int, withSubviewAt index2: Int) {
        guard
            let safe = safeZone
        else {
            super.exchangeSubview(at: index1, withSubviewAt: index2)
            return
        }
        safe.exchangeSubview(at: index1, withSubviewAt: index2)
    }
    
    public override func bringSubviewToFront(_ view: UIView) {
        guard
            let safe = safeZone,
            view != safeZone
        else {
            super.bringSubviewToFront(view)
            return
        }
        safe.bringSubviewToFront(view)
    }
    
    public override func sendSubviewToBack(_ view: UIView) {
        guard
            let safe = safeZone,
            view != safeZone
        else {
            super.sendSubviewToBack(view)
            return
        }
        safe.sendSubviewToBack(view)
    }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骂租,一起剝皮案震驚了整個(gè)濱河市涨椒,隨后出現(xiàn)的幾起案子器钟,更是在濱河造成了極大的恐慌津坑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傲霸,死亡現(xiàn)場離奇詭異疆瑰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)昙啄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門穆役,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梳凛,你說我怎么就攤上這事耿币。” “怎么了韧拒?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵淹接,是天一觀的道長。 經(jīng)常有香客問我叛溢,道長塑悼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任楷掉,我火速辦了婚禮厢蒜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己郭怪,他們只是感情好支示,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鄙才,像睡著了一般颂鸿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攒庵,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天嘴纺,我揣著相機(jī)與錄音,去河邊找鬼浓冒。 笑死栽渴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稳懒。 我是一名探鬼主播闲擦,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼场梆!你這毒婦竟也來了墅冷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤或油,失蹤者是張志新(化名)和其女友劉穎寞忿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顶岸,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腔彰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辖佣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霹抛。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卷谈,靈堂內(nèi)的尸體忽然破棺而出上炎,到底是詐尸還是另有隱情,我是刑警寧澤雏搂,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站寇损,受9級特大地震影響凸郑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矛市,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一芙沥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦而昨、人聲如沸救氯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽着憨。三九已至,卻和暖如春务嫡,著一層夾襖步出監(jiān)牢的瞬間甲抖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工心铃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留准谚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓去扣,卻偏偏與公主長得像柱衔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子愉棱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

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