iOS स्क्रीनशॉट का पता लगाने?


135

अप्प ऐप स्टोर पर स्नैपचैट , एक ऐप है, जो आपको उन पर सेल्फ-डिस्ट्रक्ट के साथ तस्वीरें साझा करने की सुविधा देता है। आप केवल X सेकंड के लिए पिक्स देख सकते हैं। यदि आप होम-पॉवर कुंजी कॉम्बो का उपयोग करके चित्र दिखा रहे हैं, तो स्क्रीनशॉट लेने का प्रयास करते हैं, यह आपको उस प्रेषक को बताएगा जिसने स्क्रीनशॉट लेने की कोशिश की थी।

एसडीके के किस भाग से आपको पता चलता है कि उपयोगकर्ता स्क्रीनशॉट ले रहा है? मुझे नहीं पता था कि यह संभव था।


1
stackoverflow.com/questions/2121970/… , ऐसा लगता है कि यह कॉल करने के लिए इस्तेमाल किया -applicationDidEnterBackground: स्क्रीनशॉट लेने से पहले। अभी उस पर यकीन नहीं है।
0

दोस्तों। दूसरे सूत्र का उत्तर है: stackoverflow.com/questions/2121970/…
me2

1
इसे भी देखें, stackoverflow.com/a/8711894/1730272 , यह कहता है कि यह किसी भी अधिक संभव नहीं है। संभवतः आप इसे आज़मा सकते हैं और हमें बता सकते हैं।
1

अभी तक इंटरनेट पर कहीं भी इसका उल्लेख नहीं किया गया है, लेकिन मैं यह मानूंगा कि यदि आप स्क्रीनशॉट लेने के लिए (आयोजक विंडो में डिवाइस से) का उपयोग करते हैं, तो कोई तरीका नहीं है जिससे ऐप को पता चल सकेगा। यह किसी स्नैपचैट फोटो को देखने के दौरान जोड़े गए किसी भी फोटो के लिए कैमरा रोल की निगरानी कर रहा होगा, और स्क्रीनशॉट को Xcode के माध्यम से लेते हुए इसे पूरी तरह से (जेलब्रेक की आवश्यकता के बिना) बायपास करता है।
स्माइबॉर्ग

फॉलो-अप: इस सिद्धांत का परीक्षण किया और पुष्टि की कि ऐप Xcode स्क्रीनशॉट का पता नहीं लगाता है। हालाँकि, मुझे एहसास हुआ कि दिलचस्प बात यह है कि iOS 6 पर, ऐप्स को फ़ोटो एक्सेस करने की अनुमति स्पष्ट रूप से दी जानी चाहिए ... फिर भी यह ऐप अभी भी फ़ोटो का उपयोग किए बिना स्क्रीनशॉट का पता लगाता है! यह पता लगाने के लिए दूसरी विधि का उपयोग करना चाहिए - मैं देख रहा हूं कि होम + स्लीप बटन विधि का उपयोग करते समय, सक्रिय फोटो को स्क्रीन से भी हटा दिया जाता है। तो इस स्क्रीनशॉट प्रक्रिया से संबंधित कुछ पैटर्न होना चाहिए, ऐप मज़बूती से मॉनिटर कर सकता है, शायद GestureRecognizer के साथ?
स्माइबॉर्ग

जवाबों:


22

मुझे जवाब मिल गया !! स्क्रीनशॉट लेने से स्क्रीन पर आने वाले किसी भी टच में रुकावट आती है। यही कारण है कि तस्वीर देखने के लिए स्नैपचैट को होल्ड करने की आवश्यकता होती है। संदर्भ: http://tumblr.jeremyjohnstone.com/post/38503925370/how-to-detect-screenshots-on-ios-like-snapchat


15
IOS 7 के साथ अब सच नहीं है । iOS7 + समाधान के लिए नीचे देखें ।
जो मासीलोटी

6
जो कहा वो सही है। प्रश्नकर्ता को इसे उचित उत्तर के रूप में अनचेक करना चाहिए।
बिस्कुट के भगवान

UIApplication User ने लिया स्क्रीनशॉट नोटिफिकेशन का उपयोग किया जा सकता है .. iOS 7+
अमित टंडेल

353

आईओएस 7 के रूप में अन्य जवाब अब सच नहीं हैं। Apple ने इसे बनाया है इसलिए touchesCancelled:withEvent:उपयोगकर्ता द्वारा स्क्रीनशॉट लेने पर इसे कॉल नहीं किया जाता है।

यह स्नैपचैट को प्रभावी रूप से पूरी तरह से तोड़ देगा, इसलिए एक नए समाधान में एक जोड़े को जोड़ा गया था। अब, समाधान के लिए एक पर्यवेक्षक को जोड़ने के लिए NSNotificationCenter का उपयोग कर के रूप में सरल रूप में है UIApplicationUserDidTakeScreenshotNotification

यहाँ एक उदाहरण है:

उद्देश्य सी

NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationUserDidTakeScreenshotNotification
                                                  object:nil
                                                   queue:mainQueue
                                              usingBlock:^(NSNotification *note) {
                                                 // executes after screenshot
                                              }];

तीव्र

NotificationCenter.default.addObserver(
    forName: UIApplication.userDidTakeScreenshotNotification,
    object: nil,
    queue: .main) { notification in
        //executes after screenshot
}

3
इसका उपयोग करना और touchesCancelled:withEvent:आपको iOS के सभी (हाल के) संस्करणों पर स्क्रीनशॉट का पता लगाने की अनुमति देनी चाहिए।
जोशुआ ग्रॉस

46
यह स्क्रीनशॉट लेने से रोकने के लिए काम नहीं करता है। यह केवल ऐप को यह बता सकता है कि एक को लिया गया था .. UIApplication Class Reference से: UIApplicationUserDidTakeScreenshotNotification पोस्ट किया गया जब उपयोगकर्ता स्क्रीनशॉट लेने के लिए होम और लॉक बटन दबाता है। इस सूचना में userInfo शब्दकोश नहीं है। इस अधिसूचना को AF AF के बाद स्क्रीनशॉट लिया जाता है।
बैडविसेल

6
@ सबदवाला सही। इस अधिसूचना को ध्यान में रखते हुए पारंपरिक कोको नामकरण सम्मेलनों के बाद, "डिड" शब्द का अर्थ है कि यह तथ्य के बाद पोस्ट किया गया है। इस मामले में कोई "विल" समकक्ष नहीं है, और AFAIK को सार्वजनिक एपीआई का उपयोग करके स्क्रीनशॉट लेने से उपयोगकर्ता को रोकने का कोई तरीका नहीं है।
मिक मैकलम

1
ध्यान दें कि मैंने आपको +1 दिया। मैंने ओपी प्रश्न को मूल रूप से गलत समझा था और सोचा था कि सवाल यह है कि किसी चीज़ को रोकने के लिए इसका पता कैसे लगाया जाए - क्योंकि मैं यही देख रहा था। इसलिए मैंने सिर्फ टिप्पणी में स्पष्टीकरण जोड़ा क्योंकि मुझे उम्मीद है कि इस सवाल पर आने वाले बहुत से लोग उस उत्तर की तलाश में हैं। मैंने यह मान लिया कि शब्द "किया" से है, लेकिन प्रलेखन इसे और भी स्पष्ट करता है। अपने ऐप में मैं लोगों को फ़ोटो संपादित करने की अनुमति दे रहा हूं, लेकिन कुछ टूल के लिए IAPs की आवश्यकता होती है। लेकिन मैंने उन्हें खरीदने से पहले प्रयास करने दिया। इसलिए मैं वॉटरमार्क जोड़ने के लिए पकड़ने से पहले पता लगाना चाहता था। नहीं किया जा सकता।
बैडविसेल

1
@MickMacCallum कोई विशेष कारण जो आप इसे मुख्य कतार में कर रहे हैं?
Kidsid49

13

बंद करने के साथ स्विफ्ट में कैसे करना है:

func detectScreenShot(action: () -> ()) {
    let mainQueue = NSOperationQueue.mainQueue()
    NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationUserDidTakeScreenshotNotification, object: nil, queue: mainQueue) { notification in
        // executes after screenshot
        action()
    }
}

detectScreenShot { () -> () in
    print("User took a screen shot")
}

स्विफ्ट 4.2

func detectScreenShot(action: @escaping () -> ()) {
    let mainQueue = OperationQueue.main
    NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: mainQueue) { notification in
        // executes after screenshot
        action()
    }
}

इसे एक मानक फ़ंक्शन के रूप में शामिल किया गया है:

https://github.com/goktugyil/EZSwiftExtensions

डिस्क्लेमर: इट्स माय रेपो


अरे, मैंने यह कोशिश की और इसने बहुत अच्छा काम किया, लेकिन क्या आप बता सकते हैं कि कोड में क्या हो रहा है? मैं स्विफ्ट के लिए नया हूं और इसे पढ़ना थोड़ा कठिन है।
aecend

यह उन में से एक है, "अगर यह काम करता है तो इसके साथ गड़बड़ न करें" तरह के कोड। आपको यह सीखने की ज़रूरत नहीं है कि यह किस कारण से यहाँ उपयोग किए गए ढांचे बहुत दुर्लभ हैं।
23

लेकिन आपको चेकआउट करना चाहिए कि यदि आप उस भाग को नहीं जानते हैं तो काम कैसे बंद हो जाता है, इसका मूल रूप से जब आप स्क्रीन शॉट फंक का पता लगाते हैं, तो आप कभी भी
परांठे में डालते हैं

@Esqarrouth आप किसी विशेष कारण से इसे मुख्य कतार में कर रहे हैं?
Kidsid49

कॉपी पेस्ट का कारण
Esqarrouth

4

नवीनतम स्विफ्ट 3 :

func detectScreenShot(action: @escaping () -> ()) {
        let mainQueue = OperationQueue.main
        NotificationCenter.default.addObserver(forName: .UIApplicationUserDidTakeScreenshot, object: nil, queue: mainQueue) { notification in
            // executes after screenshot
            action()
        }
    }

में viewDidLoad , इस फ़ंक्शन को कॉल करें

detectScreenShot { () -> () in
 print("User took a screen shot")
}

तथापि,

NotificationCenter.default.addObserver(self, selector: #selector(test), name: .UIApplicationUserDidTakeScreenshot, object: nil)

    func test() {
    //do stuff here
    }

पूरी तरह से ठीक काम करता है। मैं मेनक्यू के किसी भी बिंदु को नहीं देखता ...


प्रश्न पूछ रहा है कि स्क्रीनशॉट लेने से पहले कैसे सूचित किया जाए । यह आपको बताए जाने के बाद लिया गया है।
रैडमडी

1
@rmaddy आपने कहाँ देखा कि यह प्रश्न पूछ रहा है कि पहले कैसे अधिसूचित किया जाए? मैंने केवल मेरे ऊपर दिए गए उत्तर में सुधार किया, सुनिश्चित नहीं कि आपकी टिप्पणी का इरादा है ..
मक्सिम नियाज़ेव

सवाल पूछता है: "यह पता लगाएं कि उपयोगकर्ता स्क्रीनशॉट ले रहा है" । यदि ओपी तथ्य के बाद जानना चाहता था, तो सवाल को पढ़ना चाहिए: "यह पता लगाएं कि उपयोगकर्ता ने स्क्रीनशॉट लिया है"
रैड्डी जूल

1

ऐसा लगता है कि उपयोगकर्ता ने टैप किया है या नहीं, इसका पता लगाने के लिए ऐसा करने का कोई सीधा तरीका नहीं है home + power button। के अनुसार इस , यह संभव डार्विन सूचना का उपयोग करके पहले था, लेकिन यह किसी भी अधिक काम नहीं करता। चूंकि स्नैपचैट पहले से ही ऐसा कर रहा है, मेरा अनुमान है कि वे यह पता लगाने के लिए आईफोन फोटो एल्बम की जांच कर रहे हैं कि क्या इस 10 सेकंड के बीच में एक नई तस्वीर जुड़ गई है, और किसी में वे प्रदर्शित वर्तमान छवि के साथ तुलना कर रहे हैं। इस तुलना के लिए कुछ इमेज प्रोसेसिंग की जा सकती है। बस एक विचार, शायद आप इसे काम करने के लिए इसका विस्तार करने की कोशिश कर सकते हैं। चेक अधिक जानकारी के लिए इस

संपादित करें:

ऐसा लगता है कि वे UITouch कैंसल इवेंट (स्क्रीन कैप्चर कैंसिल टच) का पता लगा रहे होंगे और इस ब्लॉग के अनुसार उपयोगकर्ता को यह त्रुटि संदेश दिखा सकते हैं: iOS पर स्क्रीनशॉट का पता कैसे लगाएं (जैसे SnapChat)

उस स्थिति में आप इसका – touchesCancelled:withEvent:पता लगाने के लिए यूआईटच रद्द करने की विधि का उपयोग कर सकते हैं । आप इस प्रतिनिधि पद्धति में छवि को हटा सकते हैं और उपयोगकर्ता को एक उपयुक्त चेतावनी दिखा सकते हैं।

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesCancelled:touches withEvent:event];

    NSLog(@"Touches cancelled");

    [self.imageView removeFromSuperView]; //and show an alert to the user
}

आप इस बारे में एक निश्चित उत्तर पाने के लिए सही स्थानों से अच्छी तरह से जुड़े हुए प्रतीत होते हैं;)
स्माइबॉर्ग

यह एक निश्चित उत्तर की तुलना में एक शिक्षित अनुमान से अधिक है। दुर्भाग्य से इसके लिए सटीक उत्तर प्राप्त करने के लिए मेरे पास कोई कनेक्शन नहीं है। यदि वे ऐसा करने के लिए किसी भी निजी एपीआई का उपयोग नहीं कर रहे हैं, तो मैं यही सोच सकता हूं। एल्बम के अलावा छवि का पता लगाने के लिए और कुछ एल्गोरिथ्म के आधार पर स्क्रीन में वर्तमान छवि के साथ उस छवि की तुलना करें।
iDev

लेकिन यह देखते हुए कि वे डिवाइस की तस्वीरों और कैमरा रोल तक पहुंच का अनुरोध किए बिना ऐसा कर सकते हैं ... यह कुछ और नहीं होना चाहिए? मेरा सिद्धांत इस तथ्य से संबंधित होगा कि वे इसे प्राप्त करने के लिए आपको प्राप्त फोटो संदेश पर लंबे समय तक प्रेस करते हैं, और जब आप Home + Lockबटन दबाते हैं, तो ओएस तुरंत कार्य करता है जैसे कि कोई उंगली स्क्रीन को छू नहीं रही है। शायद यह एक touchesEnded:withEvent(या समान कॉलबैक) के बिना होता है जैसा कि सामान्य रूप से होता है, इसलिए शायद वे घटनाओं के इस अनूठे पैटर्न की निगरानी कर सकते हैं? मैं पूरी तरह से गलत रास्ते पर हो सकता हूं, लेकिन इस बिंदु पर मेरा एकमात्र सिद्धांत है।
स्माइबॉर्ग

स्क्रीन पर एक उंगली रखो और इसे उठाने के बिना, कोशिश करें कि क्या आप अन्य दो बटन दबा सकते हैं। यह अभी भी उस संदेश को दिखा रहा था जो मुझे लगता है। तो हो सकता है कि वे कुछ निजी एपीआई का उपयोग कर रहे हों और किसी तरह ऐपस्टोर में डाल सकें।
डेव

2
IOS 7 जैसा अब संभव नहीं है
गॉड ऑफ बिस्कुट

1

स्विफ्ट 4+

NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: OperationQueue.main) { notification in
           //you can do anything you want here. 
        }

इस पर्यवेक्षक का उपयोग करके आप यह पता लगा सकते हैं कि उपयोगकर्ता कब स्क्रीनशॉट लेता है, लेकिन आप उसे रोक नहीं सकते।


0

स्विफ्ट 4 उदाहरण

उदाहरण # 1 क्लोजर का उपयोग करना

NotificationCenter.default.addObserver(forName: .UIApplicationUserDidTakeScreenshot, 
                                       object: nil, 
                                       queue: OperationQueue.main) { notification in
    print("\(notification) that a screenshot was taken!")
}

उदाहरण # 2 चयनकर्ता के साथ

NotificationCenter.default.addObserver(self, 
                                       selector: #selector(screenshotTaken), 
                                       name: .UIApplicationUserDidTakeScreenshot, 
                                       object: nil)

@objc func screenshotTaken() {
    print("Screenshot taken!")
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.