[SwiftUI 100 天] 推送通知

2,515 阅读3分钟

译自 www.hackingwithswift.com/books/ios-s…

更多内容,欢迎关注公众号 「Swift花园」

喜欢文章?不如来个 🔺💛➕三连?关注专栏,关注我 🚀🚀🚀

推送通知

对于应用的最后一部分,我们还将添加一个上下文菜单,让用户可以选择被提醒联络某个特定的人。它会用到 iOS 的 UserNotifications 框架来创建本地通知。

有趣的地方在于我们安排本地通知的方式。记住,第一次使用我们需要使用 requestAuthorization() 来显式地请求在锁定的屏幕上显示通知的权限,后续也要小心用户改变主意,禁用通知权限。

一个选项是每当我们发送通知之前,都调用 requestAuthorization()。当然,这个方法一定奏效:第一次会显示弹窗,其后每次都会根据结果返回成功或者失败。

不过,在即将完成这个项目的节点,我想向你展示一个更强大的替代方案:我们可以请求当前的授权设置,然后决定是安排通知还是请求授权。采用这个方案的原因是,相比简单重复地请求权限,设置对象可以返回诸如 alertSetting 等检查我们能否显示 alert 的属性 —— 用户可能限制我们只能在应用图标上显示角标。

因此,我们将调用 getNotificationSettings() 来读取当前的通知设置。如果允许展示通知,我们就显示通知,如果不允许,我们就请求权限。相比重复代码计划通知,我们要把它放进闭包,以便在任何场景都可以使用。

先添加下面这条 import 到 ProspectsView.swift:

import UserNotifications

然后添加这个方法到 ProspectsView

func addNotification(for prospect: Prospect) {
    let center = UNUserNotificationCenter.current()

    let addRequest = {
        let content = UNMutableNotificationContent()
        content.title = "Contact \(prospect.name)"
        content.subtitle = prospect.emailAddress
        content.sound = UNNotificationSound.default

        var dateComponents = DateComponents()
        dateComponents.hour = 9
        let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)

        let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
        center.add(request)
    }

    // more code to come
}

以上就是为当前 prospect 创建通知的闭包,我们可以按需调用。我们使用 UNCalendarNotificationTrigger 作为触发器,它能让我们指定一个自定义的 DateComponents 实例,把小时组件设置为 9,也就是说,下一次到早上 9 点时触发通知。

提示: 出于测试的目的,我建议你先用下面的代码在 5 秒后触发 alert:

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)

然后一起使用 getNotificationSettings()requestAuthorization(),确保我们只在被允许的情况下安排通知。代码如下:

center.getNotificationSettings { settings in
    if settings.authorizationStatus == .authorized {
        addRequest()
    } else {
        center.requestAuthorization(options: [.alert, .badge, .sound]) { success, error in
            if success {
                addRequest()
            } else {
                print("D'oh")
            }
        }
    }
}

然后添加一个按钮到上下文菜单:

if !prospect.isContacted {
    Button("Remind Me") {
        self.addNotification(for: prospect)
    }
}

到此,我们的整个项目就完成了 —— 运行代码,你可以添加新的 prosect,然后点击屏幕并按住,触发上下文菜单,把它标记为已联络的,或者计划一个联络人的提醒项。



我的公众号 这里有Swift及计算机编程的相关文章,以及优秀国外文章翻译,欢迎关注~

Swift花园微信公众号