【问题标题】:Swift: how to schedule local notifications with dynamic contentSwift:如何使用动态内容安排本地通知
【发布时间】:2017-05-08 04:30:03
【问题描述】:

我有一个适用于 iOS 的天气应用程序,我想让用户每天早上在他们选择的时间接收通知,这将获取当天的天气预报并显示通知。

我想避免使用推送通知,并且我认为我可以使用本地通知,但我看不到从服务器获取要显示的内容的方法。看起来必须在调度时设置内容。对吗?

这让我觉得我可以注册我的应用程序以使用后台执行来定期获取天气并安排包含最新内容的通知,但这似乎很浪费。

简而言之,我想告诉 iOS 在特定时间运行特定功能。我错过了一个很好的选择吗?推送通知是完成此类事情的唯一/最佳方式吗?

【问题讨论】:

  • 您可以为您的内容安排本地通知。
  • @KKRocks 也许我的问题不够清楚。我看到的问题是我想在显示通知时获取要在本地通知中显示的内容。因此,就我而言,用户可能会安排早上 7 点的通知,而我想在那时获取通知的内容。
  • 是的,如果您想显示天气预报,推送通知是您的最佳选择。
  • @Truth Potatoe 考虑到我的要求,推送通知是推荐的解决方案吗?
  • 是的,这很有帮助,谢谢。听起来推送通知确实是此类事情的唯一可行选择。

标签: ios iphone swift xcode


【解决方案1】:

如果您想显示weather forecast,推送通知是您的最佳选择。

更多信息:https://stackoverflow.com/a/41901767/3901620

【讨论】:

    【解决方案2】:

    您可以将本地通知安排在特定时间以及用户何时看到它,如果他愿意,他可以通过点击该通知来打开您的应用程序。届时,您将能够知道,用户点击了通知,因此应用程序已打开,您可以进行网络调用以获取数据并将其显示在应用程序中。 这不需要任何后台调用,只需对用户的操作进行网络调用。

    另一种选择:您可以为您的应用创建一个小部件(如天气小部件)。每当用户进入小部件区域时,您都会收到委托呼叫并进行网络呼叫以获取最新的天气数据。如果用户想要更多信息,他只需点击它,您的应用程序就会打开。然后,一切都将掌握在您的手中。

    您的选择:当用户在特定日期打开您的应用并为其设置通知时,您始终可以获取动态内容。但这并不建议,因为用户可能无法获得更新的数据。

    推送通知:但是,如果您想通过服务器将动态数据发送到您的应用程序,您的情况可能不需要这样做。这始终是最佳选择。

    【讨论】:

      【解决方案3】:

      我创建了一个函数。这将在您需要的特定时间调用您的函数。我正在创建一个时钟应用程序,因此我需要在用户创建闹钟时触发本地通知。在通知中心委托方法中,您可以处理您的响应并调用您想要的任何方法。

      class LocalNotificationMethod : NSObject {
      
      static let notificationInstance = LocalNotificationMethod()
      
      let requestIdentifier = "SampleRequest" //identifier is to cancel the notification request
      
       internal func scheduleLocalNotification(titleOfNotification:String, subtitleOfNotification:String, messageOfNotification:String, soundOfNotification:String, dateOfNotification:String) {
      
          if #available(iOS 10.0, *) {
      
              let formatter = DateFormatter()
              formatter.dateFormat = "yyyy-MM-dd hh:mm a"
              let date3 = formatter.date(from: dateOfNotification)
      
              let content = UNMutableNotificationContent()
              content.body = NSString.localizedUserNotificationString(forKey: titleOfNotification, arguments: nil)
              content.sound = soundOfNotification.characters.count > 0 ? UNNotificationSound.init(named: soundOfNotification + ".mp3") : UNNotificationSound.default()
      
              let trigger = UNCalendarNotificationTrigger.init(dateMatching: NSCalendar.current.dateComponents([.day, .month, .year, .hour, .minute], from: date3!), repeats: false)
      
              let request = UNNotificationRequest(identifier:requestIdentifier, content: content, trigger: trigger)
      
              UNUserNotificationCenter.current().add(request){(error) in
      
                  if (error != nil){
      
                      print(error?.localizedDescription)
                  } else {
                      print("Successfully Done")
                  }
              }
          } else {
              // Fallback on earlier versions
          }
      
      }
      }
      

      在 AppDelegate 方法中: - 您可以在用户点击您的通知或您的通知出现时进行处理。取决于您要做什么。

      //MARK:- 通知代表

      @available(iOS 10.0, *)
      func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
      
          print("Tapped in notification")
      }
      
      //This is key callback to present notification while the app is in foreground
      @available(iOS 10.0, *)
      func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
      
      
          print("Notification being triggered")
          //You can either present alert ,sound or increase badge while the app is in foreground too with ios 10
          //to distinguish between notifications
          if notification.request.identifier == "SampleRequest" {
      
              completionHandler( [.alert,.sound,.badge])
      
          }
      }
      

      【讨论】:

      • 谢谢,但我没有看到它如何满足我的需求。我要做的是(a)安排在每天早上 7 点发送通知,以及(b)能够在早上 7 点从我的服务器获取通知的文本。在willPresent函数中,你能从服务器获取json等吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 2018-04-18
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      相关资源
      最近更新 更多