web-dev-qa-db-fra.com

Détection iOS de capture d'écran?

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.

124
me2

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

22
portforwardpodcast

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:

Objectif c

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

Swift

NotificationCenter.default.addObserver(
    forName: .UIApplicationUserDidTakeScreenshot,
    object: nil,
    queue: .main) { notification in
        //executes after screenshot
}
346
Mick MacCallum

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

11
Esqarrouth

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 ...

4
Maksim Kniazev

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
}
1
iDev

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!")
}
0
Devbot10