App Store 의 앱 Snapchat 은 사진을 자기와 함께 공유 할 수있는 앱입니다. X 초 동안 만 사진을 볼 수 있습니다. 홈 전원 키 콤보를 사용하여 사진이 표시되는 동안 스크린 샷을 찍으려고하면 보낸 사람에게 스크린 샷을 찍으라고 알려줍니다.
SDK의 어떤 부분에서 사용자가 스크린 샷을 찍고 있는지 감지 할 수 있습니까? 나는 이것이 가능하다는 것을 몰랐다.
App Store 의 앱 Snapchat 은 사진을 자기와 함께 공유 할 수있는 앱입니다. X 초 동안 만 사진을 볼 수 있습니다. 홈 전원 키 콤보를 사용하여 사진이 표시되는 동안 스크린 샷을 찍으려고하면 보낸 사람에게 스크린 샷을 찍으라고 알려줍니다.
SDK의 어떤 부분에서 사용자가 스크린 샷을 찍고 있는지 감지 할 수 있습니까? 나는 이것이 가능하다는 것을 몰랐다.
답변:
나는 답을 찾았다 !! 스크린 샷을 찍으면 화면에있는 모든 터치가 중단됩니다. 이것이 바로 스냅 챗이 사진을보기 위해 들고 있어야하는 이유입니다. 참조 : http://tumblr.jeremyjohnstone.com/post/38503925370/how-to-detect-screenshots-on-ios-like-snapchat
iOS 7부터 다른 답변은 더 이상 사실이 아닙니다. Apple은 touchesCancelled:withEvent:
사용자가 스크린 샷을 찍을 때 더 이상 호출되지 않도록 했습니다 .
이로 인해 Snapchat이 완전히 중단 될 수 있으므로 새로운 솔루션의 베타 버전이 추가되었습니다. 이제 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
}
touchesCancelled:withEvent:
iOS의 모든 (최근) 버전에서 스크린 샷을 감지 할 수 있어야합니다.
클로저로 Swift에서 수행하는 방법은 다음과 같습니다.
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
면책 조항 : 내 레포
최근 SWIFT 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
}
완전히 잘 작동합니다. mainQueue의 포인트가 보이지 않습니다 ...
사용자가 도청했는지 여부를 감지하는 직접적인 방법이없는 것 같습니다 home + power button
. 당 이 , 그것은 다윈 알림을 사용하여 이전에 가능했다, 그러나 그것은 더 이상 작동하지 않습니다. snapchat은 이미 그것을하고 있기 때문에 10 초 사이에 새로운 사진이 추가되었는지 감지하기 위해 iPhone 사진 앨범을 확인하고 어쨌든 현재 표시된 이미지와 비교하고 있습니다. 이 비교를 위해 일부 이미지 처리가 수행 될 수 있습니다. 그냥 생각, 아마 당신은 그것을 작동하게 확장 할 수 있습니다. 자세한 내용은 이것을 확인 하십시오 .
편집하다:
UITouch 취소 이벤트를 감지하고 (스크린 캡처가 터치를 취소 함)이 블로그에 따라이 오류 메시지를 사용자에게 표시하는 것 같습니다. 를 감지 iOS에서 스크린 샷을 감지하는 방법 (예 : SnapChat)
이 경우 – touchesCancelled:withEvent:
UITouch 취소를 감지하여이를 감지하는 방법을 사용할 수 있습니다 . 이 위임 방법에서 이미지를 제거하고 사용자에게 적절한 경고를 표시 할 수 있습니다.
- (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
버튼 을 누를 때 화면에 손가락이 닿지 않는 것처럼 OS가 즉시 작동 한다는 사실과 관련 이 있습니다. 어쩌면 이것은 touchesEnded:withEvent
평소와 같이 (또는 비슷한 콜백) 없이 발생할 수 있으므로이 독특한 패턴의 이벤트를 모니터링 할 수 있습니까? 나는 완전히 틀린 길을 가고 있을지도 모르지만, 지금은 이것이 나의 유일한 이론이다.
스위프트 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!")
}