iOS UILocalNotification - 当应用程序在后台运行时触发没有委托方法,并且在通知时单击图标

Sus*_*ish 17 iphone notifications localnotification uilocalnotification ios5

iPhone版 - 5.1(9B176)

下面是本地通知期间的一系列事件,其中didFinishLaunchingWithOptions未调用哪种方法.

  1. 应用程序在后台运行.
  2. 得到本地通知 - 简单通知没有对话框.
  3. 单击显示徽章编号的应用程序图标.

根据Apple文档预期:

作为所呈现的通知的结果,用户点击警报的动作按钮或点击(或点击)应用程序图标.如果点击操作按钮(在运行iOS的设备上),系统将启动应用程序,应用程序将调用其委托didFinishLaunchingWithOptions方法(如果已实现); 它传递通知有效负载(用于远程通知)或本地通知对象(用于本地通知).

如果在运行iOS的设备上轻触应用程序图标,则应用程序会调用相同的方法,但不会提供有关通知的信息

实际:未 didFinishLaunchingWithOptions 调用.但applicationWillEnterForegroundapplicationDidBecomeActive被调用.

NJo*_*nes 23

你是对的.该行为与文档不一致.将文档放在一边,重点关注实际行为; 问题的症结似乎在于:如果用户通过与通知交互而变为活动状态,您将收到指向通知的指针,如果用户直接点击您的应用程序图标则不会.

为了显示.如果您提出警报样式通知,并且用户点击操作按钮,或者如果您出现横幅通知并且用户点击该按钮,您将通过以下两种方式之一接收指向该通知的指针:

如果您的应用程序处于Not-Running状态:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    UILocalNotification *launchNote = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (launchNote){
        // I recieved a notification while not running

    }
}
Run Code Online (Sandbox Code Playgroud)

如果您的应用程序在任何状态下运行:

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
    // I recieved a notification
}
Run Code Online (Sandbox Code Playgroud)

在用户选择取消警报样式通知的情况下,该通知消失.

真正烦人的一个不一致的部分是,如果你提出横幅通知并且用户点击你的图标,你似乎无法在通知中心检索对所呈现的通知的引用.也就是说它们不会出现在[[UIApplication sharedApplication] scheduledLocalNotifications]阵列中,大概是因为它们不再被安排但现在已经出现了.

所以总之; 文档错了.还有其他烦人的不一致.如果此行为对您来说是一个问题,您应该向Apple提交错误.