【问题标题】:Prevent system from taking a "use on resume" snapshot of app防止系统拍摄应用程序的“恢复使用”快照
【发布时间】:2012-09-18 09:34:48
【问题描述】:

我在应用程序中向我的用户显示了一些敏感数据,当用户单击主页按钮并返回应用程序时,Apple 有一个快照功能,可以在主页之前显示设备上最后一个屏幕的图片按钮被按下。

有没有办法完全禁用这个效果?我在这里看到了在后台激活时显示图像的方法,该图像推送到视图顶部并在用户返回应用程序时首先显示在快照的位置,但我希望此功能完全消失而不必当用户再次进入应用程序时,保存任何快照或任何其他屏幕截图。谁能建议一种方法来做到这一点?

请注意,我不是在说按下主页按钮 + 睡眠按钮截屏。

【问题讨论】:

    标签: ios screen-capture


    【解决方案1】:

    在您的应用程序委托的applicationWillResignActive: 方法中,您可以制作一个不显眼的弹出窗口的 UIImageView。例如,假设您的应用程序拥有用户的密码。有人在用户身后走,用户按下主页按钮。这会调用applicationWillResignActive: 方法,该方法可能会显示地图视图,因此当步行者离开并且用户重新打开应用程序时,它会直接打开地图视图而不是用户密码的简短快照。这就是你可以实现它的方式:

    //AppDelegate.m
    - (void)applicationWillResignActive:(UIApplication *)application {
    
        UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"picOfMap.png"]];
        image.frame = self.view.frame;
        image.contentMode = UIViewContentModeCenter;
        [self.window.rootViewController.view addSubview: image];
    }
    

    下面是关于何时调用 applicationWillResignActive: 的描述:

    调用此方法是为了让您的应用程序知道它即将从活动状态变为非活动状态。这可能发生在某些类型的临时中断(例如来电或短信)或当用户退出应用程序并开始转换到后台状态时。处于非活动状态的应用程序会继续运行,但不会将传入事件分派给响应者。 (UIApplicationDelegate Reference)

    代码中可能存在一些错误,因为我不熟悉在 App Delegate 中工作,但这是您应该做的要点。

    【讨论】:

    • 但是当用户回到应用程序时,我不希望该视图再次出现。我希望用户单击主页按钮,当他们返回时,根本不会显示任何快照,无论是用户在按下主页按钮之前正在查看的视图(快照),还是我可能强行进入屏幕的任何内容就在家庭新闻之前(上面的解决方案)。无论是否不起眼,我都希望没有图像/视图存在
    • @JohnBaum - 当应用程序在被用户关闭后重新打开时,快照将是“不显眼”的图像,而不是本来会显示的敏感数据。您可以在applicationWillEnterForeground: 中添加删除图像的代码,这样用户就会回到原来的屏幕。基本上,我的代码所做的只是用一个毫无意义的平淡图像替换敏感数据的旧快照;它不会影响其他任何东西。
    • @JohnBaum 你想展示什么?从那条评论看来,你想要一个空白屏幕。
    • 我真的很想覆盖 Apple 并且根本不显示任何屏幕。有点静音这个“功能”并阻止它永远存在。我不希望显示空白屏幕,因为如果他们回来时看到随机图像,这会影响用户体验
    • @JohnBaum - 由于 iOS 是 Apple 创建的移动平台,我怀疑您是否可以“覆盖”它们(当然无需越狱设备)。
    【解决方案2】:

    以下是 Apple 关于此主题的技术问答:https://developer.apple.com/library/archive/qa/qa1838/_index.html

    简而言之,Swift 中的 sn-ps 代码如下:

    func applicationDidEnterBackground(_ application: UIApplication) {
        let someVCToShowInAppSwitcher = ...
        window?.rootViewController?.present(someVCToShowInAppSwitcher, animated: false)
    }
    

    func applicationWillEnterForeground(_ application: UIApplication) {
        // Make sure that we'll dismiss an expected VC, e.g.:
        if window?.rootViewController?.presentedViewController?.view.accessibilityIdentifier == "someVCToShowInAppSwitcher" {
            window?.rootViewController?.dismiss(sender: self)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-15
      • 1970-01-01
      • 2011-09-09
      • 2016-04-11
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      相关资源
      最近更新 更多