web-dev-qa-db-ja.com

iOSがバックグラウンドに入る前にアプリの画面キャプチャを取得しないようにする

IOSがアプリケーションをバックグラウンドに置く前にスクリーンショットを撮ることをご存じでしょう。これは通常、アプリを元に戻すためのクイックアニメーションなどのユーザーエクスペリエンスを向上させるためのものです。アプリのスクリーンショットをデバイスに保存したくありませんが、マルチタスクは引き続き存在させたいです。

解決策は出ましたが、正しい方向に進んでいるかどうかはわかりません。したがって、applicationDidEnterBackgroundが呼び出されると、OSによってキャプチャされるオーバーレイイメージが挿入され、アプリがフォアグラウンドに入ると、オーバーレイが削除されます。これがうまくいくかどうかはわかりませんが、実装する途中です。一方、これに関する他の考えは、この問題を攻撃する最適な方法を見つけるのに役立ちます。

30
Mobilewits

あなたは正しい軌道に乗っています。これはAppleが推奨する方法です iOSアプリケーションプログラミングガイドに記載されています

バックグラウンドに移動する前に、ビューから機密情報を削除します。アプリケーションがバックグラウンドに移行すると、システムはアプリケーションのメインウィンドウのスナップショットを取得します。次に、アプリケーションをフォアグラウンドに戻すときに簡単に表示されます。から戻る前にapplicationDidEnterBackground:メソッドを使用する場合は、スナップショットの一部としてキャプチャされる可能性のあるパスワードやその他の機密個人情報を非表示にするか隠す必要があります。

29
Ole Begemann

アプリケーションのライフサイクルメソッドでコードを記述する必要があります。ここでは、アプリがバックグラウンドでアニメーション化している間に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;
    }
}

動作しており、適切にテストされています。

15
Deepak Kumar

私は同じ問題に遭遇しました、そして私の研究は以下の答えに私を導きました:

  • アプリがバックグラウンドになる前にぼやけた画面オーバーレイを設定し、アプリがアクティブになったらこのオーバーレイを削除します

  • iOS 7以降の場合は、関数ignoreSnapshotOnNextApplicationLaunchを使用できます。

Appleドキュメント: https://developer.Apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//Apple_ref/ occ/instm/UIApplication/ignoreSnapshotOnNextApplicationLaunch

これが誰かに役立つことを願っています。

10
Lily

あなたのアプローチはまさに正しい、それを行う唯一の方法です。オーバーレイビューを配置し、後で削除します。アプリが、どこにも画像形式でキャッシュしたくない機密データを表示する場合、これを行うのは有効です。

6
Krumelur

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
}
2
Ourang-Zeb Khan

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;
    }
}
1
Xeieshan

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()
}
0
Agisight

IOS 7では、allowScreenShotを使用してすべての機能を同時に停止できます。

参照: Apple Developer:Configuration Profile Reference

allowScreenShot


ブール
オプション。 falseに設定すると、ユーザーはディスプレイのスクリーンショットを保存できず、画面記録をキャプチャできなくなります。また、Classroomアプリがリモート画面を監視することもできません。デフォルトはtrue。です。

可用性:iOS 9.0で更新され、画面の記録が含まれるようになりました。

0
Michael Bazzoni

バックグラウンドおよびリバースアクションでのアニメーションの実装

   - (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];
    }];

 }
0
Ankit Aman

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)
}
0
blacker