繁体   English   中英

应用终止后无法处理本地通知

[英]Unable to Handle Local Notification when app has been terminated

我制作的应用程序会跟踪目标和里程碑(属于目标),并通过UILocalNotification提醒用户何时它们即将达到目标或里程碑的到期日期

当应用程序处于后台状态且应用程序处于前台时,我的应用程序已成功处理了本地通知。

我知道,如果您希望处理终止应用程序时收到的本地通知,则需要通过appDelegate中application:didFinishLaunchingWithOptions:方法的启动选项访问本地通知。

但是,每当我测试应用程序并在应用程序终止后激活本地通知时,我都无法在application:didFinishLaunchingWithOptions中处理本地通知:

我怀疑这与启动选项为nil或启动选项没有本地通知有效负载有关。

我测试这种情况的方式是这样的:

  1. 我构建并运行该应用程序(命令+ R)
  2. 我安排通知
  3. 我停止运行模拟器,然后将Mac的时间更改为开火日期之前
  4. 我再次构建并运行该应用程序,然后继续从模拟器中终止该应用程序(通过Shift + Command + H两次,然后向上滑动)
  5. 我锁定屏幕并等待通知
  6. 触发后,我在锁定屏幕上滑动通知

通知触发并刷卡通知后,将启动该应用程序,但是我在处理application:didFinishLaunchingWithOptions:中的本地通知有效负载时所使用的方法均未调用。

我在我的应用程序中的代码:didFinishLaunchingWithOptions:处理本地通知有效内容如下:

 if let options = launchOptions {
        let value = options[UIApplicationLaunchOptionsLocalNotificationKey] as? UILocalNotification

        if let notification = value {
            self.application(application, didReceiveLocalNotification: notification)
        }
    }

我的应用程序中的代码:didReceiveLocalNotification:如下:

    func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {
    //If the user receives a notification while app is in the foreground
    println("")

    if application.applicationState == UIApplicationState.Active {
        println("did receive notification")
        UIApplication.sharedApplication().applicationIconBadgeNumber = 0
        let alertController = UIAlertController(title: nil, message: notification.alertBody!, preferredStyle: UIAlertControllerStyle.Alert)

        let alertAction = UIAlertAction(title: "View", style: UIAlertActionStyle.Default) { (alertAction) -> Void in
        self.performFollowUpActionForNotification(notification)
        }

        let cancelAction = UIAlertAction(title: "Close", style: UIAlertActionStyle.Cancel, handler: nil)

        alertController.addAction(alertAction)
        alertController.addAction(cancelAction)

        self.window!.rootViewController!.presentViewController(alertController, animated: true, completion: nil)
    }

    else {
        performFollowUpActionForNotification(notification)
        application.applicationIconBadgeNumber = 0
    }


}

以及辅助方法performFollowUpActionForNotification:

func performFollowUpActionForNotification(notification:UILocalNotification) {

    if notification.alertAction! == "View Goal" {
        if let tabVC = self.window?.rootViewController? as? UITabBarController {
            let navCon = tabVC.viewControllers![0] as UINavigationController
            if navCon.topViewController is GoalPageViewController {

            }

            else {
                navCon.pushViewController(navCon.viewControllers![0] as UIViewController, animated: true )

            }
        }
    }

    if notification.alertAction! == "View Milestone" {
        if let tabVC = self.window?.rootViewController? as? UITabBarController {

            let navCon = tabVC.viewControllers![0] as UINavigationController
            if let goalPageVC = navCon.viewControllers![0] as? GoalPageViewController {
                goalPageVC.findGoalThatContainsMilestoneAndGoToDetailForNotification(notification)
            }
            else {println("cant down cast view controller to goal page view controller")}
        }
    }
}

我的代码有问题还是在这种情况下如何测试我的应用程序? 我非常需要一个答案。

希望对您有帮助,请在下面查看。

在iOS 7.1中,Apple对系统如何处理由信标触发的通知进行了非常重要的更新。 现在,即使输入/输出监视事件已终止,该应用程序也可以采取措施。 与iOS 7相比,这是一个了不起的改进,但是关于它的实际工作方式仍然存在很多困惑,因此我们准备了一个简短的教程。

位置事件(在这种情况下与信标有关)的处理方式与任何其他应用程序启动事件相同。 在应用终止时,电话每次进入或退出信标区域,都会自动启动,并使用launchOptions参数中存在的UIApplicationLaunchOptionsLocationKey键调用application:didFinishLaunchingWithOptions:方法(属于AppDelegate类)。

当您确认此密钥存在(因此位置是启动应用的原因)时,应创建ESTBeaconManager类的新实例,将委托设置为AppDelegate对象(或任何其他充当ESTBeaconManagerDelegate并在此事件发生之前创建的对象)并开始监视。 您传递给startMonitoringForRegion:方法的区域并不重要,因为ESTBeaconManager委托将接收最新的区域信息。 您可以选择您的应用在iOS中注册的任何应用。 撤销监视后,应用程序将在beaconManager:didEnterRegion:或beaconManager:didExitRegion:方法中自动接收最近输入/退出的区域事件。

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary      *)launchOptions

{ 

   if([launchOptions objectForKey:@"UIApplicationLaunchOptionsLocationKey"])
   {
    self.beaconManager = [ESTBeaconManager new];
    self.beaconManager.delegate = self;
    // don't forget the NSLocationAlwaysUsageDescription in your Info.plist
    [self.beaconManager requestAlwaysAuthorization];
    [self.beaconManager startMonitoringForRegion:[[ESTBeaconRegion alloc]
                                                  initWithProximityUUID:ESTIMOTE_PROXIMITY_UUID
                                                  identifier:@"AppRegion"]];

    }

   return YES;

    }

 -(void)beaconManager:(ESTBeaconManager *)manager didEnterRegion:(ESTBeaconRegion *)region

{

 UILocalNotification *notification = [[UILocalNotification alloc] init];
 notification.alertBody = @"Enter region";
 notification.soundName = UILocalNotificationDefaultSoundName;

 [[UIApplication sharedApplication] presentLocalNotificationNow:notification];

}

-(void)beaconManager:(ESTBeaconManager *)manager didExitRegion:(ESTBeaconRegion *)region
{
  UILocalNotification *notification = [[UILocalNotification alloc] init];
  notification.alertBody = @"Exit region";
  notification.soundName = UILocalNotificationDefaultSoundName;

 [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM