में पृष्ठभूमि में चलाने के लिए अपने यूआई तैयार कर रहा है , एप्पल का कहना है:
ऐप स्नैपशॉट के लिए आपका UI तैयार करें
आपके एप्लिकेशन के बैकग्राउंड में प्रवेश करने के बाद और आपके प्रतिनिधि विधि के वापस आने के कुछ समय बाद, UIKit आपके ऐप के वर्तमान उपयोगकर्ता इंटरफ़ेस का एक स्नैपशॉट लेता है। सिस्टम ऐप स्विचर में परिणामी छवि प्रदर्शित करता है। यह आपके ऐप को अग्रभूमि में लाते समय अस्थायी रूप से छवि प्रदर्शित करता है।
आपके ऐप के UI में कोई भी संवेदनशील उपयोगकर्ता जानकारी नहीं होनी चाहिए, जैसे पासवर्ड या क्रेडिट कार्ड नंबर। यदि आपके इंटरफ़ेस में ऐसी जानकारी है, तो पृष्ठभूमि में प्रवेश करते समय इसे अपने विचारों से हटा दें। इसके अलावा, अलर्ट, अस्थायी इंटरफेस और सिस्टम व्यू कंट्रोलर को खारिज करें जो आपके ऐप की सामग्री को अस्पष्ट करते हैं। स्नैपशॉट आपके ऐप के इंटरफ़ेस का प्रतिनिधित्व करता है और उपयोगकर्ताओं के लिए पहचानने योग्य होना चाहिए। जब आपका ऐप अग्रभूमि में वापस आ जाता है, तो आप डेटा और विचारों को उपयुक्त रूप से पुनर्स्थापित कर सकते हैं।
देखें तकनीकी क्यू एंड ए QA1838: टास्क स्विचर में दिखाई देने से संवेदनशील जानकारी को रोकना
संवेदनशील जानकारी को अस्पष्ट / प्रतिस्थापित करने के अलावा, आप iOS 7 को स्क्रीन स्नैपशॉट के माध्यम से नहीं लेने के लिए भी कह सकते हैं ignoreSnapshotOnNextApplicationLaunch, जिसके प्रलेखन:
यदि आपको लगता है कि स्नैपशॉट आपके ऐप के उपयोगकर्ता इंटरफ़ेस को सही ढंग से प्रतिबिंबित नहीं कर सकता है, जब आपका ऐप पुनः लॉन्च किया जाता है, तो आप ignoreSnapshotOnNextApplicationLaunchउस स्नैपशॉट छवि को ले जाने से रोकने के लिए कॉल कर सकते हैं ।
ऐसा कहने के बाद, ऐसा प्रतीत होता है कि स्क्रीन स्नैपशॉट अभी भी लिया गया है और इसलिए मैंने एक बग रिपोर्ट दर्ज की है। लेकिन आपको आगे परीक्षण करना चाहिए और देखना चाहिए कि क्या यह सेटिंग मदद करती है।
यदि यह एक एंटरप्राइज़ ऐप था, तो आप कॉन्फ़िगरेशन संदर्भ संदर्भallowScreenShot के प्रतिबंध पेलोड अनुभाग में उल्लिखित उचित सेटिंग पर भी ध्यान देना चाहेंगे ।
यहां एक कार्यान्वयन है जो मुझे आवश्यक है वह प्राप्त करता है। आप UIImageViewगोपनीय जानकारी को अस्पष्ट करने के लिए अपने स्वयं के या अपने किसी प्रतिनिधि-प्रोटोकॉल पैटर्न का उपयोग कर सकते हैं:
// SecureDelegate.h
#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]; // 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:"];
}
ध्यान दें, मैं applicationWillResignActiveसलाह के बजाय उपयोग कर रहा हूं applicationDidEnterBackground, क्योंकि, जैसा कि अन्य ने बताया है, ऐप को चालू करते समय होम बटन पर डबल टैप करने पर उत्तरार्द्ध को नहीं बुलाया जाता है।
काश, मैं प्रतिनिधि-प्रोटोकॉल पैटर्न के बजाय, इन सभी को संभालने के लिए सूचनाओं का उपयोग कर सकता था, लेकिन मेरे सीमित परीक्षण में, सूचनाएं समय पर पर्याप्त तरीके से नियंत्रित नहीं की जाती हैं, लेकिन उपरोक्त पैटर्न ठीक काम करता है।