【问题标题】:How to set Local Notification in without appdelegate using singleton?如何在没有 appdelegate 的情况下使用单例设置本地通知?
【发布时间】:2019-10-31 17:09:25
【问题描述】:

听说我对此本地通知有更多疑问

  • 如何在没有 appdelegate 的情况下设置本地通知?
  • 如何使用单独的控制器调用委托?

这是我的代码!!

import Foundation
import UserNotifications

class NotificationController {

  private static var privateShared: NotificationController?

  static var shared: NotificationController {
    if privateShared == nil {
      privateShared = NotificationController()
    }
    return privateShared!
  }
  class func destroy() {
    privateShared = nil
  }

  private let notificationCenter = UNUserNotificationCenter.current()

  func registerLocalNotification(controller: UIViewController){

    notificationCenter.delegate = self

    let options: UNAuthorizationOptions = [.alert, .sound, .badge]

    notificationCenter.requestAuthorization(options: options) {
      (didAllow, error) in
      if !didAllow {
        print("User has declined notifications")
      }
    }

  }
}

通知类的扩展:

extension NotificationController: UNUserNotificationCenterDelegate {

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification,
                              withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

    completionHandler([.alert, .sound])
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse,
                              withCompletionHandler completionHandler: @escaping () -> Void) {

    if response.notification.request.identifier == "Local Notification" {
      print("Handling notifications with the Local Notification Identifier")
    }

    completionHandler()
  }

  func scheduleNotification(notificationType: String) {

    let content = UNMutableNotificationContent() // Содержимое уведомления
    let categoryIdentifire = "Delete Notification Type"

    content.title = notificationType
    content.body = "This is example how to create " + notificationType
    content.sound = UNNotificationSound.default
    content.badge = 1
    content.categoryIdentifier = categoryIdentifire

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
    let identifier = "Local Notification"
    let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)

    notificationCenter.add(request) { (error) in
      if let error = error {
        print("Error \(error.localizedDescription)")
      }
    }

    let snoozeAction = UNNotificationAction(identifier: "Snooze", title: "Snooze", options: [])
    let deleteAction = UNNotificationAction(identifier: "DeleteAction", title: "Delete", options: [.destructive])
    let category = UNNotificationCategory(identifier: categoryIdentifire,
                                          actions: [snoozeAction, deleteAction],
                                          intentIdentifiers: [],
                                          options: [])

    notificationCenter.setNotificationCategories([category])
  }
}

我无法在没有 appdelegate 的情况下配置本地通知

我身边有什么遗漏吗?

任何参考感谢!

谢谢。

【问题讨论】:

    标签: swift apple-push-notifications uilocalnotification


    【解决方案1】:

    刚开始在 iOS 上处理通知并遇到同样的问题。这是我将 UserNotifications 与单例实例一起使用的实现。

    import Foundation
    import UserNotifications
    
    class NotificationControl {
    
            static let shared = NotificationControl()
    
            private let notificationCenter = UNUserNotificationCenter.current()
    
            func requestAuthorization() {
                notificationCenter.requestAuthorization(options: [.alert, .badge, .sound, .criticalAlert, .provisional]) { (granted, error) in
    
                    guard granted else { return }
                    print(granted)
                    self.getNotificationSettings()
    
                }
            }
    
            func getNotificationSettings() {
                notificationCenter.getNotificationSettings { (settings) in
                    print(settings)
                }
            }
    
            func scheduleNotification(notificationType:String) {
    
                let content = UNMutableNotificationContent()
                content.title = notificationType
                content.body = "Notification example"
                content.sound = UNNotificationSound.defaultCritical
                content.badge = 1
    
                let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)
                let identifier = "Local Notification"
    
                let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
    
                notificationCenter.add(request) { (error) in
                    guard let error = error else { return }
                    print(error.localizedDescription)
                }
            }
        }
    

    AppDelegate:

    import UIKit
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        var window: UIWindow?
    
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
            NotificationControl.shared.requestAuthorization()
            return true
        }
    
        func applicationDidBecomeActive(_ application: UIApplication) {
            UIApplication.shared.applicationIconBadgeNumber = 0
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多