Khi Chuẩn bị giao diện người dùng của bạn để chạy trong nền , Apple cho biết:
Chuẩn bị giao diện người dùng của bạn cho Ảnh chụp nhanh ứng dụng
Tại một số thời điểm sau khi ứng dụng của bạn vào nền và phương thức ủy quyền của bạn trở lại, UIKit sẽ chụp nhanh giao diện người dùng hiện tại của ứng dụng của bạn. Hệ thống hiển thị hình ảnh kết quả trong trình chuyển đổi ứng dụng. Nó cũng hiển thị hình ảnh tạm thời khi đưa ứng dụng của bạn trở lại nền trước.
Giao diện người dùng của ứng dụng của bạn không được chứa bất kỳ thông tin người dùng nhạy cảm nào, chẳng hạn như mật khẩu hoặc số thẻ tín dụng. Nếu giao diện của bạn chứa thông tin như vậy, hãy xóa thông tin đó khỏi chế độ xem của bạn khi nhập nền. Ngoài ra, loại bỏ cảnh báo, giao diện tạm thời và bộ điều khiển chế độ xem hệ thống che khuất nội dung ứng dụng của bạn. Ảnh chụp nhanh đại diện cho giao diện ứng dụng của bạn và người dùng phải dễ nhận biết. Khi ứng dụng của bạn trở lại nền trước, bạn có thể khôi phục dữ liệu và chế độ xem nếu thích hợp.
Xem phần hỏi đáp kỹ thuật QA1838: Ngăn thông tin nhạy cảm xuất hiện trong công cụ chuyển đổi tác vụ
Ngoài việc che khuất / thay thế thông tin nhạy cảm, bạn cũng có thể yêu cầu iOS 7 không chụp ảnh nhanh màn hình ignoreSnapshotOnNextApplicationLaunch
, tài liệu có ghi:
Nếu bạn cảm thấy rằng ảnh chụp nhanh không thể phản ánh chính xác giao diện người dùng của ứng dụng khi ứng dụng của bạn được khởi chạy lại, bạn có thể gọi ignoreSnapshotOnNextApplicationLaunch
để ngăn không cho chụp ảnh chụp nhanh đó.
Có nói rằng, có vẻ như ảnh chụp nhanh màn hình vẫn được chụp và do đó tôi đã gửi báo cáo lỗi. Nhưng bạn nên kiểm tra thêm và xem việc sử dụng cài đặt này có hữu ích không.
Nếu đây là ứng dụng dành cho doanh nghiệp, bạn cũng có thể muốn xem xét cài đặt thích hợp được allowScreenShot
nêu trong phần Tải trọng hạn chế của Tham chiếu hồ sơ cấu hình.
Đây là cách triển khai đạt được những gì tôi cần. Bạn có thể trình bày của riêng bạn UIImageView
hoặc của bạn có thể sử dụng một mẫu giao thức ủy quyền để che khuất thông tin bí mật:
// SecureDelegate.h
#import <Foundation/Foundation.h>
@protocol SecureDelegate <NSObject>
- (void)hide:(id)object;
- (void)show:(id)object;
@end
Sau đó, tôi đã cấp cho người ủy quyền ứng dụng của mình một thuộc tính cho điều đó:
@property (weak, nonatomic) id<SecureDelegate> secureDelegate;
Bộ điều khiển chế độ xem của tôi đặt nó:
- (void)viewDidLoad
{
[super viewDidLoad];
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
delegate.secureDelegate = self;
}
Bộ điều khiển chế độ xem rõ ràng thực hiện giao thức đó:
- (void)hide:(id)object
{
self.passwordLabel.alpha = 0.0;
}
- (void)show:(id)object
{
self.passwordLabel.alpha = 1.0;
}
Và, cuối cùng, đại biểu ứng dụng của tôi sử dụng chính giao thức và thuộc tính này:
- (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:"];
}
Lưu ý, tôi đang sử dụng applicationWillResignActive
chứ không phải lời khuyên applicationDidEnterBackground
, bởi vì, như những người khác đã chỉ ra, cái sau không được gọi khi nhấn đúp vào nút trang chủ trong khi ứng dụng đang chạy.
Tôi ước mình có thể sử dụng thông báo để xử lý tất cả những điều này, thay vì mẫu giao thức ủy quyền, nhưng trong thử nghiệm giới hạn của tôi, các thông báo không được xử lý kịp thời, nhưng mẫu trên hoạt động tốt.