原创

探索 App Clips

◆ 

简介

iOS14中苹果推出了很多新特性,其中就包含App ClipsApp Clips类似微信的小程序,不需要显式的去App Store里下载,苹果会在对应的时机进行下载。App Clips可以在不打开主App的情况下,单独进行使用,交互操作和主App无异,例如登录、列表视图、支付等。

为了保证加载速度,苹果对App Clips的安装包大小有限制,从产品设计的角度,就要聚焦核心功能,这也是苹果所推荐的。

由于公司打算做App Clips,所以有了这篇文章,文章中的内容基本上能保证准确性,并且其中很多技术点是和苹果开发者沟通过的。

◆ 

使用流程

通过Safari BanneriMessage等如下方式,可以打开App Clips。例如点击Safari Banner调起App Clips,调起时会带一个URL过来,系统会根据调用URL来确定卡片显示的数据,随后将数据例如标题、背景图等显示在App Clips的卡片页。

主标题下方有几行小字,可以选择是否开启通知、定位等权限,这些权限都是临时性或受限制的,可以点击蓝字进去将权限关闭,否则默认权限是打开的。点击Open即可进入App Clips中,并且将URL传给App Clips

◆ 

开发

App ClipsiOS14开始支持,所以可以直接用SwiftUI进行开发,这也是苹果所推荐的开发形式。

◆ 

调起

App Clips以主工程的一个target的形式存在于项目中,与主工程共享代码及资源文件。App Clips可以访问蓝牙、NFC等硬件,相当于一个smart app。主App和App Clips是互斥的,下载主App后App Clips就会被删除,所以如果有主App则调起客户端,没有客户端则调起App Clips

App Clips是通过URL的方式调起的,可以直接使用配置的URL,也可以在其后面拼接路径和参数,和我们使用的请求URL类似。从外部调起的时候就会传入一个URL过来,App Clips进行解析以调起对应的页面。

有一点需要了解的是,在WWDC2020中,苹果演示的是一个类似于微信小程序二维码那样的异形码。经过和苹果开发者沟通,并不强制要求用异形码,二维码就可以,主要是承载URL即可。

◆ 

二进制下载

对于App Clips二进制的下载有两种情况,一种是手机解锁的情况下,系统会在卡片页展示过程中就开启后台下载,点击Open按钮即可打开App Clips。如果当时二进制还未现在完,则会出现系统的loading页面,loading完成后即可打开App Clips

如果调起App Clips时手机处于锁屏状态,在卡片页不会开启后台下载,当用户点击Open后才会开始下载并展示loading页面。

下载后的App Clips,三十天内未使用则会被删除二进制,下次使用将重新下载。这个卡片页无论是否安装App都会显示,区别在于打开的是主App还是App ClipsClip Card只会显示一次,如果App Clips二进制没有被删除的话,之后就不会再重复显示。[563513413](https://jq.qq.com/?_wv=1027&k=lzJejkSl),不管你是大牛还是小白都欢迎入驻

◆ 

Apple Connect配置

每个应用程序只能有一个App Clips,但可以有多个配置,可以定义标题、副标题、封面图(有大小限制)、按钮类型(action),标题默认和App名一样。每个App Clips可以配置多个URL,苹果推荐不同功能模块,对应不同的URL。也可以只配置一个URL,后面通过拼接路径和参数的方式来区分和传值。原则上来说,URL的数量没有限制。

配置App Clips时可以选择高级设置,在高级设置中可以多套标题和封面图。苹果会根据配置的URL作区分,显示不同的封面图。

◆ 

客户端配置

在主工程中新建一个target并选择为App Clips,并且关联到我们的主工程Fruta即可。因为App Clips是从iOS14推出的,而SwiftUI是从iOS13推出的,所以我们可以选择使用SwiftUI进行开发,这也是苹果推荐的开发方案,当然也可以选择UIKit的方式。

创建App Clips后,系统会生成对应的iOSClip.entitlements文件,需要在里面设置App GroupParent IdentifierAssociated Domains,以关联主App。我们填写应用程序标示符时,苹果推荐以{App Bundle id}+Clip的格式命名,这种命名也更清晰一些。

◆ 

客户端代码

客户端进行开发时,无论采用UIKit还是SwiftUI,都是通过NSUserActivityApp Clips传入的URL做解析处理,并根据URL处理不同的业务逻辑,这块和 Unversal Link的处理有点类似。对于URL的处理,使用UIKitSwiftUI的处理方式不同,如果是UIKit则采用下面的方法处理URL传参。

UIKit通过UIScene的代理方法接收回调,例如下面的方式。

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb else { return }
    guard let url = userActivity.webpageURL else { return }

    presentExperience(for: url)
}

func presentExperience(for url: URL) {
    // Route user to the appropriate place in your App Clip.
}复制代码

SwiftUI的处理方式需要注册一个NSUserActivityTypeBrowsingWeb类型的userActivity,并在回调方法中解析webpageURL即可。因为如果安装主App后,这个操作就要交由主App来处理,所以主App也需要有相同的处理代码。

struct FrutaAppClip: App {
    var body: some Scene {
        WindowGroup {
            NavigationView {
                SmoothieMenu()
            }
            .onContinueUserActivity(NSUserActivityTypeBrowsingWeb, perform: handleUserActivity)
        }
    }
    
    func handleUserActivity(_ userActivity: NSUserActivity) {
        guard
            let incomingURL = userActivity.webpageURL,
            let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true),
            let queryItems = components.queryItems
        else {
            return
        }
    }
}复制代码

◆ 

服务端开发

在打开App Clips之前,苹果会验证配置信息,验证方式是苹果请求公司服务器,公司服务器返回给苹果一个JSON格式的配置文件,App ClipsJSONUniversal Link的格式差不多。苹果要求设置的请求地址必须是https协议,并且不能进行重定向。这里的appIDs指的是App Clips配置的bundle id

下面是App Clips服务端配置JSON的示例,做过Universal Link开发的同学,对下面的JSON应该比较熟悉。

{
  "applinks": {
      "details": [
           {
             "appIDs": [ "ABCDE12345.com.example.app", "ABCDE12345.com.example.app2" ],
             "components": [
               {
                  "#": "no_universal_links",
                  "exclude": true,
                  "comment": "Matches any URL whose fragment equals no_universal_links and instructs the system not to open it as a universal link"
               },
             ]
           }
       ]
   },
   "webcredentials": {
      "apps": [ "ABCDE12345.com.example.app" ]
   }
}复制代码

◆ 

数据共享

需要了解的是,App Clips和主App是互斥的,当主App安装后,就会删除App Clips。二者的数据共享主要是沙盒的数据迁移,所以在安装主App后就需要从App Clips读取数据。

App Clips和主App同步数据时,将二者的group id设置成相同的即可,例如之前的iWatch Extension也有类似功能。这个App Group是需要在苹果后台创建的,如果没有创建则需要进入开发者中心的Groups选项,创建的对应的group id

不同target或应用间访问沙盒很简单,可以通过NSUserDefaults并传入对应的group的方式创建userDefaults对象,可以对keyvalue进行操作。

NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.company.appGroupName"];复制代码

还可以通过containerURLForSecurityApplicationGroupIdentifier方法获取到沙盒路径,随后对文件进行操作。

NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:APP_GROUP_ID];
NSURL *directoryPath = [containerURL URLByAppendingPathComponent:GroupShareRelativeDirectory];复制代码

◆ 

授权

App Clips的设计初衷就是简单并聚焦核心功能,所以对于一些应用功能权限也和普通App有区别。例如在使用定位功能时,App Clips不需要用户的完整授权,可以请求“部分授权”,用户可以在卡片页选择是否关闭,就是卡片页下方蓝色按钮。

通知也是一样的,不需要向用户申请授权,可以请求“部分授权”,选项也是默认打开的,在卡片页可以关闭。App Clips的通知在通知中心显示时,和普通通知看起来是一样的,但“部分授权”有效期八小时,正常弹窗授权有效期一周,我们也可以选择请求用户授权普通通知。

App Clips中设置“部分授权”,在App Clipsinfo.plist配置中,通过NSAppClipRequestEphemeralUserNotification字段设置开启通知,如果设置此字段后默认为开启,但用户可以点击options关闭通知。定位也是一样的,字段为NSAppClipRequestLocationConfirmation

◆ 

代码差异

在开发App Clips过程中,由于二者大多数使用的都是同一份代码,有些代码可能与主程序有差异,并不能运行到主程序或App Clips上。可以通过在Active Compilation Conditions设置对应的环境变量,来区分不同的target

判断代码如下。

#if !APPCLIP
// Code you don't want to use in your app clip.
#else
// Code your app clip may access.
#endif复制代码

◆ 

应用推荐

可以在App Clips的下方显示一个叠层,来推荐用户下载我们的App,通过SKOverlay来进行配置。

func displayOverlay() {
    guard let scene = view.window?.windowScene else { return }

    let config = SKOverlay.AppClipConfiguration(position: .bottom)
    let overlay = SKOverlay(configuration: config)
    overlay.present(in: scene)
}复制代码

◆ 

本地测试

进行本地测试时,可以将在Apple Connect中配置的要测试的URL,配置在App Clips的环境变量中,并以_XCAppClipURL进行命名来测试,记得将其勾选。

这里的域名需要和Associated Domains一致。

◆ 

注意点

  1. 下面这些库在App Clips不支持,编译时并不会报错,但调用时会出现调用无效等问题。CallKitCareKitCloudKitHealthKitHomeKitResearchKitSensorKitSpeech
  2. 为了保护用户隐私,在App Clips中下面的API禁止使用。通讯录、Files、相册、iTunes。
  3. App Clips无法进行后台活动,目前看主要是后台网络请求。

◆ 

审核

App Clips是作为应用程序的一部分参与审核的,所以需要随客户端版本上线。虽然App Clips和主App在一个project中,但并不占用主App的包体积。

但是对于App Clips的审核标准,经过和苹果开发者团队的沟通,截止目前还未有审核标准发出,估计要等iOS14出来应该就会有审核标准出来。

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

登录 后参与评论
0 条评论

相关文章

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

            App Clips是苹果WWDC 2020所发布的iOS 14新特性中最具焦点的一项功能。一经曝光,就引发了互联网上针对其特性的各种讨论。有人说...

    珲少
  • App Clips - NFC 触发的使用

    App Clip的触发中有NFC触发的逻辑,但是官网确没有写要怎么配置NFC,使用什么配置?

    莫空9081
  • App Clips —— 轻应用码的开发

    把Environment Variabless中_XCAppClipURL前面勾选中,然后把后面Value中https://example.com改为自己的链接...

    莫空9081
  • 苹果小程序App Clips技术解析和展望

    北京时间2020年6月23日,苹果在一年一度的WWDC上正式宣布了苹果官方“小程序” App Clips。本文带你来了解App Clips,分析其优缺点,并对前...

    nimomeng
  • iOS新闻类App内容页技术探索

    据相关数据显示,截至2017年底,中国手机新闻客户端用户规模达到6.36亿人,移动App已经成为新闻和内容传播的最重要途径之一。而伴随着行业的竞争和发展,App...

    编程怪才-凌雨画
  • Matlab简单制图功能探索(简单APP制作)

    云深无际
  • OC底层探索26-App启动时间优化OC底层探索26-App启动时间优化

    想要优化启动时间,就需要要知道启动时app都做了什么?通过添加环境变量可以打印出APP的启动时间分析(Edit Scheme -> Run -> Argumen...

    用户8893176
  • app直播源码“助力”直播架构,走上探索之路

    对于直播app的开发来讲,app直播源码是一个非常重要的存在。直播架构在开发过程中也是一件非常重要的事情,如果架构的设立不能从根本上解决问题或防止问题的发生,那...

    肉2466131704
  • 【实战篇】APP渠道归因最佳实践探索

    引言:作者结合丰富实战工作经验,亲笔撰文分享了在APP渠道归因中监测厂商的4种常见解决方案。

    iCDO互联网数据官
  • 探索IOS App的生命周期之启动篇

    因为刚刚涉入IOS APP开发,对IOS应用的使用的生命周期不是很熟,所以写下此日志,以防时间一长又忘记了。

    江中散人_Jun
  • 京东金融App合规治理的探索与实践

    Tech 导读 随着国家对用户隐私信息保护越来越严格,相关的法规、政策、标准相继落地,为了更好的保护用户隐私信息,市场与平台运营中心本着合规安全无小事的原则,在...

    京东技术
  • 一次移动记账 App 的设计探索 - 腾讯ISUX

    腾讯ISUX
  • 干货 | 携程 Trip.com App 首页动态化探索

    通过梳理场景和边界使得目标清晰。我们需要一个跨平台支持动态性并且高性能 UI 渲染框架。

    携程技术
  • SuperSocket入门(二)- 探索AppServer、AppSession,Conmmand和App.config

    在上一篇文章中,我们已经了解到了如何在SuperSocket处理客户端请求。 同时我们可能会发现一个问题,如果我们的服务器端包含有很多复杂的业务逻辑...

    黄昏前黎明后
  • App自动化测试探索(一)借助Appium实现APP的自动化测试

    从同时支持Android / iOS这个条件来看, 只有Appium和Calabash能胜任, 但Appium作为后起之秀比Calabash要更为优秀一些

    周希
  • 苹果Clips这个神剪辑软件,我们抢先体验了一把

    现在各种视频、直播节目这么火,你如果还没用手机拍过视频,那真是对不起手机上越来越威武的拍照镜头了。

    疯狂的技术宅
  • 干货 | 携程APP Native/RN内嵌Flutter UI混合开发实践和探索

    随着各种多端技术的蓬勃发展,如今的移动端和前端早已不再拘泥于自身的边界,而是不断延伸、扩展和融合,逐步向着真正的大前端技术迈进。跨端技术也从早期的Cordova...

    携程技术
  • iOS14新特性探索之二:App Widget小组件应用

            iOS 14除了引入了亮眼的App Clips功能外。还有一个也非常惹争议的功能就是App Widget。App Widget可以理解为小组件,...

    珲少

扫码关注腾讯云开发者

领取腾讯云代金券