iOS通知:未调用回调

时间:2016-01-27 16:53:57

标签: ios objective-c iphone notifications

我通过本地通知为应用实施提醒功能。 用户将设置时间和重复间隔,应用程序将安排相应的通知,如下所示:

UILocalNotification *notification = ...;
[[UIApplication sharedApplication] scheduleLocalNotification:notification];

为此,我需要注册我的通知类型:

UIUserNotificationSettings *notificationSettings;

notificationSettings = [UIUserNotificationSettings
                         settingsForTypes:UIUserNotificationTypeAlert
                               categories:nil];

[[UIApplication sharedApplication]
  registerUserNotificationSettings:notificationSettings];

虽然正确安排了通知,但没有调用任何AppDelegate回调(didRegisterUserNotificationSettingsdidReceiveLocalNotification)。但我需要做出反应 应用程序位于前台时发出通知。

注册通知设置应该在AppDelegate中触发回调消息:

- (void)application:(UIApplication *)application
        didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
   NSLog(@"Callback called.");
}

它适用于快速测试项目(新项目 - >单一视图应用程序 - >添加注册码和回调 - >启动)。回调被调用。

然而,在真正的应用程序中,它不起作用。

我完全剥离了我的应用程序AppDelegate(删除了自定义初始化代码,没有加载ui),因此它只是注册通知设置。全新的应用安装会正确触发用户确认对话框。但回调不会被调用。

我错过了构建设置/编译器标志吗?我不知道应用程序指向该方向的任何特殊设置。我无法发现示例项目的任何差异。

Xcode 7.2,iPod5 iOS9.2.1

1 个答案:

答案 0 :(得分:1)

哎哟。这是一个facepalm的完美理由......

为了检测整个应用程序中的某些ui事件,AppDelegate已更改为exdend UIApplication,因此我可以使用- (void)sendEvent:(UIEvent *)event回调。 AppDelegate通常应该扩展UIResponder

您可以在main.m

中为这两种用途设置不同的类
int main(int argc, char *argv[])
{
  @autoreleasepool {
    @try {
      // Original AppDelegate now extending UIResponder
      NSString *mainDelegate = NSStringFromClass([AppDelegate class]);
      // New class extending UIApplication
      NSString *mainClass    = NSStringFromClass([AppMain class]);

      return UIApplicationMain(argc, argv, mainClass, mainDelegate);
    }
    @catch (NSException *exception) {
      NSLog(@"%@", [exception reason]);
    }
  }
}

我感谢大家的建议。 有时你必须退后一步。