iOS 16.1 使用推送通知更新实时活动

303 阅读1分钟

ActivityKit 提供了从应用程序启动、更新和结束实时活动的功能。我们可以使用Token通过从服务器发送到 Apple 推送通知服务 (APNs) 的 ActivityKit 推送通知来更新实时活动, 苹果WWDC:《Update Live Activities with push notifications》教程视频

要使用 ActivityKit 推送通知更新实时活动:

1.获取APP的推送Token

使用 ActivityKit ,在启动实时活动时获取实时活动的唯一推送Token。

func startActivity(orderId:String) throws {   
        let attributes = MyDynamicIslandAttributes(
            // 静态数据
        )
        let initialContentState = MyDynamicIslandAttributes.ContentState(
            // 动态数据
        )
        let activity = try Activity.request(
            attributes: attributes,
            content: .init(state: initialContentState, staleDate: nil),
            pushType: .token)
            
        Task {
        // 获取实时活动的唯一推送Token
            for await data in activity.pushTokenUpdates {
                let token = data.map { String(format: "%02x", $0) }.joined()
            }
        }
    }

使用Activity.request方法时注意传入pushType参数为.token,指定实时活动更新方式为“基于token”的推送更新,这个token就标识了是哪部手机的哪个实时活动来接受推送通知。拿到token后,前端要把它发送给后端服务器,由后端处理发给苹果进行推送

坑:

Activity.request方法后,token不会立刻生成,而是会异步生成,过一段时间才能取到,所以要建一个Task使用for await方式来获取

真机调试能获取token,模拟器也可以生成token

2.为APP开启推送通知能力

在苹果开发者中心developer.apple.com 申请一个用于通知的key

rendered2x-1690321975.png

之后可以获得:

一个10个字符的Key ID,后续的推送中会用到

一个authentication token signing key,是一个.p8类型的文件,后续的推送中需要传入它的存储路径。

3.将要推送的数据进行封装,准备进行通知推送

"aps": { "timestamp":'$(date +%s)', "event":"update", "content-state":{ "logo": "https://img.duoziwang.com/2016/12/17/16485364877.jpg", "title": "订单已经开始配送", "subTitle": "快递员正在加急配送", "progress": 0.6 } }

服务器推送的字段一定要跟 MyDynamicIslandAttributes 的ContentState 变量字段对上比如驼峰命名、下划线命名都可总之一定要对上、类型也要对上

aps内的数据就是推送通知内容,timestamp是时间戳;event是通知类型,分为update和end两种;content-state就是上文中定义的ActivityAttributes动态数据属性部分,这里的key要与属性名对应,接到通知后就可以自动解析并更新数据