ในการเตรียม UI ของคุณให้ทำงานในพื้นหลัง Apple กล่าวว่า:
เตรียม UI ของคุณสำหรับ App Snapshot
เมื่อถึงจุดหนึ่งหลังจากที่แอปของคุณเข้าสู่พื้นหลังและวิธีการมอบสิทธิ์ของคุณกลับมา UIKit จะถ่ายภาพรวมอินเทอร์เฟซผู้ใช้ปัจจุบันของแอปของคุณ ระบบจะแสดงภาพผลลัพธ์ในตัวสลับแอป นอกจากนี้ยังแสดงภาพชั่วคราวเมื่อนำแอปของคุณกลับไปที่พื้นหน้า
UI ของแอปของคุณต้องไม่มีข้อมูลผู้ใช้ที่ละเอียดอ่อนเช่นรหัสผ่านหรือหมายเลขบัตรเครดิต หากอินเทอร์เฟซของคุณมีข้อมูลดังกล่าวให้ลบออกจากมุมมองของคุณเมื่อเข้าสู่พื้นหลัง นอกจากนี้ปิดการแจ้งเตือนอินเทอร์เฟซชั่วคราวและตัวควบคุมมุมมองระบบที่บดบังเนื้อหาของแอปของคุณ สแนปชอตแสดงถึงอินเทอร์เฟซของแอปของคุณและผู้ใช้ควรจดจำได้ เมื่อแอปของคุณกลับสู่พื้นหน้าคุณสามารถกู้คืนข้อมูลและมุมมองได้ตามความเหมาะสม
ดูคำถามและคำตอบทางเทคนิค QA1838: การป้องกันไม่ให้ข้อมูลที่ละเอียดอ่อนปรากฏในตัวสลับงาน
นอกเหนือจากการปิดบัง / แทนที่ข้อมูลที่ละเอียดอ่อนแล้วคุณอาจต้องการบอกให้ iOS 7 ไม่ใช้สแนปชอตหน้าจอผ่านignoreSnapshotOnNextApplicationLaunch
ซึ่งมีเอกสารระบุว่า:
หากคุณรู้สึกว่าสแนปชอตไม่สามารถแสดงอินเทอร์เฟซผู้ใช้ของแอปของคุณได้อย่างถูกต้องเมื่อเปิดแอปอีกครั้งคุณสามารถโทรignoreSnapshotOnNextApplicationLaunch
เพื่อป้องกันไม่ให้ถ่ายภาพสแนปชอตนั้นได้
ต้องบอกว่าดูเหมือนว่ายังคงถ่ายภาพหน้าจออยู่ดังนั้นฉันจึงยื่นรายงานข้อบกพร่อง แต่คุณควรทดสอบเพิ่มเติมและดูว่าการใช้การตั้งค่านี้ช่วยได้หรือไม่
หากนี่เป็นแอปสำหรับองค์กรคุณอาจต้องการดูการตั้งค่าที่เหมาะสมตามที่allowScreenShot
ระบุไว้ในส่วนข้อ จำกัด Payloadของการอ้างอิงโปรไฟล์การกำหนดค่า
นี่คือการนำไปใช้งานที่บรรลุสิ่งที่ฉันต้องการ คุณสามารถนำเสนอของคุณเองUIImageView
หรือคุณสามารถใช้รูปแบบโปรโตคอลตัวแทนเพื่อปิดบังข้อมูลที่เป็นความลับ:
#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];
[self.secureDelegate hide:@"applicationWillResignActive:"];
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[self.secureDelegate show:@"applicationDidBecomeActive:"];
}
หมายเหตุฉันใช้applicationWillResignActive
มากกว่าคำแนะนำapplicationDidEnterBackground
เพราะอย่างที่คนอื่น ๆ ชี้ให้เห็นว่าหลังไม่ถูกเรียกเมื่อแตะสองครั้งที่ปุ่มโฮมในขณะที่แอปกำลังทำงาน
ฉันหวังว่าฉันจะใช้การแจ้งเตือนเพื่อจัดการสิ่งเหล่านี้ทั้งหมดแทนที่จะเป็นรูปแบบโปรโตคอลผู้ร่วมประชุม แต่ในการทดสอบที่ จำกัด ของฉันการแจ้งเตือนไม่ได้รับการจัดการอย่างทันท่วงที แต่รูปแบบข้างต้นใช้งานได้ดี