一、什么是App Clip?

App Clip是一个App的轻量版,用来提供一些用户所需功能,我们可以把它看成苹果的小程序。它不需要下载就直接能打开。这样即可达到不下载完整版APP便可体验APP的部分功能,即用即走。

二、App Clip触发场景

  • 扫描NFC标签或者二维码
  • 点击来自Siri中基于位置的建议
  • 点击地图app中的链接
  • 点击网站上智能推荐应用横幅
  • 点击通过“信息”App分享的链接

三、App Clip 体验准备

开发环境:Xcode12 beta,iOS14系统

四、创建App Clip

创建App Clip的前提是必须先有一个App(没有项目则需先新建),然后在已有的App项目上新建Target:

(1)使用App Clip 模板添加一个Target:Xcode菜单项File->New->Target…

target.png

(2)输入App Clip的Product Name,选择开发相关配置,点击完成

target2.png

(3)项目结构与完整版App一致

project_arch.png

五、代码与资源复用

因为App必须包含App Clip的所有功能,所以App Clip代码应该是APP代码的子集。这样便会存在项目代码和资源的复用问题。

1、关于代码复用:
我们可以把重用代码拆分成重用组件,使用cocoapods来管理(新项目推荐使用Swift Packages)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '8.0'

def pod_Target_TestDemo
pod 'AFNetworking'
end

def pod_Target_Share
pod 'SDWebImage'
end

target 'TestDemo' do
pod_Target_TestDemo
pod_Target_Share
end

target 'TestDemoAppClip' do
pod_Target_Share
end

2、使用条件编译:
某些场景下,有些代码可能无法在App Clip的Target中使用:
(1)Objective-C中,我们可以通过在App Clip Target的Build Settings中找到Preprocessor Macros,新增APPCLIP项:

build_settings1.png

在代码中使用:

1
2
3
4
5
6

#ifndef APPCLIP
NSLog(@"this is not App Clip!");
#else
NSLog(@"this is App Clip!");
#endif

(2)Swift中,我们可以通过在App Clip Target的Build Settings中找到Active Compilation Conditions,新增APPCLIP项:

build_settings2.png

在代码中使用:

1
2
3
4
5
6

#if !APPCLIP
print("this is not App Clip!")
#else
print("this is App Clip!")
#endif

3、关于图片资源复用:
我们可以添加一个新的Asset Catalog作为一个共享的assets,然后在完整版App和App Clip中共用这些资源。

share_assets.png

六、App Clip访问调用URL

当用户启动一个App Clip,App Clip相关联的生命周期方法将被调用,我们会接收到一个NSUserActivity对象,后续便可通过访问这个NSUserActivity对象来处理任何状态和数据。

不同UI框架的生命周期方法需实现的回调方法不一致:

1、基于SwiftUI的App Clip和完整版App,需实现:

onContinueUserActivity(:perform:)

2、基于UIKit 的App Clip和完整版App
(1)生命周期事件定义在UISceneDelegate中,需实现:

scene:continueUserActivity:

(2)生命周期事件定义在UIApplicationDelegate中,需实现:

application:continueUserActivity:restorationHandler:

注意:完整版App必须处理App Clip所需处理的全部调用。启动时,需确保调用类型为NSUserActivityTypeBrowsingWeb,然后再访问已启动App Clip的URL。

七、App Clip有哪些限制?

  • 大小限制:不能超过10MB。

  • 一个App有且只能有一个App Clip,且App的功能必须包含一个App Clip中的所有功能。

  • App Clip无法把数据存储到keychain来共享给完整版App,数据共用只能通过一个共享的app container 或者 user defaults ,注意不要在app container或user defaults中存储用户敏感信息。

  • App Clip不可用的frameworks:CallKit、CareKit、CloudKit、HealthKit、HomeKit、ResearchKit、SensorKit、 Speech。

  • App Clip无法获取到设备名([UIDevice name])和广告标识符(identifierForVendor),其对应的API会返回空串。

  • App Clip不能执行后台任务:例如,在App Clip不使用时,用NSURLSession进行后台联网或保持蓝牙连接。

  • App Clip的通知和定位权限是免申请,用户可以主动关闭:通知在8小时内有效,位置只能获取一次,第二天凌晨4点会自动重置。如需重度使用,可通过弹窗申请。

  • App Clip无法访问以下数据:

    运动和健身数据
    
    苹果音乐和媒体
    
    联系人,文件,消息,提醒和照片等应用数据
    

八、App Clip需注意的地方

1、 App Clip不会显示在用户主屏幕上,且用户不能像管理完整版App一样管理App Clip,如果App Clip在一段时间内不活跃,系统会自动从设备中清理掉对应的App Clip。

2、App Clip应避免复杂的界面元素,如TabBar或复杂的表单,为了降低技术的复杂性,推荐使用Apple Pay和Sign in with Apple。

3、App Clip会给完整版App保留以下功能:

(1)高级网络功能(如Bonjour)或本地Wi-Fi网络配置

(2)App extensions

(3)自定义和设置:如创建一个settings bundle

(4)数据移交和打开文档

(5)内购和支付卡配置

(6)低级Unix功能如:BSD通知

(7)iPad上的分屏

(8)自定义URL schemes的注册

(9)使用StoreKit的requestReview(in:)方法请求用户对该应用进行评论

(10)搜索配对的蓝牙设备

九、对于App Clip的一些疑问

1、App Clip必须在iOS14上,推荐使用Swift开发。

2、关于数据共享问题:
App Clip与主App通信方式和普通Extension Target一致,添加App Groups,把App Clip和主App放到同一个App Groups中就能访问user defaults数据。

3、如果App Clip需要展示广告或者推荐其他APP,我们应该怎么做?
使用 SKOverlay或者SKStoreProductViewController。

由于目前没法配置App Clip测试,关于App Clip配置部分建议看苹果官方文档,后续实际开发再补充。

此文仅供学习交流,转载请注明出处!

iOS App Clips学习笔记:https://www.yangshebing.com/2020/07/12/iOS-App-Clips%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/