1*ce247f03SCharlie Cruzan// Copyright 2018-present 650 Industries. All rights reserved. 2*ce247f03SCharlie Cruzan 3*ce247f03SCharlie Cruzan#import <EXScreenCapture/EXScreenCaptureModule.h> 4*ce247f03SCharlie Cruzan 5*ce247f03SCharlie Cruzan@interface EXScreenCaptureModule () 6*ce247f03SCharlie Cruzan 7*ce247f03SCharlie Cruzan@property (nonatomic, weak) UMModuleRegistry *moduleRegistry; 8*ce247f03SCharlie Cruzan 9*ce247f03SCharlie Cruzan@end 10*ce247f03SCharlie Cruzan 11*ce247f03SCharlie Cruzan@implementation EXScreenCaptureModule { 12*ce247f03SCharlie Cruzan UIView *_blockView; 13*ce247f03SCharlie Cruzan} 14*ce247f03SCharlie Cruzan 15*ce247f03SCharlie Cruzan- (instancetype)init { 16*ce247f03SCharlie Cruzan if (self = [super init]) { 17*ce247f03SCharlie Cruzan CGFloat boundLength = MAX([[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height); 18*ce247f03SCharlie Cruzan _blockView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, boundLength, boundLength)]; 19*ce247f03SCharlie Cruzan _blockView.backgroundColor = UIColor.blackColor; 20*ce247f03SCharlie Cruzan } 21*ce247f03SCharlie Cruzan return self; 22*ce247f03SCharlie Cruzan} 23*ce247f03SCharlie Cruzan 24*ce247f03SCharlie CruzanUM_EXPORT_MODULE(ExpoScreenCapture); 25*ce247f03SCharlie Cruzan 26*ce247f03SCharlie Cruzan- (void)setModuleRegistry:(UMModuleRegistry *)moduleRegistry 27*ce247f03SCharlie Cruzan{ 28*ce247f03SCharlie Cruzan _moduleRegistry = moduleRegistry; 29*ce247f03SCharlie Cruzan} 30*ce247f03SCharlie Cruzan 31*ce247f03SCharlie CruzanUM_EXPORT_METHOD_AS(preventScreenCapture, 32*ce247f03SCharlie Cruzan preventScreenCaptureWithResolver:(UMPromiseResolveBlock)resolve 33*ce247f03SCharlie Cruzan reject:(UMPromiseRejectBlock)reject) 34*ce247f03SCharlie Cruzan{ 35*ce247f03SCharlie Cruzan if (@available(iOS 11.0, *) ) { 36*ce247f03SCharlie Cruzan // If already recording, block it 37*ce247f03SCharlie Cruzan dispatch_async(dispatch_get_main_queue(), ^{ 38*ce247f03SCharlie Cruzan [self preventScreenRecording]; 39*ce247f03SCharlie Cruzan }); 40*ce247f03SCharlie Cruzan 41*ce247f03SCharlie Cruzan // Avoid setting duplicate observers 42*ce247f03SCharlie Cruzan [[NSNotificationCenter defaultCenter] removeObserver:self name:UIScreenCapturedDidChangeNotification object:nil]; 43*ce247f03SCharlie Cruzan 44*ce247f03SCharlie Cruzan [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(preventScreenRecording) name:UIScreenCapturedDidChangeNotification object:nil]; 45*ce247f03SCharlie Cruzan } 46*ce247f03SCharlie Cruzan 47*ce247f03SCharlie Cruzan resolve([NSNull null]); 48*ce247f03SCharlie Cruzan} 49*ce247f03SCharlie Cruzan 50*ce247f03SCharlie CruzanUM_EXPORT_METHOD_AS(allowScreenCapture, 51*ce247f03SCharlie Cruzan allowScreenCaptureWithResolver:(UMPromiseResolveBlock)resolve 52*ce247f03SCharlie Cruzan rejecter:(UMPromiseRejectBlock)reject) 53*ce247f03SCharlie Cruzan{ 54*ce247f03SCharlie Cruzan if (@available(iOS 11.0, *)) { 55*ce247f03SCharlie Cruzan [[NSNotificationCenter defaultCenter] removeObserver:self name:UIScreenCapturedDidChangeNotification object:nil]; 56*ce247f03SCharlie Cruzan } 57*ce247f03SCharlie Cruzan 58*ce247f03SCharlie Cruzan resolve([NSNull null]); 59*ce247f03SCharlie Cruzan} 60*ce247f03SCharlie Cruzan 61*ce247f03SCharlie Cruzan- (void)preventScreenRecording { 62*ce247f03SCharlie Cruzan if (@available(iOS 11.0, *)) { 63*ce247f03SCharlie Cruzan BOOL isCaptured = [[UIScreen mainScreen] isCaptured]; 64*ce247f03SCharlie Cruzan 65*ce247f03SCharlie Cruzan if (isCaptured) { 66*ce247f03SCharlie Cruzan [UIApplication.sharedApplication.keyWindow.subviews.firstObject addSubview:_blockView]; 67*ce247f03SCharlie Cruzan } else { 68*ce247f03SCharlie Cruzan [_blockView removeFromSuperview]; 69*ce247f03SCharlie Cruzan } 70*ce247f03SCharlie Cruzan } 71*ce247f03SCharlie Cruzan} 72*ce247f03SCharlie Cruzan 73*ce247f03SCharlie Cruzan@end 74