2011-09-22 148 views
20

大家可能都知道iOS在將應用程序投入後臺之前會截取屏幕截圖。這通常是爲了更好的用戶體驗,如快速動畫將應用程序帶回等等。我不希望我的應用程序屏幕截圖存儲在設備上,但我希望多任務仍然存在。防止iOS在進入後臺之前獲取應用程序的屏幕截圖

我拿出一個解決方案,但我不知道我是否正朝着正確的方向前進。所以,當調用applicationDidEnterBackground時 - 我放入一個將被操作系統捕獲的覆蓋圖像,一旦應用程序進入前景,我將刪除覆蓋圖。我不確定這是否會起作用,但我正在實施這個方法。同時,對此的任何其他想法將幫助我找出攻擊此問題的最佳方式。

+0

爲什麼你不想要的iOS做到這一點的原因嗎?正如你所說,截圖是採取執行快速動畫... –

+1

我有用戶的機密數據..所以有一些第三方工具,如iPhone瀏覽器,你可以進入iOS文件系統並提取圖像。我不想妥協這些數據...因此我計劃實施這種方法。 – Mobilewits

+0

這種方法完美無缺。謝謝大家! – Mobilewits

回答

24

你是在正確的軌道上。這是蘋果公司推薦的方法as noted in the iOS Application Programming Guide

移動到背景之前從視圖中刪除敏感信息。當應用程序轉換到後臺時,系統會拍攝應用程序主窗口的快照,然後在將應用程序轉換回前臺時,該窗口會短暫顯示。在從applicationDidEnterBackground:方法返回之前,您應該隱藏或遮掩可能作爲快照一部分捕獲的密碼和其他敏感個人信息。

+1

您是否知道設備上的這些屏幕截圖臨時存儲在哪裏? – Bazze

+2

'/ Library/Caches/Snapshots/$(BUNDLE_IDENTIFIER)/'是應用程序沙箱中的路徑。 –

+1

順便說一下,您可以使用Xcode的DeviceManager下載應用程序sandbox-container。 –

5

你的方法是正確的唯一方法。放置覆蓋視圖並稍後刪除。如果您的應用程序顯示您不希望以任何形式在圖像格式中緩存的敏感數據,則可以這樣做。

9

我遇到了同樣的問題,我的研究使我如下回答:

  • 設定一個模糊的屏幕覆蓋的應用進入後臺之前,一旦應用程序被激活刪除這個覆蓋

  • 如果是iOS 7以上版本,你可以使用函數 ignoreSnapshotOnNextApplicationLaunch

請參閱apple文檔: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/ignoreSnapshotOnNextApplicationLaunch

我希望這有助於某人。

+0

ignoreSnapshotOnNextApplicationLaunch聽起來很有趣,但這並不妨礙iOS在任何情況下都會截圖,對吧? – saxos

+0

我還沒有嘗試iOS 8中的這個功能,但在iOS 7中並沒有阻止截屏。 – Lily

+0

我在這裏遇到問題。無論我做什麼,我都無法停止應用程序快照不正確的窗口。 [在此頁面](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/index.html#//apple_ref/occ/instm/UIApplication/ignoreSnapshotOnNextApplicationLaunch),It Sayeth:「。調用這種方法讓UIKit知道它應該使用你的應用程序的默認啓動鏡像而不是快照 **你必須在你使用的代碼中調用這個方法來保存你的應用程序的狀態。續) –

0

在iOS 7中,您可以使用allowScreenShot來一起停止此功能。

參見:Apple Developer: Configuration Profile Reference

allowScreenShot


布爾
可選。如果設置爲 false,用戶將無法保存屏幕截圖並且無法捕獲屏幕錄製;它也阻止了Classroom應用程序觀察遠程屏幕。默認爲 true

可用性: iOS 9.0更新,包括屏幕錄像。

+0

鏈接不起作用,是不是它不是簡單地粘貼鏈接? –

+0

@ParikksitBhisay(我意識到這是非常古老的,但我想提到,因爲我在這裏處理垃圾郵件無論如何)這是一個簡短的,可能是壞的答案,但它是一個答案;它提到了所需的財產。 –

11

需要編寫的應用程序生命週期方法的代碼,在這裏我們把一個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; 
    } 
} 

它正在工作和正確測試。

+0

但該圖像未被iPad分配。 –

+0

當顯示警告對話框時,還要小心「applicationWillResignActive」。當你想顯示這個imageview可能不是。 – lostintranslation

+0

在iOS 11中測試了這個...它不是間歇性地工作 – user1872384

1

改善Depak庫馬爾後: 使屬性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; 
    } 
}