I'm blocking screenshots and video records for ios in my app. But when I installed the latest update ios rejected it.
We noticed that your app shows a custom screenshot-initiated interface when the user takes a screenshot, but the interface duplicates the iOS system-provided screenshot interface and functionality.
Duplicating system-provided interfaces does not provide the simple, innovative, and easy to use experience App Store users expect.
This is rejected message.
This is my code
extension UIWindow {
func makeSecure() {
let field = UITextField()
field.isSecureTextEntry = true
self.addSubview(field)
field.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
field.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
self.layer.superlayer?.addSublayer(field.layer)
field.layer.sublayers?.first?.addSublayer(self.layer)
}
}
How to I solve it
Now there's an opportunity to block screen recording in iOS through flutter plugin.
For iOS:
pubspec.yaml
then run flutter pub get.
///Define a streamSubscription in order to receive changes
late StreamSubscription<bool> _screenRecordsSubscription;
///Get the instance of plugin for multiple use.
FlutterPreventScreenCapture preventScreenCapture =
FlutterPreventScreenCapture();
///is Recording is set to false initially.
bool isRecording = false;
updateRecordStatus(bool record) {
isRecording = record;
setState(() {});
}
@override
void initState() {
///Though listening to the screen record, it is recommended to check the screen record status on the first launch.
checkScreenRecord();
///Initialize screenRecordSubscription to regularly listen to the changes
_screenRecordsSubscription =
preventScreenCapture.screenRecordsIOS.listen(updateRecordStatus);
super.initState();
}
So you can listen to the screen recording status.
If you want to check the screen recording status once:
Future<void> checkScreenRecord() async {
final recordStatus = await preventScreenCapture.checkScreenRecord();
debugPrint('Is screen being recorded: $recordStatus');
isRecording = recordStatus;
setState(() {});
}
The last thing is don't forget to cancel subscription in dispose method:
@override
dispose() {
_screenRecordsSubscription.cancel();
super.dispose();
}