Ios 在应用程序标识符背景之前显示视图或启动屏幕(以避免活动视图屏幕截图)

Ios 在应用程序标识符背景之前显示视图或启动屏幕(以避免活动视图屏幕截图),ios,background,ios7,screenshot,uiapplicationdelegate,Ios,Background,Ios7,Screenshot,Uiapplicationdelegate,我的应用程序中有机密信息,所以我想在应用程序即将移动到后台时用闪屏隐藏这些信息 我确实在iOS6上运行了这个应用程序,甚至更高 我试图在应用程序willresignactive中显示视图,但问题是,即使在用户滑动控制面板时,也会显示启动屏幕。我希望它仅在应用程序移动到后台时显示 我试图在applicationIdentinterbackground中显示我的splashScreen,但需要截图才能在动画恢复时显示信息 这里是我想要的精神: - (void)applicationDidEnterB

我的应用程序中有机密信息,所以我想在应用程序即将移动到后台时用闪屏隐藏这些信息

我确实在iOS6上运行了这个应用程序,甚至更高

我试图在
应用程序willresignactive
中显示视图,但问题是,即使在用户滑动控制面板时,也会显示启动屏幕。我希望它仅在应用程序移动到后台时显示

我试图在
applicationIdentinterbackground
中显示我的splashScreen,但需要截图才能在动画恢复时显示信息

这里是我想要的精神:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    [_window addSubview:__splashController.view];
}

我认为问题在于您正在模拟器中进行测试。在设备上,它应该可以正常工作

我测试了这个,它成功了。当应用程序进入后台时,添加带有启动图像的imageview-

- (void)applicationDidEnterBackground:(UIApplication *)application
{

        UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.window.bounds];

        imageView.tag = 101;    // Give some decent tagvalue or keep a reference of imageView in self
    //    imageView.backgroundColor = [UIColor redColor];
        [imageView setImage:[UIImage imageNamed:@"Default.png"]];   // assuming Default.png is your splash image's name

        [UIApplication.sharedApplication.keyWindow.subviews.lastObject addSubview:imageView];
}
当应用程序回到前台时-

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    UIImageView *imageView = (UIImageView *)[UIApplication.sharedApplication.keyWindow.subviews.lastObject viewWithTag:101];   // search by the same tag value
    [imageView removeFromSuperview];

}
注意-在模拟器(iOS 7.0)上,当您按两次home按钮(Cmd+H)进行检查时,添加的子视图不会显示,但在设备上它会按预期工作(如
paypal
BofA
应用程序)

编辑:(其他信息)

除了如上所述通过添加子视图/模糊来模糊/替换敏感信息之外,iOS 7允许您通过
UIApplication
内部
applicationWillResignActive
ApplicationIdentinterBackground
忽略屏幕快照

UIApplication.h


另外,
allowScreenShot
标志也可以在中探索。

需要编写如下代码:

-(void)applicationWillResignActive:(UIApplication *)application
{
    imageView = [[UIImageView alloc]initWithFrame:[self.window frame]];
    [imageView setImage:[UIImage imageNamed:@"Portrait(768x1024).png"]];
    [self.window addSubview:imageView];
}
要删除imageview,请执行以下操作:

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

它工作正常并且经过了正确的测试。

也有同样的问题,基本上我使用了
ApplicationIdentinterBackground
在内容顶部显示一个UIWindow,但在iOS8中它没有像在iOS7中那样工作

我找到的解决方案是在
应用程序willresignative
中创建UIWindow,但将其隐藏
securityWindow.hidden=YES
;然后在
applicationidentinterbackground
中,我要做的就是更改
securityWindow.hidden=NO


这似乎与iOS7在使用NotificationCenter或ControlPanel时在不影响视图的情况下执行多任务时隐藏内容的方式完全相同。

这为我解决了这个问题,很抱歉这是针对Xamarin的。表单,但你应该明白这一点。您需要在xamarin中调用UIView.SnapshotView(true),或在iOS上调用屏幕更新后的UIView SnapshotView。在iOS7和iOS8上的后台工作:

public override void DidEnterBackground(UIApplication uiApplication)
{
    App.Current.MainPage = new DefaultPage();
    **UIApplication.SharedApplication.KeyWindow.SnapshotView(true);**
    base.DidEnterBackground(uiApplication);
}

不知道为什么,但是这里描述的方法都不适合我。出于安全考虑,我只是试图遮住屏幕。因此,苹果公司的技术问答帮助了我们:

我想主要的区别是使用UIViewController?无论如何,以下代码在IOS 9.1上非常适合我:

- (void)applicationDidEnterBackground:(UIApplication *)application
{     
    UIViewController *blankViewController = [UIViewController new];
    blankViewController.view.backgroundColor = [UIColor blackColor];

    [self.window.rootViewController presentViewController:blankViewController animated:NO completion:NULL];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [self.window.rootViewController dismissViewControllerAnimated:NO completion:NO];
}

Swift 3.0回答那些懒于翻译的人

func applicationDidEnterBackground(_ application: UIApplication) {

    let imageView = UIImageView(frame: self.window!.bounds)
    imageView.tag = 101
    imageView.image = ...

    UIApplication.shared.keyWindow?.subviews.last?.addSubview(imageView)
 }

func applicationWillEnterForeground(_ application: UIApplication) {

    if let imageView : UIImageView = UIApplication.shared.keyWindow?.subviews.last?.viewWithTag(101) as? UIImageView {
        imageView.removeFromSuperview()
    }

}

我认为这将有助于Swift 3.0

func applicationWillResignActive(_ application: UIApplication) {

        let imageView = UIImageView(frame: self.window!.bounds)
        imageView.tag = 101
        imageView.backgroundColor = UIColor.white
        imageView.contentMode = .center
        imageView.image = #image#
        UIApplication.shared.keyWindow?.subviews.last?.addSubview(imageView)

    }

func applicationWillEnterForeground(_ application: UIApplication) {
        ReachabilityManager.shared.stopMonitoring()
        if let imageView : UIImageView = UIApplication.shared.keyWindow?.subviews.last?.viewWithTag(101) as? UIImageView {
            imageView.removeFromSuperview()
        }
    }

好的,您需要在
applicationWillResignActive
中执行操作,并撤消
UIApplicationLegate
方法的相同操作
ApplicationIDBecMeasive
。问题是,如果我在
应用程序WillResignActive
中显示我的splashscreen,那么每当用户只需查看其控制面板或双击home按钮时,它就会显示…
Paypal
iOS应用程序也会做类似的事情,当应用程序进入后台时,它们会模糊最后一个活动视图(以保护用户信息)。我建议你研究一下这个或其他一些应用程序。编辑:我刚刚注意到,当控制面板打开时,paypal不会模糊,所以我相信有一些方法可以让您尝试实现的目标是可行的。这是我想做的(因为我的应用程序也处理银行信息),但我不确定paypal是否让我看到它的代码:/@Andrea-但他所寻找的应该是可行的,因为许多其他金融(寻求安全性)应用程序,如
paypal
BofA
。(注意-在iPad上-控制中心、通知中心等部分覆盖了应用程序)。我认为这个解决方案并不难,但它对我来说并不难。让我们投票表决这个问题来引起右脑的注意:)。另外@AncAinu-u应该在实际设备上尝试一下你的解决方案(不仅仅是模拟器),如果还没有的话。是的,那天我的闪电死了。。。事实上,它在真正的设备上运行良好。除非正在播放视频。我可以隐藏正在播放的视频?这正是我需要的。在iOS7到iOS9上测试。如果屏幕上显示某些系统警报,您该怎么办。在这种情况下,MySplashView也会显示在屏幕上。我可以避免吗?如果显示alertview,它将不会被隐藏,我们如何在后台隐藏alertview;如果当前窗口中显示了一个模式,并且presentViewController方法未完成,那么当您返回前台时,您的模式可能会被取消。
func applicationDidEnterBackground(_ application: UIApplication) {

    let imageView = UIImageView(frame: self.window!.bounds)
    imageView.tag = 101
    imageView.image = ...

    UIApplication.shared.keyWindow?.subviews.last?.addSubview(imageView)
 }

func applicationWillEnterForeground(_ application: UIApplication) {

    if let imageView : UIImageView = UIApplication.shared.keyWindow?.subviews.last?.viewWithTag(101) as? UIImageView {
        imageView.removeFromSuperview()
    }

}
func applicationWillResignActive(_ application: UIApplication) {

        let imageView = UIImageView(frame: self.window!.bounds)
        imageView.tag = 101
        imageView.backgroundColor = UIColor.white
        imageView.contentMode = .center
        imageView.image = #image#
        UIApplication.shared.keyWindow?.subviews.last?.addSubview(imageView)

    }

func applicationWillEnterForeground(_ application: UIApplication) {
        ReachabilityManager.shared.stopMonitoring()
        if let imageView : UIImageView = UIApplication.shared.keyWindow?.subviews.last?.viewWithTag(101) as? UIImageView {
            imageView.removeFromSuperview()
        }
    }