如何使用单例设置不带Appdelegate的本地通知?

时间:2019-06-18 06:06:40

标签: swift apple-push-notifications uilocalnotification

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

  • 如何设置没有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")
      }
    }

  }
}

Notification类的扩展:

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,我将无法配置本地通知

有什么东西想念我吗?

任何参考感谢!

谢谢。

1 个答案:

答案 0 :(得分:0)

刚开始在iOS上处理通知并陷入同样的​​问题。这是将UserNotifications与singleton实例一起使用的实现。

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
    }
}