IOSがアプリケーションをバックグラウンドに置く前にスクリーンショットを撮ることをご存じでしょう。これは通常、アプリを元に戻すためのクイックアニメーションなどのユーザーエクスペリエンスを向上させるためのものです。アプリのスクリーンショットをデバイスに保存したくありませんが、マルチタスクは引き続き存在させたいです。
解決策は出ましたが、正しい方向に進んでいるかどうかはわかりません。したがって、applicationDidEnterBackground
が呼び出されると、OSによってキャプチャされるオーバーレイイメージが挿入され、アプリがフォアグラウンドに入ると、オーバーレイが削除されます。これがうまくいくかどうかはわかりませんが、実装する途中です。一方、これに関する他の考えは、この問題を攻撃する最適な方法を見つけるのに役立ちます。
あなたは正しい軌道に乗っています。これはAppleが推奨する方法です iOSアプリケーションプログラミングガイドに記載されています :
バックグラウンドに移動する前に、ビューから機密情報を削除します。アプリケーションがバックグラウンドに移行すると、システムはアプリケーションのメインウィンドウのスナップショットを取得します。次に、アプリケーションをフォアグラウンドに戻すときに簡単に表示されます。から戻る前に
applicationDidEnterBackground:
メソッドを使用する場合は、スナップショットの一部としてキャプチャされる可能性のあるパスワードやその他の機密個人情報を非表示にするか隠す必要があります。
アプリケーションのライフサイクルメソッドでコードを記述する必要があります。ここでは、アプリがバックグラウンドでアニメーション化している間に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;
}
}
動作しており、適切にテストされています。
私は同じ問題に遭遇しました、そして私の研究は以下の答えに私を導きました:
アプリがバックグラウンドになる前にぼやけた画面オーバーレイを設定し、アプリがアクティブになったらこのオーバーレイを削除します
iOS 7以降の場合は、関数ignoreSnapshotOnNextApplicationLaunchを使用できます。
これが誰かに役立つことを願っています。
あなたのアプローチはまさに正しい、それを行う唯一の方法です。オーバーレイビューを配置し、後で削除します。アプリが、どこにも画像形式でキャッシュしたくない機密データを表示する場合、これを行うのは有効です。
Apple Doc https://developer.Apple.com/library/archive/qa/qa1838/_index.html
注:-applicationDidEnterBackground:の実装ではアニメーションを開始しないでください(NOをanimated:パラメータに渡します)。このメソッドから戻るとすぐに、アプリケーションのウィンドウのスナップショットがキャプチャされます。スナップショットが作成されるまで、アニメーションは完了しません。
Converted Apple code in Swift 4.2 App delegate iclare
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
}
Depak Kumar投稿の改善:プロパティを作成する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;
}
}
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()
}
IOS 7では、allowScreenShot
を使用してすべての機能を同時に停止できます。
参照: Apple Developer:Configuration Profile Reference :
allowScreenShot
ブール
オプション。false
に設定すると、ユーザーはディスプレイのスクリーンショットを保存できず、画面記録をキャプチャできなくなります。また、Classroomアプリがリモート画面を監視することもできません。デフォルトはtrue
。です。可用性:iOS 9.0で更新され、画面の記録が含まれるようになりました。
バックグラウンドおよびリバースアクションでのアニメーションの実装
- (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];
}];
}
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)
}