作者:京东零售 姜海

灵动岛是苹果在iPhone 14 Pro和iPhone 14 Pro Max上首次提出的全新UI交互方式,创新性的让虚拟软件和硬件的交互变得更为流通。当有来电、短信等告诉时,灵动岛会改变形状,以便让用户能够更直观地接收到这些信息。

而在用户运用一些应用App,比方音乐,并将其切换到后台时,灵动岛也能以另一种形状来显现这些软件,还能够通过轻点,重按等来实现的操作,比方切换歌曲。

苹果在iOS16.1体系对第三方开放了灵动岛的API,并允许开发者根据灵动岛开发相应软件,越来越多的APP开端根据灵动岛的交互进行规划和开发,本文将简单介绍灵动岛开发的流程和将其与事务场景相结合的考虑。

接入灵动岛

假如项目之前开发过widget小组件,现已增加过Widget Extension,并有WidgetBundle文件,那么能够直接根据其进行扩打开发。但要留意的是,灵动岛开发用到的是Live Activity,首要包含锁屏告诉,顶部告诉等款式:

iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践



而并不是widget开发用到的Time Line方式,两者在UI形状上基本毫无关系,仅仅需求在WidgetBundle中实例化。假如之前没有开发过widget,能够参见另一篇文章:《Widget开发以及动态配置》

首先给工程增加Widget Extension:

iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践



勾选Live Activity:

iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践



树立Extension以后,体系会主动生成三个文件,除了widget开发用到的TimeLine相关内容的文件和WidgetBundle文件外,还会生成一个专门用来开发灵动岛Live Activity的文件:

iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践



文件中现已主动生成了部分代码大纲,能够直接查看效果并根据其上进行开发:

struct DJDynamicIslandAdvanceLiveActivity: Widget {
    var body: some WidgetConfiguration {
        ActivityConfiguration(for: DJDynamicIslandAdvanceAttributes.self) { context in
            // Lock screen/banner UI goes here
            VStack {
                Text("Hello")
            }
            .activityBackgroundTint(Color.cyan)
            .activitySystemActionForegroundColor(Color.red)
        } dynamicIsland: { context in
            DynamicIsland {
                // 点击灵动岛后打开的款式
                // various regions, like leading/trailing/center/bottom
                DynamicIslandExpandedRegion(.leading) {
                    Text("Leading")
                }
                DynamicIslandExpandedRegion(.trailing) {
                    Text("Trailing")
                }
                DynamicIslandExpandedRegion(.center) {
                    Text("Center")
                }
                DynamicIslandExpandedRegion(.bottom) {
                    Text("Bottom")
                    // more content
                }
            } compactLeading: {
                // compact方式(长条款式)左边内容,一般放icon
                Text("compactLeading")
            } compactTrailing: {
                // compact方式(长条款式)右侧内容,一般放描绘案牍
                Text("compactTrailing")
            } minimal: {
                // minimal方式(其他APP抢占后的圆圈款式)
                Text("minimal")
            }
            .widgetURL(URL(string: "http://www.apple.com"))
            .keylineTint(Color.red)
        }
    }
}

同时需求在info.plist中增加对Live Activity的支持,在TARGETS – Info – Custom iOS Target Properties中增加NSSupportsLiveActivities并设置为YES:

iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践



不同展现款式

灵动岛首要包含三种展现款式:

灵动岛被重按后,打开的完整方式(expanded)

iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践



此方式分为Leading、Trailing、Center和Bottom四个部分,在体系主动为咱们生成的代码中,ActivityConfiguration的dynamicIsland中能够分别找到对应操控的代码段:

dynamicIsland: { context in
            DynamicIsland {
                // 点击灵动岛后打开的款式
                // various regions, like leading/trailing/center/bottom
                DynamicIslandExpandedRegion(.leading) {
                    Text("Leading")
                }
                DynamicIslandExpandedRegion(.trailing) {
                    Text("Trailing")
                }
                DynamicIslandExpandedRegion(.center) {
                    Text("Center")
                }
                DynamicIslandExpandedRegion(.bottom) {
                    Text("Bottom")
                    // more content
                }
            }

APP切后台后的长条形展现款式(compact)

此方式分为两个部分:左面的Leading,一般用于放图片icon等;右边的Trailing,一般用与放置案牍描绘

iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践



在体系主动为咱们生成的代码中,ActivityConfiguration的dynamicIsland部分分别对应compactLeading和compactTrailing,能够在其间编写咱们想要的UI展现:

compactLeading: {
                // compact方式(长条款式)左边内容,一般放icon
                Text("compactLeading")
            } compactTrailing: {
                // compact方式(长条款式)右侧内容,一般放描绘案牍
                Text("compactTrailing")
            } 

其他APP切后台时,改变为灵动岛将本app抢占后展现的圆点方式(minimal)

此局势一般用于放置图标icon或动态图等

iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践



在系ActivityConfiguration的dynamicIsland部分对应minimal,能够在其间编写咱们想要的UI展现

minimal: {
                // minimal方式(其他APP抢占后的圆圈款式)
                Text("minimal")
            }

动态数据更新

上文说灵动岛视图布局是在ActivityConfiguration中编写的,而其上的数据更新依托的是ActivityAttributes目标。需求留意的是,ActivityAttributes不需求跟ActivityConfiguration写在一起,就像view不需求跟model写在一起一样。

苹果官方建议ActivityAttributes分为两部分:固定不变的特点(比方总数,订单号等等)和会动态改变的特点(比方配送员名称,配送时间等等)。官方给出的demo是披萨配送的app,咱们能够参阅它的Attributes声明规则:

struct PizzaDeliveryAttributes: ActivityAttributes {
    public typealias PizzaDeliveryStatus = ContentState
    public struct ContentState: Codable, Hashable {
        var driverName: String
        var deliveryTimer: ClosedRange<Date>
    }
    var numberOfPizzas: Int
    var totalAmount: String
    var orderNumber: String
}

其间ContentState是会动态改变的部分。在完结布局编写后,实践的工程应用当中能够调用Activity目标的各种方法对灵动岛进行操作,包含敞开,更新和封闭:

iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践



调用Activity.request成功敞开灵动岛后,将APP切到后台,就能够看到效果了,调用request以及Activity里每一个activity的update方法,都能够触发ActivityConfiguration的闭包调用,从它回掉的context能够获取到Attributes的数据内容,比方
context.state.deliveryManName和context.attributes.totalAmount:

iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践



与到家事务结合的考虑

灵动岛供给了一种全新的“告诉交互”方式,不再是单调的一个横幅或者提示框,而是一个实时显现,动态更新的UI,就像他的姓名“Live Activity”一样,是一场“直播”。

对灵动岛的适配被形象地称为“登岛”,针对到家的事务场景,咱们也做了一系列考虑,最适用的事务场景也是下单后订单状况的实时更新“直播”,而且编写了Demo展现:

iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践



灵动岛挂件

灵动岛挂件是咱们提出的另一种十分有意思的灵动岛应用。

首先,灵动岛的各项UI数据如下:

iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践



通过精确布局,能够在灵动岛上动态的展现一个会动的挂件,就像在灵动岛上养了一只心爱的宠物:

iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践



咱们会持续跟进最新的灵动岛技术动态,而且探索其他实用灵动岛的事务场景,利用这项技术带来更多的流量和利益点

本文正在参与「金石方案」