iOS14 新特性探索之一:App Clips 轻应用

App Clips 是苹果 WWDC 2020 所发布的 iOS 14 新特性中最具焦点的一项功能。一经曝光,就引发了互联网上针对其特性的各种讨论。有人说 App Clips 是苹果模仿微信退出的 iOS 平台的小程序;有人说它是轻量级的应用程序,为用户提供了简洁版的 App 体验;同样,对 AppClips 的评价也是众说纷纭,有人看好也有人看跌,有人觉得是新的平台也有人觉得非常鸡肋。

无论如何,AppClips 都是 Apple 给 iPhone 用户提供了一种新的交互方式和新的应用使用体验,作为开发者,我们更需要做的是了解这样一种新的技术的应用,并将其赋能到我们的产品中,为用户提供更好的使用体验,为产品带来更大的价值。

本篇博客,也是基于这样的想法,将全面的介绍 App Clips 的应用与开发细节,帮助大家最快的了解与上手这样一种技术。我在编写本篇博客时,使用的依然是 iOS14 的 bate 版本,开发工具 Xcode 的版本也是 12.0Bate 版本,因此,不能保证后续 Apple 不会对 App Clips 的某些特性进行优化修改。如果你在之后很久的某个时间阅读到本篇博客,请有选择的借鉴与吸收。

  1. 关于 App Clips
    App Clips 用中文如何翻译,一直没有找到合适的词汇。可以叫他应用切片,也可以叫它轻应用,更可以称它为小程序,这些称呼好像都合适又好像都插那么一点感觉,我们不如就叫它 App Clips 好了。

开发一个 App Clips 的目的是提供你的 App 中的部分功能让用户可以快速使用,并且不需要下载完整的 App。这句话有两个非常重要的点,首先 App Clip 提供完整应用程序的一部分功能,这表明你一定要有一个完整功能的 App,才可以开发上线 App Clips,与 iOS 开发中其他的 Extension 类似,App Clip 也可以理解为一种 Extension,其必须由一个宿主 App 来承载。

一个 App Clip 也可以理解为是某个 App 的轻量级版本,用来提供一些完成瞬时的任务的功能,例如为一杯咖啡进行支付、使用店铺提供的优惠券、公共的信息查询等等。

App Clip 的启动需要由一个调用方调起,在 iOS 开发中,更专业点的术语叫 invocation,invocation 可以是多种形态的,例如通过点击基于位置信息的推荐 Banner,点击 Sari 的推荐或者通过扫描二维码或 NFC 等。App Clip 被 invocation 调起后,用户可以通过它完成一件专注的任务,当用户不再需要使用它时,它会自动的被 iPhone 移除,这个过程对用户来说是无感知的,因此 App Clip 也不会占用用户的桌面空间。

  1. 开发 App Clip 前的准备
    在开发 App Clip 前,你首先需要明确一个核心原则:

*** App Clips 技术一定要用在帮助用户方便启动并快速完成特定任务。***

这个原则非常重要,它是 App Clips 被提供使用的初衷,如果你提供的 App Clip 非常庞大且操作复杂,那不仅无法丧失了 App Clip 具有的“快速”优势,而且也会让用户产生困扰,造成糟糕的用户体验。换句话说,App Clips 应该是“随用随走”的,即在用户需要使用时快速启动,再用户使用完成后也立刻消失。

在开发过程中,开发一款 App Clip 与开发正常的 iOS 应用并没有特别大的差异,它与开发普通 iOS 应用有着相关的 Framework 支持,例如使用 UIKit 开发应用的界面。同样,App Clips 也可以像完整 App 一样的使用设备的硬件(当然需要申请对应的权限),例如使用相机、蓝牙等等。还有一点需要注意,一个完整的 App 只能拥有一个 App Clip,并且 App Clip 提供的功能在主 App 中也需要被完整的支持才行。

前面说过,App Clip 的启动需要由 invocation 来触发,invocation 包括如下 5 中场景:

通过 NFC 扫描来唤起
通过点击 Sari 提供的基于地理位置的推荐
在地图 App 上点击指定的链接
点击网页上的智能推荐横幅
通过 Messages App 分享的链接
唤起一个 App Clip 的过程如下图所示(来自 Apple 官方文档)

如上图,当某个 invocation 触发了 App Clip 时,系统首先会检查 invocation 关联的 URL,通过 URL 获取用来展示预览信息的数据,预览信息包括一个背景图案,描述标题与启动按钮,用户点击启动按钮后会打开 App Clip。我们可以在 App Clip 启动时拿到传递进来的 URL,通过 URL 的参数进行不同的逻辑处理。

了解了 App Clips 的启动过程,我们知道实际上在启动 App Clip 之前,系统会先弹出一个预览卡片,这个卡片上的信息可以由开发者在 iTunes Connect 上自行定义。

在着手开发 App Clips 之前,还有一些事情我们需要考虑。

A. 提供畅快的用户体验
App Clips 不会像通常的 App 那样展示一个图标在主屏幕上,用户不需要对 App Clips 进行管理,不用下载也无需删除,当指定的 App Clip 一段时间不活跃后,系统会自动对它们进行清除。因此,官方建议,App Clips 提供的功能应该是线性的,让用户一次性的完成任务。

B. App Clips 需要足够小巧
App Clips 应该足够的小巧,官方限定不可超过 10M 大小,只有足够小,在用户需要使用的时候才能以更短的时间加载与展示。

C. 检查可用的框架
在开发之前,首先要确认下 App Clips 可用的框架,大部分主 App 可用的框架在 App Clips 中都可以使用,但并不是所有,CallKit, CareKit, CloudKit, HealthKit, HomeKit, ResearchKit, SensorKit, 和 Speech 在 App Clips 中是不被支持的。

D. 保护用户隐私
由于 App Clips 会以推荐或其他广告的方式触发,因此保护用户的隐私非常重要。在 App Clips 中,隐私保护会一直被启用,例如对后台定位权限的申请,当用户同意后,次日的凌晨 4 点,这个权限会被重新关闭,如果再次启用了 App Clips,需要重新向用户申请。当然,还有一些权限在 App Clips 中是禁止获取的,其中有:运动和健身数据,音乐和多媒体文件,通讯录 / 信息 / 照片等文件。除了其宿主 App 意外,App Clips 也不可以和其他应用共享数据。

E. 思考主 App 的哪些功能是适合在 App Clip 提供的
App Clips 提供瞬时的应用体验,因此更多时候,在开发 App Clips 之前,你最先应该思考的是主 App 上的哪些功能是适合在 App Clips 上提供的。这需要从产品角度深度的思考,并真实的站在用户的角度体验。

  1. 创建一个 App Clip 程序
    前面讲了很多开发 App Clips 前的准备,现在就让我们上手创建一个 App Clip 体验一下。创建 App Clip 非常简单,首先其需要一个宿主 App,如果为已经存在的一个完全应用程序添加 App Clip,就更加容易,我们只需要新建一个 Target,选择 App Clip 即可,如下图所示:

新建了 App Clip 的 Target 后,Xcode 会自动的帮我们创建好一系列必须的文件,并做好配置。这时,直接运行 target 对应的 scheme 即可在模拟器或真机上运行 App Clip 做测试,当前,如果你运行会出现一个空白的页面,这是因为我们还没有编写任何代码。

前面说过,App Clip 的运行需要 invocation 进行调用,对于 invocation 的调用,如果用户安装了完全的主 App,则会唤起主 App 来处理用户任务,如果用户没有安装主 App,则自动调起 App Clip。无论通过哪种 invocation 来调起 App Clip,我们都需要在 App Clip 的 target 中配置指定的域权限。在 target 工程的设置页面,找到 Associated Domains 选项,在其中添加要调起 App Clip 的域名,需要找到这样的格式:appclips:xxx.com。这种配置方式与 Deep link 的逻辑基本一致。

下面,我们可以尝试向 App Clip 工程中添加一些代码。观察 App Clip 的工程目录结构,可以发现,其和正常的 App 几乎没有什么差异。如下图所示:

e
我们简单的在 ViewController 中添加一些代码,例如点击屏幕后,随机改变界面的颜色,如下:

#import “ViewController.h”

@interface ViewController ()

@end

@implementation ViewController

  • (void)viewDidLoad {
    [super viewDidLoad];
    }

  • (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self changeColor];
    }

  • (void)changeColor {
    self.view.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];
    }

@end

在开发 App Clips 时,我们应该尽量的让主 App 的代码与 App Clips 需要使用的代码共享,共享代码非常容易,将可以共享的代码保证在静态库或动态库内即可。有时候,你可能需要在共享的代码中区分环境,比如某些代码只在 target 环境下被编译,某些则只在主 App 环境下被编译。可以为 target 添加一个特殊的编译宏来区分环境,Objective-C 的工程,这个编译选项需要在 Build Settings 的 Preprocessor Macros 选项下进行配置,Swift 的工程则需要在 Active Compilation Conditions 选项下进行配置,例如我们为 target 工程添加一个 CLIP 的编译宏,如下图所示:

之后,在编写代码时,对于针对 target 的代码,就可以将其通过条件编译区分:

  • (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    #ifdef CLIP
    self.view.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];
    #endif
    }
    对于发布 App Clips 的程序,还有一点需要注意,在系统弹出预览卡片之前,首先会先通过 invocation 关联的 URL 对 App Clip 进行校验,如果校验不成功,则不会弹出预览卡片也不会打开 App Clip 程序。要成功进行验证,除了在 Xcode 工程中配置正确的 Associated Domains 外,还需要对我们的 Web 服务做一些修改。需要在服务器添加 Apple App Site Association 文件,并且添加上类似如下的配置来支持 App Clips:

{
“appclips”: {
“apps”: [“ABCED12345.com.example.MyApp.Clip”]
}

}
4. 测试 App Clips 的启动
虽然 App Clips 的启动需要由 invocation 触发,但是在开发过程中,我们依然有方法来模拟 Web 发出的 invocation 来启动 App Clip。编辑在 App Clip 对应的 scheme,在其中添加 _XCAppClipURL 这个键值来配置模拟从某个 URL 调起 App Clips,如下图所示:

当 App Clip 被调起后,我们可以通过一些回调方法来拿到 URL 信息,根据不同的信息,可以将不同的功能线展示给用户进行使用。以 UIKit 工程为例,当 App Clip 被调起时,会调用如下方法:

  • (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
    NSLog(@“%@”, userActivity);
    }
    在 UNUserAvtivity 对象中可以获取到传递的 URL 等信息。如果你的 App Clip 是可以被特殊的地理位置触发的,那么需要在 Clip 对应 target 的 info.plist 中添加 NSAppClip 键,并将其中的 NSAppClipRequestLocationConfirmation 键设置为 YES。
  1. 配置预览卡片
    在真正的启动 App Clip 之前,首先会弹出预览卡片。在提交 App Clip 时,是跟宿主 App 一起打包上传到 App Store Connect 上的,App Clip 的预览卡片配置也是在 App Store Connect 上完成,提供给开发者自由配置的地方并不多,包括 3 个方面:

配置一个头图
配置副标题并提供描述文案
配置交互按钮
6. 关于数据共享
App Clips 的和宿主 App 的数据共享并没有什么特殊的地方,其和普通 Extension Target 与宿主 App 通信的方式一样,只要创建一个 App Group,并将 App Clips 与宿主 App 放入同一个 App Group 中,之后就可以通过 NSUserDefault 来进行数据的共享。

作者:iOS 开发面试总结
链接:https://www.jianshu.com/p/9e21f54949f7
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。