1. ホーム
  2. ios

[解決済み] iOS 7のマルチタスキングスイッチャーでスクリーンショットを制御する

2023-01-04 01:47:02

質問

iOS 7 の新しいマルチタスク スイッチャーと、特にアプリが休止状態に入るときに OS が撮影するスクリーンショットについて、いくつかの情報を見つけようとしています。

この機能またはスクリーンショットを完全にオフにする方法はありますか? または、スイッチャーからアプリを完全に隠すことはできますか? アプリはバックグラウンドで実行する必要がありますが、アプリからのスクリーンショットは表示したくありません。

カード番号や口座の概要がデバイスのホーム ボタンをダブルクリックした人に公開されるような銀行アプリの場合、スクリーンショットは潜在的にセキュリティ リスクになります。

このことについて何かご存知の方はいらっしゃいますか?ありがとうございます。

どのように解決するのですか?

UIをバックグラウンドで動作させるための準備 で、Apple が言っています。

アプリ スナップショット用に UI を準備する

アプリがバックグラウンドに入り、デリゲートメソッドが戻った後のある時点で、UIKit はアプリの現在のユーザーインターフェースのスナップショットを取得します。システムはその結果の画像をアプリのスイッチャーに表示します。また、アプリをフォアグラウンドに戻すときにも、一時的にこの画像が表示されます。

アプリの UI には、パスワードやクレジットカード番号などの機密性の高いユーザー情報を含めてはなりません。インターフェイスにそのような情報が含まれている場合、バックグラウンドに入るときにビューからそれを削除します。また、アプリのコンテンツを見えなくするアラート、一時的なインターフェイス、およびシステムビューコントローラーも削除してください。スナップショットは、アプリのインターフェイスを表し、ユーザーが認識できるようにする必要があります。アプリがフォアグラウンドに戻ったとき、データやビューを適切に復元することができます。

参照 Technical Q&A QA1838: タスクスイッチャーに機密情報が表示されないようにするために

機密情報を見えなくしたり置き換えたりすることに加えて、iOS 7 に画面のスナップショットを撮らないようにするために ignoreSnapshotOnNextApplicationLaunch とドキュメントに書かれています。

アプリを再起動したときに、スナップショットがアプリのユーザーインターフェイスを正しく反映できないと感じる場合は、アプリを再起動する前に ignoreSnapshotOnNextApplicationLaunch を使用して、そのスナップショット画像が取得されないようにすることができます。

とはいえ、画面のスナップショットはまだ撮影されるようなので、バグ レポートを提出しました。しかし、さらにテストして、この設定を使用することで解決するかどうかを確認する必要があります。

これがエンタープライズ アプリであった場合、適切な設定の allowScreenShot に概説されている 制限のペイロード セクションの コンフィギュレーションプロファイルリファレンス


私が必要としたことを実現する実装を紹介します。あなたは自分の UIImageView を提示することもできますし、delegate-protocolパターンを使って機密情報を見えなくすることもできます。

//  SecureDelegate.h

#import <Foundation/Foundation.h>

@protocol SecureDelegate <NSObject>

- (void)hide:(id)object;
- (void)show:(id)object;

@end

そして、アプリのデリゲートにそのためのプロパティを与えました。

@property (weak, nonatomic) id<SecureDelegate> secureDelegate;

私のビューコントローラが設定します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    delegate.secureDelegate = self;
}

ビューコントローラは明らかにそのプロトコルを実装しています。

- (void)hide:(id)object
{
    self.passwordLabel.alpha = 0.0;
}

- (void)show:(id)object
{
    self.passwordLabel.alpha = 1.0;
}

そして最後に、私のアプリのデリゲートは、このプロトコルとプロパティを利用します。

- (void)applicationWillResignActive:(UIApplication *)application
{
    [application ignoreSnapshotOnNextApplicationLaunch];  // this doesn't appear to work, whether called here or `didFinishLaunchingWithOptions`, but seems prudent to include it

    [self.secureDelegate hide:@"applicationWillResignActive:"];  // you don't need to pass the "object", but it was useful during my testing...
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [self.secureDelegate show:@"applicationDidBecomeActive:"];
}

注:ここでは applicationWillResignActive ではなく、推奨されている applicationDidEnterBackground なぜなら、他の人が指摘したように、後者はアプリの実行中にホーム ボタンをダブルタップしても呼び出されないからです。

私は、デリゲート プロトコル パターンではなく、このすべてを処理するために通知を使用できればと思いますが、私の限られたテストでは、通知は十分にタイムリーに処理されませんが、上記のパターンはうまく機能します。