Prevent iOS from taking screen capture of app before going into background

后端 未结 10 2657
Happy的楠姐
Happy的楠姐 2020-11-29 22:35

You all might know that iOS takes a screen shot of your application before throwing it into the background. This is usually for a better User experience like quick animation

相关标签:
10条回答
  • 2020-11-29 22:52

    You are on the right track. This is Apple's recommended way to do this as noted in the iOS Application Programming Guide:

    Remove sensitive information from views before moving to the background. When an application transitions to the background, the system takes a snapshot of the application’s main window, which it then presents briefly when transitioning your application back to the foreground. Before returning from your applicationDidEnterBackground: method, you should hide or obscure passwords and other sensitive personal information that might be captured as part of the snapshot.

    0 讨论(0)
  • 2020-11-29 22:52

    In iOS 7 you could use the allowScreenShot to stop the ability all together.

    See: Apple Developer: Configuration Profile Reference:

    allowScreenShot


    Boolean
    Optional. If set to false, users can’t save a screenshot of the display and are prevented from capturing a screen recording; it also prevents the Classroom app from observing remote screens. Defaults to true.

    Availability: Updated in iOS 9.0 to include screen recordings.

    0 讨论(0)
  • 2020-11-29 23:06

    Improvement in Depak Kumar post : Make a property UIImage *snapShotOfSplash;

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[UIApplication sharedApplication] ignoreSnapshotOnNextApplicationLaunch];
    snapShotOfSplash =[UIImage imageNamed:@"splash_logo"];
    }
    
    - (void)applicationDidEnterBackground:(UIApplication *)application {
    
    
        self.overlayView = [[UIImageView alloc]initWithFrame:[self.window frame]];
        self.overlayView.backgroundColor = [UIColor whiteColor];
        [self.overlayView setImage:snapShotOfSplash];
        [self.overlayView setContentMode:UIViewContentModeCenter];
        [self.window addSubview:self.overlayView];
        [self.window bringSubviewToFront:self.overlayView]; }
    
    - (void)applicationDidBecomeActive:(UIApplication *)application {
    if(self.overlayView != nil) {
            [self.overlayView removeFromSuperview];
            self.overlayView = nil;
        }
    }
    
    0 讨论(0)
  • 2020-11-29 23:07

    Need to write the code in Application life cycle methods, here we are putting an imageView while the app animate to background :

    -(void)applicationWillResignActive:(UIApplication *)application
    {
        imageView = [[UIImageView alloc]initWithFrame:[self.window frame]];
        [imageView setImage:[UIImage imageNamed:@"Splash_Screen.png"]];
        [self.window addSubview:imageView];
    }
    

    Here is the code to remove the imageView:

    - (void)applicationDidBecomeActive:(UIApplication *)application
    {
        if(imageView != nil) {
            [imageView removeFromSuperview];
            imageView = nil;
        }
    }
    

    It is working and properly tested.

    0 讨论(0)
  • 2020-11-29 23:07

    I came across the same issue, and my research has lead me to the following answers:

    • set a blurry screen overlay before the app goes in the background and once the app becomes active remove this overlay

    • if it is iOS 7 or later you can use the function ignoreSnapshotOnNextApplicationLaunch

    See in apple documentation: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/ignoreSnapshotOnNextApplicationLaunch

    I hope this helps somebody.

    0 讨论(0)
  • 2020-11-29 23:11

    Implementation with some animation while going in background and reverse action

       - (void)applicationWillResignActive:(UIApplication *)application
    {
         //     fill screen with our own colour
            UIView *colourView = [[UIView alloc]initWithFrame:self.window.frame];
            colourView.backgroundColor = [UIColor blackColor];
            colourView.tag = 1111;
            colourView.alpha = 0;
            [self.window addSubview:colourView];
            [self.window bringSubviewToFront:colourView];
    
            // fade in the view
            [UIView animateWithDuration:0.5 animations:^{
                colourView.alpha = 1;
            }];
    
    }
    
    - (void)applicationDidBecomeActive:(UIApplication *)application
    {
        // grab a reference to our coloured view
        UIView *colourView = [self.window viewWithTag:1111];
        // fade away colour view from main view
        [UIView animateWithDuration:0.5 animations:^{
            colourView.alpha = 0;
        } completion:^(BOOL finished) {
            // remove when finished fading
            [colourView removeFromSuperview];
        }];
    
     }
    
    0 讨论(0)
提交回复
热议问题