iOS Phát hiện ảnh chụp màn hình?


135

Ứng dụng Snapchat , trên App Store, là một ứng dụng cho phép bạn chia sẻ hình ảnh với khả năng tự hủy trên chúng. Bạn chỉ có thể xem các bức ảnh trong X giây. Nếu bạn cố chụp ảnh màn hình trong khi ảnh đang hiển thị bằng cách sử dụng tổ hợp phím nguồn, nó sẽ báo cho người gửi mà bạn đã cố chụp ảnh màn hình.

Phần nào của SDK cho phép bạn phát hiện người dùng đang chụp ảnh màn hình? Tôi không biết điều này là có thể.


1
stackoverflow.com/questions/2121970/ Mạnh, Có vẻ như nó được sử dụng để gọi -applicationDid EntryBackground: trước khi chụp ảnh màn hình trước đó. Không chắc chắn về điều đó bây giờ.
iDev

Các bạn. Các chủ đề khác có câu trả lời: stackoverflow.com/questions/2121970/ từ
me2

1
kiểm tra điều này là tốt, stackoverflow.com/a/8711894/1730272 , nó nói rằng nó không thể được nữa. Có lẽ bạn có thể thử nó và cho chúng tôi biết.
iDev

Chưa thấy điều này được đề cập ở bất cứ đâu trên Internet, nhưng tôi sẽ cho rằng nếu bạn sử dụng Xcode để chụp ảnh màn hình (từ thiết bị trong cửa sổ Sắp xếp), hoàn toàn không có cách nào để ứng dụng có thể biết. Nó phải được theo dõi Camera Roll cho bất kỳ ảnh nào được thêm trong khi xem ảnh Snapchat đã nhận và chụp ảnh màn hình qua Xcode bỏ qua hoàn toàn điều này (mà không cần phải bẻ khóa).
smileyborg

Theo dõi: Đã kiểm tra lý thuyết này và xác nhận rằng ứng dụng không phát hiện ảnh chụp màn hình Xcode. Tuy nhiên, tôi nhận ra điều thú vị là trên iOS 6, các ứng dụng rõ ràng phải được cấp quyền truy cập ảnh ... tuy nhiên ứng dụng này vẫn phát hiện ảnh chụp màn hình mà không cho phép nó truy cập ảnh! Nó phải được sử dụng một phương pháp khác để phát hiện - Tôi nhận thấy rằng khi sử dụng phương pháp nút Home + Ngủ, ảnh cũng bị xóa khỏi màn hình. Vì vậy, phải có một số mẫu liên quan đến quá trình chụp màn hình này, ứng dụng có thể theo dõi một cách đáng tin cậy, có lẽ với GestureRecognizer?
smileyborg

Câu trả lời:


22

Tôi tìm thấy câu trả lời !! Chụp ảnh màn hình làm gián đoạn bất kỳ chạm nào trên màn hình. Đây là lý do tại sao snapchat yêu cầu giữ để xem hình ảnh. Tham khảo: http://tumblr.jeremyjohnstone.com/post/38503925370/how-to-detect-sc Greensshots-on-ios-like-snapchat


15
Không còn đúng với iOS 7. Xem bên dưới để biết giải pháp iOS7 +.
Joe Masilotti

6
Những gì Joe nói là chính xác. Asker nên bỏ chọn đây là câu trả lời thích hợp.
Thần bánh quy

Người dùng UIApplication Đã chụp ảnh Thông báo có thể được sử dụng .. iOS 7+
Amit Tandel 20/03/2017

353

Kể từ iOS 7, các câu trả lời khác không còn đúng nữa. Apple đã làm cho nó touchesCancelled:withEvent:không còn được gọi khi người dùng chụp ảnh màn hình.

Điều này sẽ có hiệu quả phá vỡ hoàn toàn Snapchat, vì vậy một vài betas trong một giải pháp mới đã được thêm vào. Bây giờ, giải pháp đơn giản như sử dụng NSNotificationCenter để thêm người quan sát vào UIApplicationUserDidTakeSc MuffNotification .

Đây là một ví dụ:

Mục tiêu C

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

Nhanh

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

3
Sử dụng điều này và touchesCancelled:withEvent:sẽ cho phép bạn phát hiện ảnh chụp màn hình trên tất cả các phiên bản (gần đây) của iOS.
Joshua Gross

46
Điều này không hoạt động để ngăn chặn một ảnh chụp màn hình. Nó chỉ có thể cho ứng dụng biết rằng một ứng dụng đã được chụp .. Từ Tài liệu tham khảo Lớp UIApplication: UIApplicationUserDidTakeSc MuffNotification Đăng khi người dùng nhấn nút Home và Lock để chụp ảnh màn hình. Thông báo này không chứa từ điển userInfo. Thông báo này được đăng SAU ảnh chụp màn hình được chụp.
badweasel

6
@badweasel Đúng. Xem xét thông báo này tuân theo các quy ước đặt tên ca cao thông thường, từ "Đã" ngụ ý rằng nó được đăng sau khi thực tế. Không có "Will" tương đương trong trường hợp này và AFAIK không có cách nào để ngăn người dùng chụp ảnh màn hình bằng API công khai.
Mick MacCallum

1
Lưu ý rằng tôi đã cho bạn +1. Tôi đã đọc sai câu hỏi OP ban đầu và nghĩ rằng câu hỏi là làm thế nào để phát hiện ra nó để ngăn chặn điều gì đó - bởi vì đó là điều tôi đang tìm kiếm. Vì vậy, tôi chỉ thêm vào phần làm rõ trong bình luận vì tôi hy vọng rất nhiều người đến với câu hỏi này đang tìm kiếm câu trả lời đó. Tôi giả định rằng cũng từ từ "đã làm" nhưng tài liệu làm cho nó thậm chí còn rõ ràng hơn. Trong ứng dụng của mình, tôi cho phép mọi người chỉnh sửa ảnh nhưng một số công cụ yêu cầu IAP. Nhưng tôi để họ thử trước khi mua. Vì vậy, tôi muốn phát hiện trước khi nó được chụp để thêm hình mờ. Không thể được thực hiện.
badweasel

1
@MickMacCallum Bất kỳ lý do cụ thể nào bạn đang thực hiện trên hàng đợi chính?
Kidsid49

13

Đây là cách làm trong Swift với đóng cửa:

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")
}

Swift 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()
    }
}

Điều này được bao gồm như là một chức năng tiêu chuẩn trong:

https://github.com/goktugyil/EZSwiftExtensions

Disclaimer: Đó là repo của tôi


Này, tôi đã thử cái này và nó hoạt động rất tốt, nhưng bạn có thể giải thích những gì đang diễn ra trong mã không? Tôi mới biết về Swift và hơi khó đọc.
aecend

Đây là một trong những loại mã "nếu nó hoạt động không gây rối với nó". Bạn không cần phải tìm hiểu điều này gây ra các khung được sử dụng ở đây là rất hiếm.
Esqarrouth

Nhưng bạn nên kiểm tra xem các bao đóng hoạt động như thế nào nếu bạn không biết phần đó, về cơ bản là khi bạn gọi phát hiện màn hình func, những gì bạn đặt trong parantheses được gửi dưới dạng một chức năng hành động
Esqarrouth 24/2/2016

@Esqarrouth Bất kỳ lý do cụ thể bạn đang làm điều đó trên hàng đợi chính?
Kidsid49

Nguyên nhân của bản sao dán
Esqarrouth

4

SWift 3 mới nhất :

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

Trong viewDidLoad , hãy gọi chức năng này

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

Tuy nhiên,

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

    func test() {
    //do stuff here
    }

hoạt động hoàn toàn tốt Tôi không thấy bất kỳ điểm nào của mainQueue ...


Câu hỏi là hỏi làm thế nào để được thông báo trước khi chụp ảnh màn hình. Điều này cho bạn biết sau khi đã được thực hiện.
rmaddy

1
@rmaddy bạn đã thấy câu hỏi đó ở đâu khi được hỏi làm thế nào để được thông báo trước? Tôi chỉ cải thiện câu trả lời ở trên tôi, không chắc ý định bình luận của bạn ..
Maksim Kniazev

Câu hỏi đặt ra: "phát hiện người dùng đang chụp ảnh màn hình" . Nếu OP muốn biết sau thực tế, câu hỏi nên đọc: "phát hiện người dùng đã chụp ảnh màn hình" .
rmaddy

1

Có vẻ như không có cách nào trực tiếp để làm điều này để phát hiện nếu người dùng đã gõ vào home + power button. Theo điều này , có thể sớm hơn bằng cách sử dụng thông báo darwin, nhưng nó không hoạt động nữa. Vì snapchat đã làm điều đó, tôi đoán là họ đang kiểm tra album ảnh iPhone để phát hiện xem có hình ảnh mới nào được thêm vào trong khoảng 10 giây này hay không, và trong một ngày nào đó, chúng đang so sánh với hình ảnh hiện tại được hiển thị. Có thể một số xử lý hình ảnh được thực hiện cho so sánh này. Chỉ cần một suy nghĩ, có lẽ bạn có thể cố gắng mở rộng điều này để làm cho nó hoạt động. Kiểm tra điều này để biết thêm chi tiết .

Biên tập:

Có vẻ như họ có thể đang phát hiện sự kiện hủy UITouch (Chụp màn hình hủy bỏ chạm) và hiển thị thông báo lỗi này cho người dùng theo blog này: Cách phát hiện ảnh chụp màn hình trên iOS (như SnapChat)

Trong trường hợp đó, bạn có thể sử dụng – touchesCancelled:withEvent:phương pháp để cảm nhận việc hủy UITouch để phát hiện điều này. Bạn có thể xóa hình ảnh trong phương thức ủy nhiệm này và hiển thị cảnh báo thích hợp cho người dùng.

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

bạn dường như được kết nối tốt ở đúng nơi để có câu trả lời dứt khoát về vấn đề này;)
smileyborg

Đó là một phỏng đoán có giáo dục hơn là một câu trả lời dứt khoát. Thật không may, tôi không có bất kỳ kết nối nào để có câu trả lời chính xác cho việc này. Nếu họ không sử dụng bất kỳ API riêng tư nào, đó là cách duy nhất tôi có thể nghĩ ra, để làm điều này. Để phát hiện thêm hình ảnh vào album và so sánh hình ảnh đó với hình ảnh hiện tại trên màn hình dựa trên một số thuật toán.
iDev

Nhưng cho rằng họ có thể làm điều này mà không yêu cầu quyền truy cập vào ảnh và Camera Roll của thiết bị ... đó có phải là điều gì khác không? Giả thuyết của tôi sẽ liên quan đến thực tế họ khiến bạn nhấn vào tin nhắn ảnh đã nhận để xem nó và khi bạn nhấn Home + Locknút, hệ điều hành ngay lập tức hoạt động như thể không có ngón tay nào chạm vào màn hình. Có lẽ điều này xảy ra mà không có touchesEnded:withEvent(hoặc gọi lại tương tự) như bình thường, vì vậy có lẽ họ có thể theo dõi mô hình sự kiện độc đáo này? Tôi có thể hoàn toàn đi sai hướng, nhưng đó là lý thuyết duy nhất của tôi vào thời điểm này.
smileyborg

Đặt một ngón tay trên màn hình và không nhấc nó lên, hãy thử nếu bạn có thể nhấn hai nút khác. Tôi vẫn đang hiển thị tin nhắn đó. Vì vậy, có thể họ đang sử dụng một số API riêng tư và bằng cách nào đó được quản lý để đưa vào kho ứng dụng.
iDev

2
Không còn có thể kể từ iOS 7.
God of Biscuits

1

Swift 4+

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

bằng cách sử dụng trình quan sát này, bạn có thể tìm ra khi người dùng chụp ảnh màn hình, nhưng bạn không thể ngăn anh ta.


0

Swift 4 ví dụ

Ví dụ # 1 sử dụng bao đóng

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

Ví dụ # 2 với bộ chọn

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

@objc func screenshotTaken() {
    print("Screenshot taken!")
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.