在 Darwin 通知中心回调上调用 UIAlert

Posted

技术标签:

【中文标题】在 Darwin 通知中心回调上调用 UIAlert【英文标题】:Call UIAlert on Darwin notification center callback 【发布时间】:2016-05-17 16:45:14 【问题描述】:

我在 ViewDidLoad 上创建了一个 Darwin 通知,我想在调用回调时调用 UIAlert。在这种情况下,我想在屏幕解锁时调用警报,为此我将创建一个变量,在第二次调用此回调时设置为 TRUE/YES(考虑到第一次将是用户锁定屏幕时和用户第二次解锁屏幕时)。当此变量为 TRUE/YES 时,将调用警报。

我该怎么做?

我的代码:

- (void)viewDidLoad 
[super viewDidLoad]; 
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), 
                                NULL, 
                                hasBlankedScreen, 
                                CFSTR("com.apple.springboard.hasBlankedScreen"), 
                                NULL, 
                                CFNotificationSuspensionBehaviorDeliverImmediately);


static void hasBlankedScreen(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)

    /*
    if(isUnlocked)
        [self myAlert];
     else
        isUnlocked = true;
     
    */


- (void) myAlert
    UIAlertController * alert=   [UIAlertController
                                  alertControllerWithTitle:@"HEY"
                                  message:@"Screen is unlocked"
                                  preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                                          handler:^(UIAlertAction * action) 
                                                              [self pop];
                                                          ];

    [alert addAction:defaultAction];

    [self presentViewController:alert animated:YES completion:nil];

【问题讨论】:

【参考方案1】:

这很简单:

1) 将(const void*)self 作为观察者传递给CFNotificationCenterAddObserver 而不是NULL

2) 在hasBlankedScreen 中使用(__bridge ViewController*)observer 而不是self

完整代码:

- (void)viewDidLoad 
    [super viewDidLoad];
    CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
                                    (const void*)self,
                                    hasBlankedScreen,
                                    CFSTR("com.apple.springboard.hasBlankedScreen"),
                                    NULL,
                                    CFNotificationSuspensionBehaviorDeliverImmediately);


static void hasBlankedScreen(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) 
     if (self.locked) 
         [(__bridge ViewController*)observer myAlert];
         self.locked = NO;
      else 
         self.locked = YES;
     

【讨论】:

以上是关于在 Darwin 通知中心回调上调用 UIAlert的主要内容,如果未能解决你的问题,请参考以下文章

通过 Azure 通知中心跟踪 PNS 传递

未调用 PHP 流通知回调

Java回调机制解析

Java回调机制解析

应用程序重启后未调用iOS OneSignal handleNotificationReceived回调

推送通知委托回调没有被调用