L'application Snapchat , sur l'App Store, est une application qui vous permet de partager des photos avec une autodestruction. Vous ne pouvez voir les images que pendant X secondes. Si vous essayez de prendre une capture d'écran alors que la photo est affichée à l'aide du combo touche de raccourci domicile/puissance, cela indiquera à l'expéditeur que vous avez essayé de prendre une capture d'écran.
Quelle partie du SDK vous permet de détecter que l'utilisateur est en train de prendre une capture d'écran? Je ne savais pas que c'était possible.
J'ai trouvé la réponse !! Faire une capture d'écran interrompt les contacts qui se trouvent sur l'écran. C'est pourquoi Snapchat exige une tenue pour voir la photo. Référence: http://tumblr.jeremyjohnstone.com/post/38503925370/how-to-detect-screenshots-on-ios-like-like-sn
Depuis iOS 7, les autres réponses ne sont plus vraies. Apple l'a rendu ainsi touchesCancelled:withEvent:
n'est plus appelé lorsque l'utilisateur prend une capture d'écran.
Cela casserait complètement Snapchat entièrement, donc un couple de bêtas dans une nouvelle solution a été ajouté. Désormais, la solution est aussi simple que d’utiliser NSNotificationCenter pour ajouter un observateur à IApplicationUserDidTakeScreenshotNotification .
Voici un exemple:
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationUserDidTakeScreenshotNotification
object:nil
queue:mainQueue
usingBlock:^(NSNotification *note) {
// executes after screenshot
}];
NotificationCenter.default.addObserver(
forName: .UIApplicationUserDidTakeScreenshot,
object: nil,
queue: .main) { notification in
//executes after screenshot
}
Voici comment faire Swift avec des fermetures:
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()
}
}
Ceci est inclus en tant que fonction standard dans:
https://github.com/goktugyil/EZSwiftExtensions
Déni de responsabilité: son mon repo
Dernières Swift:
func detectScreenShot(action: @escaping () -> ()) {
let mainQueue = OperationQueue.main
NotificationCenter.default.addObserver(forName: .UIApplicationUserDidTakeScreenshot, object: nil, queue: mainQueue) { notification in
// executes after screenshot
action()
}
}
Dans viewDidLoad, appelez cette fonction
detectScreenShot { () -> () in
print("User took a screen shot")
}
Cependant,
NotificationCenter.default.addObserver(self, selector: #selector(test), name: .UIApplicationUserDidTakeScreenshot, object: nil)
func test() {
//do stuff here
}
fonctionne parfaitement bien. Je ne vois aucun point de mainQueue ...
On dirait qu'il n'y a pas de moyen direct de le faire pour détecter si l'utilisateur a tapé sur home + power button
. Selon this , il était possible auparavant d'utiliser la notification de Darwin, mais cela ne fonctionne plus. Puisque Snapchat le fait déjà, j’imagine qu’ils vérifient l’album photo de l’iPhone pour détecter s’il ya une nouvelle image ajoutée entre ces 10 secondes et comparent en quelque sorte avec l’image affichée. Peut-être un traitement d'image est fait pour cette comparaison. Juste une pensée, vous pouvez probablement essayer d’élargir cela pour que cela fonctionne. Vérifiez ceci pour plus de détails .
Modifier:
On dirait qu'ils pourraient détecter l'événement d'annulation UITouch (la capture d'écran annule les contacts) et afficher ce message d'erreur à l'utilisateur selon ce blog: Comment détecter des captures d'écran sur iOS (comme SnapChat)
Dans ce cas, vous pouvez utiliser – touchesCancelled:withEvent:
méthode pour détecter l'annulation UITouch afin de le détecter. Vous pouvez supprimer l'image dans cette méthode de délégation et afficher une alerte appropriée pour l'utilisateur.
- (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
}
Exemples de Swift 4
Exemple # 1 avec fermeture
NotificationCenter.default.addObserver(forName: .UIApplicationUserDidTakeScreenshot,
object: nil,
queue: OperationQueue.main) { notification in
print("\(notification) that a screenshot was taken!")
}
Exemple n ° 2 avec sélecteur
NotificationCenter.default.addObserver(self,
selector: #selector(screenshotTaken),
name: .UIApplicationUserDidTakeScreenshot,
object: nil)
@objc func screenshotTaken() {
print("Screenshot taken!")
}