স্ক্রিনশট আইওএস সনাক্তকরণ?


135

অ্যাপ স্টোরের স্ন্যাপচ্যাট অ্যাপ্লিকেশনটি এমন একটি অ্যাপ্লিকেশন যা আপনাকে সেগুলিতে একটি স্ব-ধ্বংসের সাথে ছবিগুলি ভাগ করতে দেয়। আপনি কেবল এক্স সেকেন্ডের জন্য ছবিগুলি দেখতে পারেন। হোম-পাওয়ার কী কম্বো ব্যবহার করে ছবিটি দেখানোর সময় আপনি যদি কোনও স্ক্রিনশট নেওয়ার চেষ্টা করে থাকেন, এটি প্রেরককে আপনি স্ক্রিনশট নেওয়ার চেষ্টা করেছেন বলে জানাবে।

এসডিকে কোন অংশ আপনাকে সনাক্ত করতে দেয় যে ব্যবহারকারী কোনও স্ক্রিনশট নিচ্ছে? আমি জানতাম না এটি সম্ভব ছিল।


1
stackoverflow.com/questions/2121970/… , দেখে মনে হচ্ছে এটি আগে-স্ক্রিনশট নেওয়ার আগে-অ্যাপ্লিকেশনডিডএন্টারব্যাকগ্রাউন্ড কল করত। এখন সম্পর্কে নিশ্চিত না।
আইডিএভ

ছেলেরা। : অন্যান্য থ্রেড উত্তর আছে stackoverflow.com/questions/2121970/...
me2

1
এটিও পরীক্ষা করে দেখুন, stackoverflow.com/a/8711894/1730272 , এটি বলেছে যে এটি আর সম্ভব নয়। সম্ভবত আপনি এটি চেষ্টা করে দেখতে পারেন এবং আমাদের জানান।
আইডিএভ

এটি ইন্টারনেটে এখনও কোথাও উল্লেখ করা হয়নি, তবে আমি ধরে নেব যে আপনি যদি স্ক্রিনশট নিতে (অরগানাইজার উইন্ডোতে থাকা ডিভাইস থেকে) Xcode ব্যবহার করেন তবে অ্যাপটি জানতে সক্ষম হওয়ার কোনও উপায় নেই। এটি অবশ্যই প্রাপ্ত কোনও স্ন্যাপচ্যাট ফটো দেখার সময় যুক্ত হওয়া কোনও ফটোগুলির জন্য ক্যামেরা রোলটি পর্যবেক্ষণ করবে এবং এক্সকোডের মাধ্যমে স্ক্রিনশটটি পুরোপুরি বাইপাস করে (জেলব্রেকিংয়ের প্রয়োজন ছাড়াই)।
স্মাইলিবার্গ

ফলোআপ: এই তত্ত্বটি পরীক্ষা করে প্রমাণিত হয়েছে যে অ্যাপটি Xcode স্ক্রিনশটগুলি সনাক্ত করে না। তবে, আমি বুঝতে পেরেছি আকর্ষণীয়টি হ'ল আইওএস 6 এ অ্যাপ্লিকেশনগুলিকে অবশ্যই ফটোগুলি অ্যাক্সেসের অনুমতি দিতে হবে ... তবুও এই অ্যাপ্লিকেশনটিকে ফটোগুলি অ্যাক্সেসের অনুমতি না দিয়ে স্ক্রিনশটগুলি সনাক্ত করে! এটি অবশ্যই সনাক্তকরণের জন্য অন্য একটি পদ্ধতি ব্যবহার করা উচিত - আমি লক্ষ্য করছি যে হোম + স্লিপ বোতামের পদ্ধতিটি ব্যবহার করার সময়, সক্রিয় ফটোটিও পর্দা থেকে সরিয়ে ফেলা হয়েছে। সুতরাং এই স্ক্রিনশট প্রক্রিয়া সম্পর্কিত কিছু প্যাটার্ন থাকতে হবে অ্যাপটি নির্ভরযোগ্যভাবে নিরীক্ষণ করতে পারে, সম্ভবত কোনও অঙ্গভঙ্গি সনাক্তকারী সহ?
স্মাইলিবার্গ

উত্তর:


22

আমি উত্তর খুঁজে পেলাম !! স্ক্রিনশট নেওয়া স্ক্রিনের যে কোনও ছোঁয়া বাধা দেয়। এই কারণেই ছবিটি দেখার জন্য স্ন্যাপচ্যাটকে ধরে রাখা দরকার। তথ্যসূত্র: http://tumblr.jeremyjohnstone.com/post/38503925370/how-to-detect-screen Photos-on-ios- Like- snapchat


15
আইওএসের সাথে আর সত্য নয় an একটি iOS7 + সমাধানের জন্য নীচে দেখুন ।
জো মাসিলোটি

6
জো যা বলেছেন তা সঠিক is প্রশ্নকারীর যথাযথ উত্তর হিসাবে এটি নির্বাচন করা উচিত।
বিস্কুট God

ইউআইএআইপ্লিকেশন ব্যবহারকারী স্ক্রিনশট নোটিফিকেশন নিলেন ব্যবহার করতে পারবেন .. আইওএস 7+
অমিত ট্যান্ডেল

353

আইওএস 7 হিসাবে অন্যান্য উত্তরগুলি আর সত্য নয়। অ্যাপল এটি তৈরি করেছে তাই touchesCancelled:withEvent:যখন ব্যবহারকারী স্ক্রিনশট নেয় তখন আর বলা হয় না।

এটি স্ন্যাপচ্যাট কার্যকরভাবে পুরোপুরি ভেঙে দেবে, সুতরাং একটি নতুন সমাধানে একটি দম্পতি বিটা যুক্ত হয়েছিল। এখন, সমাধানটি ইউআইএপ্লিকেশন ইউজারডিডটেকস্ক্রিনশোটনোটিকেশনে একটি পর্যবেক্ষক যুক্ত করতে NSNotificationsCenter ব্যবহার করার মতোই সহজ ।

এখানে একটি উদাহরণ:

উদ্দেশ্য গ

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:আপনাকে আইওএসের সমস্ত (সাম্প্রতিক) সংস্করণে একটি স্ক্রিনশট সনাক্ত করার অনুমতি দেওয়া উচিত।
জোশুয়া গ্রস

46
এটি কোনও স্ক্রিনশট নেওয়া থেকে আটকাতে কাজ করে না। এটি কেবলমাত্র অ্যাপটিকে জানায় যে এটি নেওয়া হয়েছিল .. ইউআইএপ্লিকেশন ক্লাসের রেফারেন্স থেকে: ইউআইএপ্লিকেশন ইউজারডিডটেকস্ক্রিনশট নোটিকেশন পোস্ট করা হয়েছে যখন ব্যবহারকারী কোনও স্ক্রিনশট নেওয়ার জন্য হোম এবং লক বোতাম টিপেন। এই বিজ্ঞপ্তিতে কোনও ব্যবহারকারীআইফোন অভিধান নেই। স্ক্রিনশটটি নেওয়া হওয়ার পরে এই বিজ্ঞপ্তি পোস্ট করা হয়।
Badweasel

6
পুনঃটুইট এই বিজ্ঞপ্তিটি বিবেচনা করে প্রচলিত কোকো নামকরণের সম্মেলন অনুসরণ করে, "ডিড" শব্দটি বোঝায় যে এটি সত্যের পরে পোস্ট করা হয়েছিল। এক্ষেত্রে কোনও "উইল" সমতুল্য নেই, এবং এএফআইএইকে পাবলিক এপিআই ব্যবহার করে স্ক্রিনশট নেওয়া থেকে বাধা দেওয়ার কোনও উপায় নেই।
মিক ম্যাককালাম

1
মনে রাখবেন যে আমি আপনাকে একটি +1 দিয়েছি। আমি ওপি প্রশ্নটি মূলত ভুলভাবে পড়েছি এবং ভেবেছিলাম যে প্রশ্নটি কোনও কিছু রোধ করার জন্য এটি কীভাবে সনাক্ত করা যায় - কারণ এটিই আমি খুঁজছিলাম। সুতরাং আমি কেবল মন্তব্যে স্পষ্টতা যোগ করেছি কারণ আমি আশা করি যে এই প্রশ্নে আসা অনেক লোক সেই উত্তর খুঁজছেন। আমি ধরে নিয়েছি যে "ডুড" শব্দটি থেকে তবে ডকুমেন্টেশনটি আরও স্পষ্ট করে তোলে। আমার অ্যাপে আমি লোককে ফটো সম্পাদনা করতে দিচ্ছি তবে কয়েকটি সরঞ্জামের জন্য আইএপি প্রয়োজন হয় s তবে আমি তাদের কেনার আগে চেষ্টা করতে দিয়েছি। তাই আমি ওয়াটারমার্ক যুক্ত করার জন্য এটি ক্যাপচার হওয়ার আগে সনাক্ত করতে চেয়েছিলাম। করা যায় না।
Badweasel

1
@ মিকম্যাককালাম কোনও নির্দিষ্ট কারণ আপনি এটি মূল কাতারে করছেন?
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

দাবি অস্বীকার: এটি আমার রেপো


আরে, আমি এটি চেষ্টা করেছি এবং এটি দুর্দান্ত কাজ করেছে, তবে আপনি কোডটিতে কী চলছে তা ব্যাখ্যা করতে পারেন? আমি সুইফটে নতুন এবং এটি পড়া কিছুটা শক্ত।
23'50

এটি এইগুলির মধ্যে একটি, "যদি এটি কাজ করে তবে এটির সাথে বিঘ্নিত হবে না" ধরনের ধরণের কোড। এখানে কী ব্যবহৃত ফ্রেমওয়ার্কগুলি খুব বিরল তা আপনাকে কী তা শিখতে হবে না।
এসকারুথ

তবে আপনি যদি সেই অংশটি জানেন না তবে ক্লোজারগুলি কীভাবে কাজ করবে তা আপনার চেকআউট করা উচিত, এটির মূলত যখন আপনি স্ক্রিন শট ফানকে ফোন করেন, আপনি যা
প্যারান্থিসে রেখেছিলেন তা

@ এসকারুথ কোনও নির্দিষ্ট কারণ আপনি এটি মূল কাতারে করছেন?
Kidsid49

অনুলিপি পেস্ট করার কারণ
এসকরার্থ

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
    }

সম্পূর্ণ সূক্ষ্ম কাজ করে। আমি মূল কিউয়ের কোনও পয়েন্ট দেখতে পাচ্ছি না ...


স্ক্রিনশট নেওয়ার আগে কীভাবে বিজ্ঞপ্তি দেওয়া হবে তা প্রশ্ন জিজ্ঞাসা করছে । নেওয়া হওয়ার পরে এটি আপনাকে জানায় ।
rmaddy

1
@ আরমডি আপনি কোথায় দেখেছেন যে প্রশ্নটি জিজ্ঞাসা করছে যে আগে কীভাবে জানানো হবে? আমি কেবল আমার উপরে উত্তরটি উন্নত করেছি, আপনার মন্তব্যের উদ্দেশ্য সম্পর্কে নিশ্চিত নন ..
মাকসিম নিয়াজেভ

প্রশ্নটি জিজ্ঞাসা করে: "সনাক্ত করুন যে ব্যবহারকারী কোনও স্ক্রিনশট নিচ্ছেন" । যদি ওপি সত্যের পরে জানতে চায়, তবে প্রশ্নটি পড়তে হবে: "সনাক্ত করুন যে ব্যবহারকারী কোনও স্ক্রিনশট নিয়েছিলেন"
rmaddy

1

দেখে মনে হচ্ছে যে ব্যবহারকারী অনুলিপি করেছেন কিনা তা সনাক্ত করার জন্য এটি করার সরাসরি কোনও উপায় নেই home + power button। অনুযায়ী এই , এটা সম্ভব ডারউইন প্রজ্ঞাপন ব্যবহার করে এর আগে ছিল, কিন্তু এটা কোন কাজ করে না। যেহেতু স্ন্যাপচ্যাট ইতিমধ্যে এটি করছে, আমার ধারণা হ'ল তারা এই 10 সেকেন্ডের মধ্যে কোনও নতুন ছবি যুক্ত হয়েছে কিনা তা সনাক্ত করতে তারা আইফোন ফটো অ্যালবামটি পরীক্ষা করে দেখছেন এবং কোনওভাবে তারা প্রদর্শিত চিত্রের সাথে তুলনা করছেন। এই তুলনা করার জন্য কিছু চিত্র প্রক্রিয়াজাতকরণ হতে পারে। কেবল একটি চিন্তাভাবনা, সম্ভবত আপনি এটিকে কাজ করার জন্য এটি প্রসারিত করার চেষ্টা করতে পারেন। আরও বিশদ জন্য এই পরীক্ষা করুন

সম্পাদনা:

দেখে মনে হচ্ছে তারা ইউআইটিউচ বাতিল ইভেন্টটি সনাক্ত করছে (স্ক্রিন ক্যাপচার স্পর্শ বাতিল করে) এবং এই ব্লগ অনুসারে ব্যবহারকারীকে এই ত্রুটি বার্তা দেখাচ্ছে: আইওএস-এ স্ক্রিনশটগুলি কীভাবে সনাক্ত করতে হবে (স্ন্যাপচ্যাটের মতো)

– 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
}

আপনি এই সম্পর্কে একটি সঠিক উত্তর পেতে সঠিক জায়গায় ভাল সংযুক্ত বলে মনে হয়;)
হাসিবাবার্গ

এটি একটি সুস্পষ্ট উত্তরের চেয়ে শিক্ষিত অনুমান বেশি। দুর্ভাগ্যক্রমে এর সঠিক উত্তর পেতে আমার কোনও সংযোগ নেই। যদি তারা কোনও প্রাইভেট এপিআই ব্যবহার না করে থাকে তবে এটি করার জন্য আমি কেবল এটিই ভাবতে পারি। চিত্রটি অ্যালবামের সাথে যুক্ত সনাক্ত করতে এবং কিছু আলগোরিদিমের উপর ভিত্তি করে স্ক্রিনের বর্তমান চিত্রের সাথে সেই চিত্রটি তুলনা করুন।
আইডিএভ

কিন্তু প্রদত্ত যে তারা ডিভাইসের ফটোগুলি এবং ক্যামেরা রোল অ্যাক্সেসের অনুরোধ ছাড়াই এটি করতে পারে ... এটি অন্য কিছু হতে হবে? আমার তত্ত্বটি সত্যিকারের সাথে সম্পর্কিত হবে যে তারা আপনাকে দেখার জন্য প্রাপ্ত ফটো বার্তায় দীর্ঘক্ষণ চাপ দেয় এবং আপনি যখন Home + Lockবোতামগুলি টিপেন তখন ওএস ততক্ষণে কাজ করে যদিও কোনও আঙুল স্ক্রিনটিকে স্পর্শ করছে না। touchesEnded:withEventসাধারণত এটি (বা অনুরূপ কলব্যাক) ব্যতীত ঘটে যা এটি সাধারণত ঘটে থাকে , তাই তারা ঘটনার এই অনন্য প্যাটার্নটির জন্য নিরীক্ষণ করতে পারে? আমি পুরোপুরি ভুল ট্র্যাকের দিকে থাকতে পারি তবে এটাই আমার একমাত্র তত্ত্ব।
স্মাইলিবার্গ

স্ক্রিনে এবং এটিকে উপরে না রেখে একটি আঙুল রাখুন, যদি আপনি অন্য দুটি বোতাম টিপতে পারেন তবে চেষ্টা করুন। এটি এখনও আমার মনে হয় সেই বার্তাটি প্রদর্শন করে। সুতরাং তারা কিছু ব্যক্তিগত এপিআই ব্যবহার করছে এবং কোনওভাবে অ্যাপস্টোরে রাখার ব্যবস্থা করেছে be
আইডিএভ

2
আইওএস হিসাবে আর সম্ভব নয়
বিস্কুটদের Godশ্বর

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!")
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.