Soru ApplicationDidEnterBackground'dan önce bir görünüm veya açılış ekranı görüntüleyin (aktif ekran görüntüsünü önlemek için)


Uygulamamdaki gizli bilgilerim var. Bu yüzden, uygulama arka plana taşınmak üzere olduğunda bir açılış ekranı ile gizlemek istiyorum.

İOS6 ve daha ileri sürümlerde uygulamayı çalıştırıyorum.

Görünümü görüntülemeye çalıştım applicationWillResignActive Ancak sorun, örneğin kullanıcı tokatlamak kontrol paneli bile olsa, açılış ekranı görüntülenir. Sadece uygulama arka plana taşındığında gösterilmesini istiyorum.

SplashScreen'imi görüntülemeye çalıştım applicationDidEnterBackground ancak önce bu ekran görüntüsü, animasyon sırasında restorasyon sırasında görüntülenir.

İşte istediğimin ruhu:

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

32
2017-11-05 15:42


Menşei


AFAIK, eyleminizi içeride yapmanız gerekiyor applicationWillResignActive ve aynı eylemi geri al applicationDidBecomeActive arasında UIApplicationDelegate yöntemleri. - Ashok
Sorun şu ki, eğer benim açılış ekranımı göstersem applicationWillResignActiveo zaman kullanıcı sadece kontrol paneline baktığı zaman veya ev düğmesine çift tıklandığında görüntülenir. - AncAinu
Paypal iOS uygulaması benzer bir şey yapar, uygulama arka plana girdiğinde son kullanıcı bilgilerini bulanıklaştırır (kullanıcı bilgilerini güvenli hale getirmek için). Bunu veya başka uygulamaları incelemenizi tavsiye ederim. DÜZENLEME: Kontrol paneli açıldığında paypalın bulanıklaştığını fark ettim, böylece elde etmeye çalıştığınız şeyin mümkün olabileceğine inanıyorum. Bu konuya bir saat devam edecek. - Ashok
Yapmak istediğim türden bir şey (benim uygulamam banka bilgileriyle de ilgileniyor), fakat emin değilim ki, ödeme kodunu görmeme izin ver: / - AncAinu
@Andrea - Fakat aradığı şey diğer birçok finansal açıdan mümkün olabiliyor (güvenlik arayan) uygulamalar gibi Paypal, BofA öyle yapar. (Not - iPad'de - kontrol merkezi, bildirim merkezi vb. Kısmen uygulamayı kapsar). Bence çözüm zor değil ama sadece bana tıklama değil. Bu soruya, doğru düşüncenin dikkatini çekmek için oy verelim :). Ayrıca @AncAinu - Eğer zaten yapılmadıysa, gerçek cihazdaki (sadece simülatör değil) çözümünüzü denemelisiniz. - Ashok


Cevaplar:


Sorun şu ki test ediyorsun simülatör. Cihazda, iyi çalışması gerekir.

Bunu test ettim ve işe yaradı. Uygulama arka planda girdiğinde, splash resminizle bir resim görünümü ekleyin -

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

Ve uygulama ön planda olduğunda -

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

}

NOT - Simülatörde (iOS 7.0), ana ekran düğmesine iki kez basarak (Cmd + H), eklediğiniz alt ekran gösterilmez, ancak cihazda beklendiği gibi çalışır. paypal, BofA uygulamalar)

EDIT: (Ek bilgi)

Yukarıda açıklandığı gibi alt görüntü / bulanıklık ekleyerek hassas bilgilerin gizlenmesi / değiştirilmesiyle birlikte, iOS 7 ekran anlık görüntüsünü yok saymanıza olanak tanır ignoreSnapshotOnNextApplicationLaunch arasında UIApplication içeride applicationWillResignActive veya 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);

Ayrıca, allowScreenShot bayrak araştırılabilir Kısıtlamalar Yükü.


38
2017-11-05 16:03



Evet, yıldırımın öldüğü gündü ... Gerçekten de gerçek cihazda iyi çalışıyor. - AncAinu
Bu, bir video oynatılıyorsa çalışır. Hangi videonun oynatıldığını gizleyebilirim? - MwcsMac


Hızlı 3.0 Cevap tercüme etmek için tembel olanlar için.

func applicationDidEnterBackground(_ application: UIApplication) {

    let imageView = UIImageView(frame: self.window!.bounds)
    imageView.tag = 101
    imageView.image = ...

    UIApplication.shared.keyWindow?.subviews.last?.addSubview(imageView)
 }

func applicationWillEnterForeground(_ application: UIApplication) {

    if let imageView : UIImageView = UIApplication.shared.keyWindow?.subviews.last?.viewWithTag(101) as? UIImageView {
        imageView.removeFromSuperview()
    }

}

6
2018-02-28 12:50





Aynı sorunu vardı, aslında kullanıyordum applicationDidEnterBackground İçeriğin üst kısmında bir UIWindow göstermek için, ancak iOS8'de iOS7'de olduğu gibi çalışmadı.

Bulduğum çözüm UIWindow'u oluşturmaktı. applicationWillResignActive ama sakla onu securityWindow.hidden = YES; ve sonra applicationDidEnterBackground tek yapmam gereken değiştirmek securityWindow.hidden = NO.

Bu, NotificationCenter veya ControlPanel kullanırken görünümü etkilemeden çok görevlendirildiğinde, içeriği tamamen gizleyen iOS7 gibi çalışır.


4
2017-11-11 10:18



Bu tam ihtiyacım olan şey. İOS7’den iOS9’a test edildi. - Vilém Kurz


Neden olduğunu bilmiyorum, ama burada açıklanan yöntemlerin hiçbiri benim için çalıştı. Güvenlik nedenleriyle ekranı kapatmaya çalışıyorum. Yani, Apple'dan bir Teknik Soru Cevap oldu: https://developer.apple.com/library/ios/qa/qa1838/_index.html

Sanırım ana fark UIViewController kullanıyor? Her neyse, aşağıdaki kod IOS 9.1'de benim için mükemmel çalışıyor:

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

3
2017-12-15 09:37





Kodu aşağıdaki gibi yazmanız gerekiyor:

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

Resim görünümünü kaldırmak için:

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

Çalışıyor ve düzgün bir şekilde test ediliyor.


1
2017-10-29 11:34





@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

0
2018-06-11 09:20



Ekranda bazı sistem uyarılarının gösterilmesi durumunda ne yaparsınız? Bu durumda MySplashView da ekranda gösterilir. Bunu önleyebilir miyim? - Klemen Zagar


Bu benim için düzeltildi, bu Xamarin.Forms için özür dilerim ama fikir almalısınız. Xamarin'de UIView.SnapshotView (true) öğesini çağırmanız veya UIView snapshotViewAfterScreenUpdates iOS'ta. İOS7'de DidEnterBackground ve iOS8'de çalışır:

public override void DidEnterBackground(UIApplication uiApplication)
{
    App.Current.MainPage = new DefaultPage();
    **UIApplication.SharedApplication.KeyWindow.SnapshotView(true);**
    base.DidEnterBackground(uiApplication);
}

0
2017-09-17 01:33





Bunun için yardımcı olacağını düşünüyorum Swift 3.0

func applicationWillResignActive(_ application: UIApplication) {

        let imageView = UIImageView(frame: self.window!.bounds)
        imageView.tag = 101
        imageView.backgroundColor = UIColor.white
        imageView.contentMode = .center
        imageView.image = #image#
        UIApplication.shared.keyWindow?.subviews.last?.addSubview(imageView)

    }

func applicationWillEnterForeground(_ application: UIApplication) {
        ReachabilityManager.shared.stopMonitoring()
        if let imageView : UIImageView = UIApplication.shared.keyWindow?.subviews.last?.viewWithTag(101) as? UIImageView {
            imageView.removeFromSuperview()
        }
    }

0
2018-03-28 10:05