私は2つのイベントを検出したかった:
- デバイスがロック/ロック解除されます。
- デバイスがスリープ状態になり、画面が黒くなります。
ここで達成できた最初のもの: iOSデバイスがロック/ロック解除されているかどうかを確認する方法はありますか?
2番目のイベントを検出したいのですが、それを行う方法はありますか?
私は2つのイベントを検出したかった:
ここで達成できた最初のもの: iOSデバイスがロック/ロック解除されているかどうかを確認する方法はありますか?
2番目のイベントを検出したいのですが、それを行う方法はありますか?
あなたは基本的にすでに解決策を持っています。これは、私の最近の回答の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.hasBlankedScreen
とcom.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",
¬ifyToken,
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()
。
「com.apple.springboard.lockstate」という通知をサブスクライブし、API SBGetScreenLockStatusを使用して、デバイスがロックされているかどうかのステータスを判断することもできます。