如何在ios应用程序中有条件地推送本地通知?

时间:2016-05-21 18:49:14

标签: ios swift uilocalnotification

我正在开发一个ios应用程序,它会在应用程序发送到后台后发送通知。当用户在MainviewController.swift中将值设置为true时,我只希望通知工作。所以我有这样的事情:

 func setDelegateToTrue () {
      Appdelegate().setToStart()
 }

 func setDelegateToFalse () {
      Appdelegate().setToEnd()
 }

在我的Appdelegate.swift中,我有类似的东西:

 var started = false

 func applicationDidEnterBackground(application: UIApplication) {
      if(started) {
      let notification: UILocalNotification = UILocalNotification()
      notification.category = "FIRST_CATEGORY"
      notification.alertBody = "do not forget your app"
      notification.repeatInterval = NSCalendarUnit.Day
      notification.timeZone = NSTimeZone.defaultTimeZone()
      UIApplication.sharedApplication().scheduleLocalNotification(notification)
      started = false
     }
 }

 func setToStart() {
      started = true
 }

 func setToEnd() {
      started = false
 }

没有if语句时通知正常,但是,当我有if语句并在viewdidload中调用setDelegateToTrue()时,它停止工作。似乎启动的布尔值是在调用setToStart()之后更改的,但实际上我可以从setToStart()中打印出来。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

您的问题是,当您运行AppDelegate时,您正在创建AppDelegate().setToStart()的新实例。因此,当应用程序委托它稍后调用时,它的标志仍然设置为false,因为您在另一个实例上设置了一个标志(立即销毁)。

要执行您当前尝试的操作,您需要从delegateUIApplication)获取sharedApplication并在其上设置标记。

在与视图控制器等进行通信时请记住这一点,因为您总是需要获取要与之对话的实例而不是创建新实例。

答案 1 :(得分:1)

对于此行为,您可以使用NSUserDefault: 将Main ViewController中的值设置为:

 NSUserDefaults.standardUserDefaults().setBool(true, forKey: "shouldSendNotification")

并在app delegate的applicationDidEnterBackground中访问此用户默认值,如下所示:

func applicationDidEnterBackground(application: UIApplication) {
    let  shouldSendNotification = NSUserDefaults.standardUserDefaults().boolForKey("shouldSendNotification")
    if shouldSendNotification {
        let notification: UILocalNotification = UILocalNotification()
        notification.category = "FIRST_CATEGORY"
        notification.alertBody = "do not forget your app"
        notification.repeatInterval = NSCalendarUnit.Day
        notification.timeZone = NSTimeZone.defaultTimeZone()
        UIApplication.sharedApplication().scheduleLocalNotification(notification)
         NSUserDefaults.standardUserDefaults().setBool(false, forKey: "shouldSendNotification")
    }
}

答案 2 :(得分:1)

你需要做的是

 func setDelegateToTrue () {
  AppDelegate.sharedAppDelegate().setToStart()
 }

 func setDelegateToFalse () {
  AppDelegate.sharedAppDelegate().setToEnd()
 }