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