作者:陈振港、李凯

苹果在 WWDC22 中,提出了实时活动(Live Activity)的概念,以便于用户在锁屏检查一些运用实时活动的更新,这与盒马的配送场景十分贴合。因而,咱们将Live Activity& “灵动岛” 特性第一时刻落地到盒马 30 分钟配送场景,并作为第一批适配实时活动的 iOS 运用,取得 App Store Today 引荐。

现在,盒马App适配“灵动岛”的最新5.51.1版别已正式上线,欢迎我们晋级体验。在适配过程中,盒马App也在端侧踩过许多“坑”,特此汇总为实战经验同享给我们,欢迎沟通。

快速落地时刻线

  • 6月16日,根据WWDC相关内容提早调研;
  • 8月16日,开端根据官方文档和beta版做demo;
  • 9月8日,登上Apple中国区官网;
  • 9月15日,iOS 16.1 beta敞开,开端正式的需求流程;
  • 10月19日,iOS 16.1 RC上线,开端打包以及回归检验;
  • 10月20日,提交审阅;
  • 10月22日,审阅经过上架;
  • 10月25日,App Store Today引荐。

盒马 iOS Live Activity &“灵动岛”配送场景实践

盒马 iOS Live Activity &“灵动岛”配送场景实践

客户端技能计划

Live Activity&灵动岛简介

在介绍盒马终究落地技能计划之前,先给我们简单介绍一下Live Activity&灵动岛技能调研得出的一些要害信息及其比较适用的场景。

场景约束及主张

  1. 最多继续8小时,运用场景需求考虑,8小时之后无法再改写(现在实践还能够,可是以官方文档为准,自行约束),12小时后强制消失(因而跨天场景不考虑)
  2. 创立时,需求app在前台自动创立,没启动运用的时分不能自己呈现(与特定事务绑定,比方下单后显现)
  3. 卡片本身制止定位以及网络恳求,少数(4KB)数据可经过告诉发送,或经过后台活动改写数据
  4. 同场景多卡片由于样式趋同且折叠,不主张一起创立多卡片

灵动岛适配必要性

  • 与锁屏Live Activity同享数据,在支撑灵动岛的机型下,用户在非锁屏页面时,信息的更新会以灵动岛的方法展现更新
  • Live Activity创立后,灵动岛就能够进行点击呼应了,假如不适配的话,点击灵动岛会自动进入主程序,而且长按会变成一个没有任何信息的黑块
  • 盒马iPhone14 Pro以及 Pro Max用户占比逐步升高

全体计划流程图

盒马 iOS Live Activity &“灵动岛”配送场景实践

注意事项:

  • Live Activity有一个独立的权限,而且是不需求恳求同意的,默许开启
  • 用户有必要坚持开端告诉权限,才干经过告诉改写,后台活动不需求
  • 有必要在运用处于前台时启动,相当于要自动触发
  • 数据更新时,体系自动适配动画,不需求自己额定增加动画(增加了也会被疏忽)
  • 不支撑在其间显现gif图片和网络图片
  • 能够设置呼应页面,比方点击不同控件跳到不同页面,和widget类似

技能难点及战略

根据上述流程计划,咱们在实践落地过程中也遇到一些问题,下面是核心问题和应对战略。

实时更新 – 告诉改写数据

更新方法有2种:

  1. 经过本地update方法在后台改写数据,比方蓝牙、后台活动等。此方法要求主App进程有必要存在,进程一旦杀掉就无法更新;
  2. 经过告诉改写的实时活动,需求告诉为Token-Based,而且对恳求的参数做新的扩展。此方法比较灵敏,无需主App进程存在,更新及时,因而咱们采用此方法。

监听并上报token

运用告诉改写的方法需求获取实时活动独立的pushToken,对比在Swift中经过Http恳求的方法上报,这里考虑用block的方法,将Swift中的token丢回给主工程,由主工程负责上传token。

图片传入 – 非本地化图片

技能约束

由于Live Activity内部禁用网络图片,传统的服务端传图片URL的方法无法满意实践运用,可是希望传入订单图片来个性化地表达而且区别不同订单。

解决计划

iOS 16 beta版时能够经过创立时将图片转为Data格局传入卡片,可是iOS16.1该计划仅限传入4KB左右的图片(API约束),因而暂时不考虑非本地图片计划,采用内置图片方法完成。

机型适配 – 获取屏幕宽度问题

技能约束

iOS 16 beta版时,测验运用UIScreen.main.bounds.width获取屏幕宽度,该方法在模拟器上能够正确获取,可是在真机上,得到值为0,导致无法进行适配。

解决计划

考虑在创立Live Activity时,直接从主工程将屏幕宽度作为开始特点传入其间,验证发现可行。

过渡动画 – 体系约束

Live Activity约束了自定义动画,在数据改写时,体系自行进行过渡,这也导致了过渡时会呈现一些问题。

卡片巨细改变过渡问题及解决计划

假如经过设置整个View的.background,在改变全体Live Activity巨细的时分,一开端会先把之后的区域框定,可是超出的部分色彩与自定义的背景是不共同的。

改之前(渐变背景为.background设置),有显着不同色的状况。

改之后(渐变背景为单独图层),改变时不再有色彩区别。

视频作用展现,请点击此处

进度条长度改变过渡问题及解决计划

实践运用发现,经过mask完成的进度条,假如进度条变长,并没有过渡作用,而是直接跳到终究方位,因而考虑相反的进度条,就能够完成过渡作用。

视频作用展现,请点击此处

埋点分析 – 点击跳转

由于默许状况点击是回主程序,而并不是固定页面,因而有必要自定义widgetUrl(如用于回到订单页面),也能够经过Link完成分区域的跳转,Link和widgetUrl共存时,点击Link区域会呼应Link,因而两者一起运用即可。

技能约束

无法在widget内部直接增加埋点,而且灵动岛收起时,仅支撑增加同一个widgetUrl,关于收起状态增加Link并没有呼应。

解决计划

由于点击直接跳转到主App,因而考虑将埋点参数参加URL参数即可,主App解析时埋点。可是无法记录包含用户检查、用户封闭(封闭卡片 继续发送推送也没有报错 因而无法判别)等行为的埋点。

关于灵动岛的区别,实践测试发现,在展开形式下,能够参加Link而且能够正常呼应,这与官方文档中的描述共同。

版别适配 – 与小镇widget共存

盒马App本来上线有小镇Widget,iOS 14即可支撑,而Live Activity需求iOS 16.1,因而需求对两者做版别适配。

技能约束

  • Xcode 14beta不支撑在Bundle内部区别版别,只能从头创立一个扩展;
  • Xcode 14.1支撑在同一个widget Extension内部区别版别。但beta版发现运用了该方法,会导致两个widget都不呈现,不运用则都能够正常运用,确认是当前版别bug。

解决计划

后置体系版别判别,在LiveActivityWidget内部去约束版别,成功使二者一起展现。

触发场景 – 前置判别

权限约束

体系版别:

  • 不支撑iOS 16.1以下

没有权限:

  • 告诉权限
  • 实时活动权限

前置权限约束判别,不满意以上条件时,不测验创立Live Activity。

时刻约束

送达时刻超过8小时的场景不创立,由于创立后8小时就无法再改写

反常场景

  • 现已存在了许多卡片,到达上限,创立时失利(回来创立结果,失利不进行后续推送)
  • 用户封闭卡片,运用无法感知(继续推送,也不会再显现)

触发提示 – 疲惫度控制

锁屏提示

实时活动的改写支撑静默改写和提示改写,这就需求考虑用户疲惫度,而且灵动岛的展开提示会比普通的告诉屏占比更大,更简单影响到用户。

带有alert字段的告诉会触发锁屏的亮起以及声响,在主屏幕时会展现灵动岛,不带有alert字段的告诉,会静默更新,锁屏时不会亮起,息屏显现时也不会有动画过渡,直接显现后续进度。

特殊状况

事情类型为END的告诉,即使带了alert,也不会触发提示。假如需求的话,能够在此刻发一条update。

关于不支撑灵动岛的机型,增加alert字段,会在主屏幕中触发锁屏Live Activity样式的横幅告诉,现在该横屏会常驻显现,但屏幕有新的任何用户点击都会直接被收起。

扩展才能 – 字段解析

技能约束

为了确保告诉能正常解析,告诉payload字段有必要确保包含客户端定义的字段,若新版别加了新字段,服务端下发了新字段,老版别不会受到影响也能够正常解析。

原因:原生的解析方法,将告诉中的JSON解析为对象,可是关于字段短少的JSON,解析会失利,这时分无法成功改写。

解决计划

考虑外部传入JSONString,内部进行单独解析,注意不要解析为对象,否则还是没法处理字段短少的状况,直接解析为字典,字典内部再对各个特点判别,并将空的特点置为空值,widget内部再对应进行调整显现。

这样方法能够使各事务端只要传自己需求用到的字段即可,不用再传入空值。

后续技能规划

第一阶段咱们在盒马即时配送场景进行初步探索,后续会继续重视用户运用反馈,不断优化迭代,把更好的购物体验带给我们。一起,继续重视苹果官方技能动态,测验在更多与盒马紧密结合的事务场景落地,也欢迎热爱iOS新技能的同学与咱们沟通。