35

アプリに機密情報があるため、アプリがバックグラウンドに移行しようとしているときにスプラッシュ スクリーンでそれらを非表示にしたいと考えています。

iOS6以降でアプリを実行します。

ビューを表示しようとしましapplicationWillResignActiveたが、たとえばユーザーがコントロール パネルをスワイプしてもスプラッシュ スクリーンが表示されるという問題があります。アプリがバックグラウンドに移動したときにのみ表示したい。

私は自分のsplashScreenを表示しようとしましapplicationDidEnterBackgroundたが、以前にスクリーンショットを取るため、アニメーション中の復元時に情報が表示されます.

ここに私が欲しいものの精神:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    [_window addSubview:__splashController.view];
}
4

8 に答える 8

41

問題は、シミュレーターでテストしていることだと思います。デバイスでは、正常に動作するはずです。

これをテストしたところ、うまくいきました。アプリがバックグラウンドに入ったときに、スプラッシュ画像を含むイメージビューを追加します -

- (void)applicationDidEnterBackground:(UIApplication *)application
{

        UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.window.bounds];

        imageView.tag = 101;    // Give some decent tagvalue or keep a reference of imageView in self
    //    imageView.backgroundColor = [UIColor redColor];
        [imageView setImage:[UIImage imageNamed:@"Default.png"]];   // assuming Default.png is your splash image's name

        [UIApplication.sharedApplication.keyWindow.subviews.lastObject addSubview:imageView];
}

そして、アプリがフォアグラウンドに戻ったとき -

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    UIImageView *imageView = (UIImageView *)[UIApplication.sharedApplication.keyWindow.subviews.lastObject viewWithTag:101];   // search by the same tag value
    [imageView removeFromSuperview];

}

注 - シミュレーター (iOS 7.0) では、ホーム ボタンを 2 回押して確認すると (Cmd + H)、追加されたサブビューは表示されませんが、デバイスでは期待どおりに動作します (アプリなどpaypal) BofA

編集:(追加情報)

上記で説明したように、サブビュー/ぼかしを追加して機密情報を隠したり置き換えたりすることに加えて、iOS 7ではignoreSnapshotOnNextApplicationLaunchUIApplication内部applicationWillResignActiveまたはapplicationDidEnterBackground.

UIApplication.h

// Indicate the application should not use the snapshot on next launch, even if there is a valid state restoration archive.
// This should only be called from methods invoked from State Preservation, else it is ignored.
- (void)ignoreSnapshotOnNextApplicationLaunch NS_AVAILABLE_IOS(7_0);

また、allowScreenShotフラグは制限ペイロードで調べることができます。

于 2013-11-05T16:03:12.220 に答える
4

同じ問題があり、基本的にapplicationDidEnterBackgroundコンテンツの上に UIWindow を表示するために使用していましたが、iOS8 では iOS7 のように機能しませんでした。

私が見つけた解決策は、 UIWindow を作成することでしたapplicationWillResignActiveが、非表示にしました securityWindow.hidden = YES。そして、applicationDidEnterBackground私がすることは、変更することだけsecurityWindow.hidden = NOです。

これは、NotificationCenter または ControlPanel を使用しているときにビューに影響を与えることなく、マルチタスク時にコンテンツを隠す iOS7 とまったく同じように機能するようです。

于 2014-11-11T10:18:59.233 に答える
3

理由はわかりませんが、ここで説明する方法はどれもうまくいきませんでした。セキュリティ上の理由から、画面を隠そうとしただけです。そこで、Apple からのテクニカル Q&A が役に立ちました: https://developer.apple.com/library/ios/qa/qa1838/_index.html

主な違いはUIViewControllerを使用していると思いますか? とにかく、次のコードは IOS 9.1 で完全に機能します。

- (void)applicationDidEnterBackground:(UIApplication *)application
{     
    UIViewController *blankViewController = [UIViewController new];
    blankViewController.view.backgroundColor = [UIColor blackColor];

    [self.window.rootViewController presentViewController:blankViewController animated:NO completion:NULL];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [self.window.rootViewController dismissViewControllerAnimated:NO completion:NO];
}
于 2015-12-15T09:37:06.623 に答える
2

次のようにコードを記述する必要があります。

-(void)applicationWillResignActive:(UIApplication *)application
{
    imageView = [[UIImageView alloc]initWithFrame:[self.window frame]];
    [imageView setImage:[UIImage imageNamed:@"Portrait(768x1024).png"]];
    [self.window addSubview:imageView];
}

イメージビューを削除するには:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if(imageView != nil) {
        [imageView removeFromSuperview];
        imageView = nil;
    }
}

それは機能しており、適切にテストされています。

于 2014-10-29T11:34:34.110 に答える
0
@interface MyAppDelegate ()
@property (strong, nonatomic) MySplashView *splashView;
@end
@implementation MyAppDelegate
- (void)applicationWillResignActive:(UIApplication *)application {
    // hide keyboard and show a splash view
    [self.window endEditing:YES];
    MySplashView *splashView = [[MySplashView alloc] initWithFrame:self.window.bounds];
    [self.window addSubview:splashView];
    self.splashView = splashView;
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
    // remove the splash view
    if (self.splashView) {
        [self.splashView removeFromSuperview];
        self.splashView = nil;
    }
}
@end
于 2014-06-11T09:20:41.390 に答える
0

これで修正されました。申し訳ありませんが、これは Xamarin.Forms の場合ですが、アイデアを得る必要があります。UIView snapshotViewAfterScreenUpdatesxamarin またはiOSで UIView.SnapshotView(true) を呼び出す必要があります。iOS7 および iOS8 の DidEnterBackground で動作します。

public override void DidEnterBackground(UIApplication uiApplication)
{
    App.Current.MainPage = new DefaultPage();
    **UIApplication.SharedApplication.KeyWindow.SnapshotView(true);**
    base.DidEnterBackground(uiApplication);
}
于 2015-09-17T01:33:47.363 に答える