ios - como hacer captura de pantalla en iphone 5
¿Detección de iOS de una captura de pantalla? (5)
Último 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()
}
}
En viewDidLoad , llama a esta función
detectScreenShot { () -> () in
print("User took a screen shot")
}
Sin embargo,
NotificationCenter.default.addObserver(self, selector: #selector(test), name: .UIApplicationUserDidTakeScreenshot, object: nil)
func test() {
//do stuff here
}
funciona totalmente bien. No veo ningún punto de mainQueue ...
La aplicación Snapchat , en la App Store, es una aplicación que te permite compartir fotos con autodestrucción. Solo puedes ver las fotos por X segundos. Si intenta tomar una captura de pantalla mientras se muestra la imagen con el combo de la tecla de encendido, le indicará al remitente que intentó tomar una captura de pantalla.
¿Qué parte del SDK le permite detectar que el usuario está tomando una captura de pantalla? No sabía que esto fuera posible.
¡Encontré la respuesta! Tomar una captura de pantalla interrumpe cualquier toque que esté en la pantalla. Esta es la razón por la cual Snapchat requiere sostenerse para ver la imagen. Referencia: http://tumblr.jeremyjohnstone.com/post/38503925370/how-to-detect-screenshots-on-ios-like-snapchat
Heres cómo hacerlo en Swift con cierres:
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")
}
Esto se incluye como una función estándar en:
https://github.com/goktugyil/EZSwiftExtensions
Descargo de responsabilidad: es mi repo
Parece que no hay una forma directa de hacerlo para detectar si el usuario ha tocado el home + power button
.Según this , fue posible antes al usar la notificación de darwin, pero ya no funciona. Como Snapchat ya lo está haciendo, creo que están revisando el álbum de fotos de iPhone para detectar si se agregó una nueva imagen entre estos 10 segundos, y de alguna manera están comparando con la imagen actual que se muestra. Puede haber algún procesamiento de imagen para esta comparación. Solo un pensamiento, probablemente puedas intentar expandir esto para que funcione. Mira esto para más detalles .
Editar:
Parece que pueden estar detectando el evento de cancelación de UITouch (la captura de pantalla cancela toques) y mostrando este mensaje de error al usuario según este blog: http://tumblr.jeremyjohnstone.com/post/38503925370/how-to-detect-screenshots-on-ios-like-snapchat
En ese caso, puede usar el – touchesCancelled:withEvent:
para detectar la cancelación de UITouch para detectar esto. Puede eliminar la imagen en este método delegado y mostrar una alerta apropiada al usuario.
- (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
}
A partir de iOS 7, las otras respuestas ya no son ciertas. Apple lo ha hecho tan touchesCancelled:withEvent:
ya no se llama cuando el usuario toma una captura de pantalla.
Esto efectivamente rompería completamente Snapchat, por lo que se agregaron un par de betas en una nueva solución. Ahora, la solución es tan simple como usar NSNotificationCenter para agregar un observador a UIApplicationUserDidTakeScreenshotNotification .
Aquí hay un ejemplo:
C objetivo
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationUserDidTakeScreenshotNotification
object:nil
queue:mainQueue
usingBlock:^(NSNotification *note) {
// executes after screenshot
}];
Rápido
NotificationCenter.default.addObserver(
forName: .UIApplicationUserDidTakeScreenshot,
object: nil,
queue: .main) { notification in
//executes after screenshot
}