一、iOS App Extensions

App Extensions

目录

1、 Extension的种类:

  • Action Extension:动作扩展,在另一个应用程序的上下文中操作或者查看内容
  • Audio Unit Extension:音频单元扩展
  • Broadcast UI Extension:广播UI 扩展
  • Broadcast Upload Extension:广播上传扩展
  • Call Directory Extension:呼叫目录扩展
  • Content Blocker Extension:内容拦截器扩展
  • Custom Keyboard Extension:键盘扩展,例如第三方的键盘,搜狗输入法,百度输入法等。
  • iMessage Extension:消息的扩展
  • Intents Extension:Intents扩展
  • Intents UI Extension:Intents UI扩展
  • Notification Content Extension:通知内容扩展
  • Notification Service Extension:通知服务扩展
  • Photo Editing Extension:图片编辑扩展,在照片app中编辑照片或者视频
  • Share Extension:分享扩展,发布一个共享网站或者与其他应用共享内容。
  • Shared Links Extension:分享链接扩展
  • Spotlight Index Extension:Spotlight 索引扩展
  • Sticker Pack Extension:贴纸包扩展
  • Today Extension:Today扩展,可以快速获取更新或者在通知中心的近日视图中执行一项快速任务。

等等。也可直接在这里参见更多extension。

2、 App Extensions的生命周期:

这里写图片描述

1.用户选择要使用的App extension

2.系统启动App Extension

3.App Extension 代码运行

4.运行完之后系统kill掉App Extension

3、 App Extension的通信方式

这里写图片描述

这个展示的就是正在运行的App Extension、host app和containing app之间的关系。可以看出:Containing App和app Extension并没有直接的沟通。甚至有的时候Containing app可以不运行,而App Extension直接运行。Containing app和Host app没有任何的沟通。

在一个典型的request/response中,系统打开代表host app(图库)的extension(微信分享的share extension),把host app提供的数据(图片和选择的好友)输送到extension的context,然后extension展示界面,提供一些功能任务(例如微信的分享到朋友)。

还有一种是app extension可以直接和他的containing app沟通:
这里写图片描述

例如Today Widget,可以直接告诉系统打开他的Containing app,只需要调用NSExtensionContext的openURL:CompletionHandler:方法即可。

4、 在App Extension中不可以做的事情

一个app extension不能有以下情况:

1.访问sharedApplication对象。因此不能使用任何该对象的防范
2.使用任何标记NS_EXTENSION_UNAVAILABLE宏的API,或者类似的宏,或者不可用framework里面的API,例如HealthKit framework不能用于app extensions
3.iOS设备访问相机或者麦克风(iMessage app可以访问这些资源,只要在Info.plist里面进行配置使用描述即可)
4.运行一个长时间的后台任务(根据不同平台而异)
5.使用AirDrop接收数据

5、 Share Extension的简单使用

这里我们以Share Extension为例进行介绍。

5.1: 选择正确的Extension Point开始开发

当你创建app extension的时候,可以直接使用Xcode自带的模板创建你需要的Extension。点击File—>New—>Target:

这里写图片描述

从这里选择符合你需求的Extension,当你创建完毕后,你的项目工程目录就会多一个文件夹:

这里写图片描述

可以发现多了一个.swift、.storyboard和一个Info.plist。接下来你也会在Scheme里发现一个Extension,而且多了一个以.appex为后缀的Bundle

这里写图片描述

这里需要注意:
一个app extension必须在architectures build settings 里面包含arm64(ios)或者x86_64(OS X),否则containing app上架的时候将会被拒绝。Xcode默认的Standard architecture包含了64-bit的architecture。

5.2: 来看看默认的App Extension模板

从上面的项目工程目录看,每个extension都包含了一个plist文件、一个视图控制器类和一个默认的user interface,这些都是被extension point定义的。我们先来看一下Info.plist里面的东西:

这里写图片描述
这里写图片描述

两者可以进行一个对比,可以看出:
1、CFBundlePackageType不一样,项目是APPL,而Extension的是XPC!
2、比较明显的就是App Extension里面多了一个NSExtension的字典。
在Info.plist中,该文件必须包含NSExtension键和扩展点指定的键和值的字典。这里的ExtensionPointIdentifier是com.apple.share-services,因为我创建的是Share Extension。

这里注意,如果你的app extension的Info.plist里面包含了UIBackgroundModes key那么将无法通过AppStore的审核。

5.3:调试App Extension

调试App Extension很简单,你要做的就是选择(scheme)扩展,然后点击Run, 就会弹出一个弹框让你选择Host app,选择Host app之后便可以运行调试。比如你调试Share Extension,你可以选择照片,然后让照片当Host app,然后运行之后就会打开照片,选择分享就会看到你的app扩展,然后进行debug断点处理等。

6、 Share Extension Demo

先看一下我自己做的分享Demo效果:
这里写图片描述
这里写图片描述
然后在containing app里面查看分享的图片:如上图的第三张图。先看一下这里默认创建的Share Extension的视图控制器:

class ShareViewController: SLComposeServiceViewController {
    override func isContentValid() -> Bool {
        // Do validation of contentText and/or NSExtensionContext attachments here
        return true
    }
    override func didSelectPost() {
        // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments.

        // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context.
        self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
    }
    override func configurationItems() -> [Any]! {
        // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
        return []
    }
}

里面主要有三个方法:

isContentValid是用来判断内容是否可用的,这里可以做一些校验,比如我们分享的内容是否符合要分享的要求,如果返回false,那么在上图的Post按钮就无法点击了。因为一旦返回false,则说明分享内容不符合要求,也就无法Post了。

configuration是一个配置数组,它可以配置多个列表,例如微信分享的[发送给朋友,分享到朋友圈,收藏]:
这里写图片描述

didSelectPost是你点击发送之后处理的事件,比如微信的点击收藏,可以调用微信的api,然后进行收藏。默认的注释也说明了本方法的作用:

当用户选中post之后调用。是对内容或者NSExtensionContext附件的上传。我这里使用App Group的方式进行app Extension和containing app进行交互。先将内容存储到UserDefaults,然后再在containing app里面取出图片展示到containing app里面。

这里写图片描述
这里我把图片存储到了UserDefaults,然后在Containing app里面获取:这里写图片描述
suite的name是app group的名称。具体可参见Github源码里的ShareExtension。

总结

App Extension的出现使App的使用更加方便,比如系统的天气widget,还有类似微信(QQ)的分享,完全可以实现不打开containing app而直接使用share extension分享。

参考资料

1、App Extension Programming Guide

2、深入App Extensions for iOS8

3、Information property List Key Reference

4、App Extension Programming Guide—Share

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值