14

私は2つのイベントを検出したかった:

  1. デバイスがロック/ロック解除されます。
  2. デバイスがスリープ状態になり、画面が黒くなります。

ここで達成できた最初のもの: iOSデバイスがロック/ロック解除されているかどうかを確認する方法はありますか?

2番目のイベントを検出したいのですが、それを行う方法はありますか?

4

2 に答える 2

22

あなたは基本的にすでに解決策を持っています。これは、私の最近の回答の1つから見つけたと思います:)

com.apple.springboard.hasBlankedScreenイベントをご利用ください。

画面が空白になったときに発生するイベントは複数ありますが、これで十分です。

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
                                NULL, // observer
                                hasBlankedScreen, // callback
                                CFSTR("com.apple.springboard.hasBlankedScreen"), // event name
                                NULL, // object
                                CFNotificationSuspensionBehaviorDeliverImmediately);

コールバックは次のとおりです。

static void hasBlankedScreen(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{
    NSString* notifyName = (__bridge NSString*)name;
    // this check should really only be necessary if you reuse this one callback method
    //  for multiple Darwin notification events
    if ([notifyName isEqualToString:@"com.apple.springboard.hasBlankedScreen"]) {
       NSLog(@"screen has either gone dark, or been turned back on!");
    }
}

更新: @VictorRonin が下のコメントで述べたように、画面が現在オンオフかを簡単に追跡できるはずです。これによりhasBlankedScreen、画面がオンまたはオフになったときにイベントが発生しているかどうかを判断できます。たとえば、アプリの起動時に、画面がオンであることを示す変数を設定します。また、UI インタラクション (ボタンが押されるなど) が発生するたびに、画面がオンになっている必要があることがわかります。したがって、次にhasBlankedScreen表示されるメッセージは、画面がオフであることを示しているはずです。

また、用語についても明確にしておきたいと思います。タイムアウトにより画面が自動的に暗くなった場合、またはユーザーが手動で電源ボタンを押した場合、デバイスはロックされます。これは、ユーザーがパスコードを構成しているかどうかに関係なく発生します。その際、com.apple.springboard.hasBlankedScreencom.apple.springboard.lockcompleteイベントが表示されます。

画面がオンに戻ると、com.apple.springboard.hasBlankedScreenもう一度表示されます。ただし、com.apple.springboard.lockstateユーザーが実際にスワイプ (および場合によってはパスコード) でデバイスのロックを解除するまで表示されません。


更新 2:

これを行うには、さらに別の方法があります。別の API セットを使用してこの通知をリッスンし、通知が来たときに状態変数を取得することもできます。

#import <notify.h>

int status = notify_register_dispatch("com.apple.springboard.hasBlankedScreen",
                                      &notifyToken,
                                      dispatch_get_main_queue(), ^(int t) {
                                          uint64_t state;
                                          int result = notify_get_state(notifyToken, &state);
                                          NSLog(@"lock state change = %llu", state);
                                          if (result != NOTIFY_STATUS_OK) {
                                              NSLog(@"notify_get_state() not returning NOTIFY_STATUS_OK");
                                          }
                                      });
if (status != NOTIFY_STATUS_OK) {
    NSLog(@"notify_register_dispatch() not returning NOTIFY_STATUS_OK");
}

また、通知トークンを格納するために、 ivarまたはその他の永続変数を保持する必要があります (登録するメソッドでこれをローカル変数にしないでください!)

int notifyToken;

stateを介して取得された変数が 0 と 1 の間で切り替わるのがわかりnotify_get_state()ます。これにより、画面のオン イベントとオフ イベントを区別できます。

このドキュメントは非常に古いものですが、どの通知イベントに を介して取得できる状態が関連付けられているかをリストしていますnotify_get_state()

警告: この最後の手法の複雑さについては、この関連する質問を参照してください

于 2013-01-16T11:39:09.997 に答える
1

「com.apple.springboard.lockstate」という通知をサブスクライブし、API SBGetScreenLockStatusを使用して、デバイスがロックされているかどうかのステータスを判断することもできます。

于 2013-01-16T16:33:50.193 に答える