Предотвращение блокировки приложения iOS перед тем, как войти в фоновый режим
Вы все можете знать, что iOS снимает снимок вашего приложения, прежде чем бросать его в фоновом режиме. Это, как правило, для лучшего пользовательского опыта, такого как быстрая анимация, чтобы вернуть приложение и так далее. Я не хочу, чтобы на экране сохранялся снимок экрана приложения, но я хочу, чтобы многозадачность все еще существовала.
У меня появилось решение, но я не уверен, что я направляюсь в правильном направлении. Таким образом, когда вызывается applicationDidEnterBackground
, я помещаю в оверлейное изображение, которое будет захвачено ОС, и как только приложение войдет на передний план, я удалю оверлей. Я не уверен, что это сработает, но я нахожусь на пути к этому. Между тем, любые другие мысли по этому поводу помогут мне разобраться в оптимальном способе решения этой проблемы.
Ответы
Ответ 1
Ты на правильном пути. Это рекомендуемый Apple способ сделать это, как отмечено в Руководстве по программированию приложений iOS:
Удалите конфиденциальную информацию из представлений, прежде чем перейти к фону. Когда приложение переходит в фоновый режим, система делает снимок главного окна приложения, который затем кратко представляет при переводе приложения обратно на передний план. Прежде чем вернуться из вашего applicationDidEnterBackground:
метода, вы должны скрыть или скрыть пароли и другую конфиденциальную личную информацию, которая может быть захвачена как часть снимка.
Ответ 2
Необходимо написать код в методах жизненного цикла приложения, здесь мы помещаем imageView
, а приложение оживляет фон:
-(void)applicationWillResignActive:(UIApplication *)application
{
imageView = [[UIImageView alloc]initWithFrame:[self.window frame]];
[imageView setImage:[UIImage imageNamed:@"Splash_Screen.png"]];
[self.window addSubview:imageView];
}
Вот код для удаления imageView
:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if(imageView != nil) {
[imageView removeFromSuperview];
imageView = nil;
}
}
Он работает и проверен правильно.
Ответ 3
Я столкнулся с той же проблемой, и мои исследования привели меня к следующим ответам:
-
установите размытое наложение экрана перед тем, как приложение зайдет в фоновом режиме и как только приложение станет активным, удалите этот оверлей
-
если это iOS 7 или более поздняя версия, вы можете использовать функцию
ignoreSnapshotOnNextApplicationLaunch
См. документацию по яблоку:
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/ignoreSnapshotOnNextApplicationLaunch
Надеюсь, это поможет кому-то.
Ответ 4
Ваш подход - это точно правильный и единственный способ сделать это. Поместите оверлейный вид и удалите его позже. Это действительно так, если ваше приложение показывает конфиденциальные данные, которые вы не хотите кэшировать в формате изображения в любом месте.
Ответ 5
Документ Apple, https://developer.apple.com/library/archive/qa/qa1838/_index.html
Примечание. Ваша реализация -applicationDidEnterBackground: не должна запускать анимацию (передайте NO любому параметру animated:). Снимок окна вашего приложения создается сразу после возвращения из этого метода. Анимации не будут завершены до того, как будет сделан снимок.
Преобразованный код Apple в делегате Swift 4.2 App, который я объявил
func applicationDidEnterBackground(_ application: UIApplication) {
// Your application can present a full screen modal view controller to
// cover its contents when it moves into the background. If your
// application requires a password unlock when it retuns to the
// foreground, present your lock screen or authentication view controller here.
let blankViewController = UIViewController()
blankViewController.view.backgroundColor = UIColor.black
// Pass NO for the animated parameter. Any animation will not complete
// before the snapshot is taken.
window.rootViewController?.present(blankViewController, animated: false)
}
func applicationWillEnterForeground(_ application: UIApplication) {
// This should be omitted if your application presented a lock screen
// in -applicationDidEnterBackground:
window.rootViewController?.dismiss(animated: false) false
}
Ответ 6
Улучшение должности Депака Кумара:
Сделайте свойство 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;
}
}
Ответ 7
В iOS 7 вы можете использовать allowScreenShot
, чтобы остановить все вместе.
Смотрите: Разработчик Apple: описание профиля конфигурации:
allowScreenShot
логический
Необязательный. Если установлено значение false
, пользователи не могут сохранить скриншот дисплея и не смогут захватить запись на экране; это также препятствует тому, чтобы приложение Classroom наблюдало удаленные экраны. По умолчанию true
. Доступность: Обновлено в iOS 9.0 для включения записей на экране.
Ответ 8
Методы работы в AppDelegate, swift 4.2:
func blurScreen(style: UIBlurEffect.Style = UIBlurEffect.Style.regular) {
screen = UIScreen.main.snapshotView(afterScreenUpdates: false)
let blurEffect = UIBlurEffect(style: style)
let blurBackground = UIVisualEffectView(effect: blurEffect)
screen?.addSubview(blurBackground)
blurBackground.frame = (screen?.frame)!
window?.addSubview(screen!)
}
func removeBlurScreen() {
screen?.removeFromSuperview()
}
Где:
weak var screen : UIView? = nil // property of the AppDelegate
Вызовите эти методы в необходимых методах делегата:
func applicationWillResignActive(_ application: UIApplication) {
blurScreen()
}
func applicationDidBecomeActive(_ application: UIApplication) {
removeBlurScreen()
}
Ответ 9
Реализация с некоторой анимацией при переходе в фоновый режим и обратном действии
- (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];
}];
}
Ответ 10
версия swift 4.0.
для использования пользовательского значка
сначала добавьте эту строку в верхней части AppDelegate
var imageView: UIImageView?
и добавьте это:
func applicationDidEnterBackground(_ application: UIApplication) {
imageView = UIImageView(frame: window!.frame)
imageView?.image = UIImage(named: "AppIcon")
window?.addSubview(imageView!)
}
func applicationWillEnterForeground(_ application: UIApplication) {
if imageView != nil {
imageView?.removeFromSuperview()
imageView = nil
}
}
фон с черным цветом
func applicationDidEnterBackground(_ application: UIApplication) {
let blankViewController = UIViewController()
blankViewController.view.backgroundColor = UIColor.black
window?.rootViewController?.present(blankViewController, animated: false)
}
func applicationWillEnterForeground(_ application: UIApplication) {
window?.rootViewController?.dismiss(animated: false)
}