Verrouiller Déverrouiller les événements de l'iphone
Comment puis-je détecter de verrouillage/déverrouillage des événements sur l'iPhone? En supposant que c'est possible uniquement pour les appareils jailbreaké, pouvez-vous m'indiquer la bonne API?
Par les événements de verrouillage, je veux dire en affichant ou en masquant l'Écran de Verrouillage (qui pourrait avoir besoin d'un mot de passe pour déverrouiller, ou pas).
- qu'entendez-vous par "verrouiller/déverrouiller les événements"?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser Darwin notifications, pour écouter les événements. De mon test sur une jailbreaké iOS 5.0.1 iPhone 4, je pense qu'un de ces événements pourrait être ce dont vous avez besoin:
Remarque: selon l'affiche du commentaires à une question similaire, j'ai répondu ici, cela doit fonctionner sur un non-jailbreaké téléphone, trop.
Pour l'utiliser, vous inscrire pour l'événement de ce type (il enregistre pour le premier cas ci-dessus, mais vous pouvez ajouter un observateur pour
lockcomplete
, trop):où
lockStateChanged
est votre rappel d'événement:La
lockstate
événement se produit lorsque l'appareil est verrouillé et débloqué, mais lelockcomplete
événement est déclenché uniquement lorsque le verrouillage de l'appareil. Une autre façon de déterminer si l'événement est pour verrouiller ou déverrouiller l'événement est d'utilisernotify_get_state()
. Vous obtiendrez une valeur différente pour verrouiller vs déverrouiller, comme décrit ici.static
C fonctions.NSDistributedNotificationCenter
si vous le souhaitez. Dans ce cas, nous sommes écouter pour les notifications que notre code ne génère pas de. Nous n'avons aucun contrôle sur lequel le centre de notifications d'iOS utilise. Il s'avère que l'iOS utilise le Darwin systèmes de notifications pour afficher un événement lorsque l'état de verrouillage des changements. Nous ne pouvons pas contrôler. Ma réponse montre simplement comment vous écouter pour cet événement. Cela fait-il sens?CFNotificationCenterAddObserver()
API est public, donc ça devrait être bon. Lecom.apple.springboard.lockstate
chaîne est sans-papiers, de sorte qu'il pourrait être un problème. Mais, je pense qu'il serait approuvé. Vous avez toujours la possibilité de masquer cette chaîne si vous êtes inquiet.Alentour réponse:
Application va démissionner active est appelée dans toutes sortes de scénarios... et de tous mes essais, même si votre demande reste éveillé pendant backgrounded, il n'existe aucun moyen de déterminer que l'écran est verrouillé (la vitesse du PROCESSEUR n'a pas de rapport, la vitesse du BUS reste le même, mach_time denom /numer ne change pas)...
Cependant, il semble qu'Apple n'désactiver l'accéléromètre lorsque l'appareil est verrouillé... Activer l'accéléromètre de l'iPhone lorsque l'écran est verrouillé
(testé iOS4.2 sur iPhone 4 a ce comportement)
Donc...
Dans votre application délégué:
Je sais... C'est une sorte de hack, mais il a fonctionné comme un charme pour moi jusqu'à présent. Veuillez mettre à jour si vous voyez des problèmes qui empêchent ce travail.
Il y a une plus jolie façon de dire en dehors de la tâche et de commutation de l'écran de verrouillage d'origine
applicationWillResignActive:
rappels qui n'a même pas impliquer les sans-papiers, des fonctionnalités telles que l'accéléromètre de l'état.Lorsque l'application passe en arrière-plan, le délégué d'application est d'abord envoyé un
applicationWillResignActive:
, puis unapplicationDidEnterBackground:
. Lorsque l'application est interrompue en appuyant sur le bouton de Verrouillage ou par un appel téléphonique entrant, cette dernière méthode n'est pas appelée. Nous pouvons utiliser cette information pour distinguer entre les deux scénarios.Dites que vous voulez être rappelé dans la
screenLockActivated
méthode si l'écran est verrouillé. Voici la magie:Explication:
Par défaut, nous supposons que chaque appel à
applicationWillResignActive:
est à cause d'un actif->état inactif de transition (comme lorsque le verrouillage de l'écran), mais nous avons généreusement laisser le système de prouver le contraire à l'intérieur d'un délai d'attente (dans ce cas, seul un runloop cycle) en retardant l'appel àscreenLockActivated
. Dans le cas où l'écran est verrouillé, le système termine le courant runloop cycle sans toucher à un autre délégué méthodes. Si, cependant, ce est un actif->arrière-plan de l'état de transition, il invoque égalementapplicationDidEnterBackground:
avant la fin du cycle, ce qui nous permet d'annuler purement et simplement la déjà programmée demande à partir de là, l'empêchant ainsi d'être appelé quand il n'est pas censé le faire.Profitez-en!
dans iOS 8, vous pouvez verrouiller l'écran ou appuyez sur le bouton home, tous ceux qui font application de pousser en arrière-plan, mais vous ne savez pas quel opérateur de suite en ce. Ma solution même avec Nits007ak,utilisez notify_register_dispatch pour obtenir de l'état.
Tant que l'application est en cours d'exécution, au premier plan ou en arrière-plan. ne pas suspendre, vous pouvez obtenir cet événement.
Et vous pouvez utiliser notify_token comme paramètre de notify_get_state pour obtenir de l'état actuel de n'importe où, cela est utile lorsque vous souhaitez connaître l'état et l'état de l'écran ne change pas.
Au moment de l'écriture, il y a deux assez de moyens fiables pour détecter de verrouillage de périphérique:
De La Protection Des Données
Par l'activation de la La Protection des données droit votre application peut s'abonner à la
applicationProtectedDataWillBecomeunavailable:
etapplicationProtectedDataDidBecomeavailable:
notifications afin de déterminer, avec une haute probabilité lorsqu'un périphérique qui utilise le code d'accès/TouchID d'Authentification est verrouillé/déverrouillé. Afin de déterminer si l'appareil utilise un mot de passe/TouchIDLAContext
peut être interrogé.Mises en garde: Cette méthode repose sur le "protégés données devient indisponible" coïncidant avec le téléphone est verrouillé. Lorsque le téléphone est à l'aide de TouchID et le sommeil/bouton de verrouillage est enfoncé alors que le téléphone est verrouillé, protégé de données devient indisponible, et un mot de passe sera immédiatement nécessaire pour le déverrouiller à nouveau. Cela signifie que les protégés de données devient indisponible indique essentiellement que le téléphone a été verrouillé. Ce n'est pas nécessairement vrai quand quelqu'un est en utilisant simplement un code car ils peuvent définir le "exige code" moment à n'importe où à partir de immédiatement à quelque chose comme 4 heures. Dans ce cas, le téléphone se disent capables de gérer des données protégées, mais le verrouillage du téléphone n'entraînera pas de protection des données devient indisponible pour quelques temps.
Cycle De Vie Du Calendrier
Si votre application est au premier plan, il y aura un changement notable dans la différence de temps entre les deux événements de cycle de vie
UIApplicationWillResignActiveNotification
etUIApplicationDidEnterBackgroundNotification
en fonction de ce qui les déclenche.(Cela a été testé dans iOS 10 et peut changer dans les versions futures)
Appuyant sur le bouton home résultats dans un délai important entre les deux (même lors de la Réduction de la Motion paramètre est activé):
Le verrouillage de l'appareil, tandis que l'application est ouverte crée une plus trivial (<~0,2 s) délai entre les deux événements:
UIApplicationProtectedDataWillBecomeUnavailable
et ont constaté qu'il n'est généralement pas le feu lorsque l'écran est verrouillé, même si ce n'est de temps en temps. Cependant, je reçois informé surUIApplicationProtectedDataDidBecomeAvailable
chaque fois que l'appareil est déverrouillé. Toutes les idées pourquoi?Il suffit d'importer #import informer.h avant d'utiliser ce code. profitez-en!!
Si le mot de passe est défini, vous pouvez utiliser ces événements dans AppDelegate
De beaucoup d'essais et d'erreurs, a découvert la surveillance de la vierge de l'écran, verrouillage complet et l'état de verrouillage des événements donne une cohérence de l'écran de verrouillage de l'indicateur. Vous aurez besoin de surveiller l'état de transition.
D'avoir l'écran de verrouillage indicateurs exécuter en arrière-plan, vous avez besoin pour mettre en œuvre le traitement de fond de l'appel de la suite lors de l'application de lancement.
Si votre application est en cours d'exécution et l'utilisateur verrouille l'appareil de votre application délégué recevra un appel à " l'application Va Démissionner Active:'. Si votre application est en cours d'exécution lorsque le clavier est verrouillé, il recevra un appel à "l'application Ne Deviennent Actifs:" lorsque l'appareil est déverrouillé. Mais vous obtenez les mêmes appels de votre application si l'utilisateur reçoit un appel téléphonique, puis choisit de l'ignorer. Vous ne pouvez pas faire la différence, autant que je sache.
Et si votre application n'est pas en cours d'exécution à l'un de ces moments, il n'y a aucun moyen d'être averti depuis votre application n'est pas en cours d'exécution.
La façon la plus simple pour obtenir l'écran de verrouillage et déverrouillage des événements sont en ajoutant de l'événement observateurs à l'aide de NSNotificationCenter dans votre viewcontroller. J'ai ajouté la suite de l'observateur dans la méthode viewdidload. C'est ce que j'ai fait:
Puis j'ai ajouté le sélecteur suivant le viewcontroller. Ce sélecteur sera appelée lorsque l'écran est déverrouillé.
Si vous voulez détecter le cas lorsque l'écran est verrouillé, vous pouvez remplacer UIApplicationWillEnterForegroundnotification avec UIApplicationDidEnterBackgroundNotification.