iOS App Extension程序员iOS应用框架

App extension 总结

2018-04-12  本文已影响379人  小东邪啊

一. 基本知识

1. 定义

简单的说,App Extension 可以让开发者们拓展自定义的功能和内容到应用程序之外,并在用户与其他应用程序或系统交互时提供给用户。

2. 用途

你可以创建一个app extension通过打开一个特殊的开关。例如

app extension Demo app extension Demo

3. 类型

extension point : 启用扩展的区域称为扩展点,也就是每一个具有特定功能具体的extension。

每个扩展点提供了使用说明和API为开发者去创建一个app extension.

下表是苹果官方提供的所有Extension point列表

Extension point

4.本质

每一个extension都是一个独立的二进制文件,它独立于用于发布它的应用程序。我们必须使用一个app去包含并且发布你的extension。

二. 主要概念区别 --- 重点必读

host app : 我们可以把它理解为宿主的App,能够调起extension的app被称为host app,比如:Safari app 里面网页分享到微信, Safari就是 host app ; widget的host app就是Today。

Xcode Target 介绍

三. App Extension 工作原理

1. 本质

app extension不是一个app, 它是为了实现了一个特定的的任务,不同的extension point定义了不同的任务。

2. 生命周期 (Life Cycle)

因为app extension不是一个app,它的生命周期和app是不同的,在大多情况下,当用户从app的UI上或者其他活动视图控制器中选择开启extension功能的选项时将会开始执行。

例如,当用户从Host app 中选择一张图片然后长按图片点击分享按钮,用户可以从可分享的列表中进行选择,选择后将会完成分享的动作,此时分享的extension将会结束。

app_extensions_lifecycle

四. App Extension 如何和 App 通讯

1. 简单交互

simple_communication

2. 具体交互

正如下图的读写箭头所示,任意一个app extension和它的containing app能够在一个私有的shared container中分享数据。下图展示了containing app , app extension 和 host app之间完整的交互方式。

detailed_communication

注意:系统使用进程间通信来确保host app和app extension可以一起工作从而实现一个完整的体验。在你的代码中,你不必考虑它们之间潜在的通信规则,因为你使用了extension point 和 系统提供的上层API。

五. App Extensions 不可用的API

app extension不能够像containing app一样直接进行一些动作,它包括如下:

六. 创建App Extension

1. 选择Extension Point

每个extension point都针对一个特定的用户场景。你的第一步是选择支持你计划交付功能的extension point.这个选择将决定你你能够使用哪些API以及在特定情景下API的使用方式。

在iOS 和 OS X 中支持extension points, NSExtensionPointIdentifier中描述了它们的info.plist 中extension point中标识符的key.

2. 在Xcode项目中新建target

为你需要使用的app extension 选择一个合适的extension point, 之后需要添加一个新的target在你的containing app中。使用Xcode template是最简单的方式来添加一个app extension为你的extension point提供预先配置好的target。

Create extension1 Create extension

3. 具体步骤

4. 注意:

七. 检查App extension默认模板

1. 模板结构

每个app extension模板都包含一些配置文件如Info.plist,一个view controller class和一个默认的user interface,所有的这些将都由extension point定义。默认的view controller class可以包含你要实现的extension point方法。

2. Info.plist介绍

app extension target的Info.plist文件可以标识extension point,并制定extension的详细信息。这个文件至少要包含NSExtension这个key和这个extension point指定的含有键值对的字典。例如,NSExtensionPointIdentifier key将需要一个值来展示extension point反向DNS的名字,例如com.apple.widget-extension。下面列举了一些在NSExtension字典中的键值对。

3. 其他设置

除了plist文件中的设置,默认情况下,模板可能会设置一些功能。每个extension point能够定义capabilities使extension point支持的任务类型变得有意义。例如,iOS 文档Provider extension包含com.apple.security.application-groups entitlement.

OS X app extension 所有的模板将默认包含App Sandbox 和 com.apple.security.files.user-selected.read-only entitlements。如果需要去做一些其他事情例如访问网络或者访问照片,联系人等信息时你需要定义额外的capabilities对于extension。

八. 响应 Host App 的请求

1. 触发

在用户接受一个带有host app请求的app extension时app extension将被打开。app extension在收到请求后会打开帮助用户执行特定任务,具体是完成或者取消任务取决于用户在UI界面上的动作。例如,Share Extension收到一个host app请求之后通过弹出一个分享的view作为响应。用户将可以通过这个View上选择分享的目标或者是取消本次分享。

当一个host app发送一个请求给app extension,它将指定一个extension context.对于大部分extensions,context最重要的部分是在extension中设置用户想要的items工作。例如,OS X Share extension 的 context可能包含一个用户想要发送的文本选择信息。

2. 步骤

3.注意

九. 性能优化

1. 设计简洁的UI

用户感觉灵活轻便。设计您的extension,以便在一秒钟内完成目标。启动速度过慢的扩展由系统终止。

原则:简单,集中完成一个单一的任务。

注意:extension 的图标要与app保持一致。

2. 内存

运行extension的内存限制远小于前台应用程序的内存限制。在这两个平台上,系统可能会主动终止extension,因为用户希望返回主机应用程序中的host app。某些extension可能比其他extension的内存限制更低,例如widgets必须特别高效,因为用户可能同时打开多个widgets。

3. 运行

app extension 一旦开启后是一条独立的进程,不在containing app 主运行循环中,如果extension的回调在主运行循环,它可能有一个较差的用户体验在另一个extension或app.

注意:app才是系统资源的主要使用者,extension只是辅助。

十. iOS App extension 测试

1. Debug, Profile, and Test Your App Extension

2.注意

十一. 过审须知

1. 发布App时为了过审,containing app必须提供基本功能给用户,同时不能只有app extensions.

2.为了过审,无论你为containing app选择哪种目标设备系列,都必须为您的应用扩展程序指定“iPhone / iPad”(有时称为universal)作为目标设备系列。

十二. 处理常见场景

1. 打包包含extension代码Framework

我们可以创建一个framework在containing app 和app extension之间共享代码。

当配置Xcode的project时,在Copy Files build phase中你必须选择“Frameworks”作为destination在你的framework中。

Deploying a Containing App to Older Versions of iOS

Building Modern Frameworks

2. Containing App中分享数据

关系

app extension 和 containing app 之间不能直接访问彼此的存储数据的容器。

但我们可以共享数据。

注意:app extension 的target工程不可以直接访问应用程序沙盒。

共享数据

为了使用数据共享功能,我们需要在当前Target设置中的Capabilities中,打开App Group开关,并且在apple developer中创建APP Group,并向我们当前target和containing app的app id中打开并配置app group功能。
Adding an App to an App Group

配置成功后,app extension和containing app可以使用 NSUserDefaults API共享一个容器来同步需要交互的数据。我们可以使用下面的API

// Create and share access to an NSUserDefaults object
NSUserDefaults *mySharedDefaults = [[NSUserDefaults alloc] initWithSuiteName: @"com.example.domain.MyShareExtension"];
 
// Use the shared user defaults object to update the user account
[mySharedDefaults setObject:@"Hello World!" forKey:@"小东邪"];

[shared synchronize]; 

可以通过下面的方法从shared container中读取存入的数据。

- (NSString *)readDataFromNSUserDefaults { 
    NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.wangzz"]; 

    NSString *value = [shared valueForKey:@"小东邪"]; 

 return value; 
} 

下图展示了containing app , extension 与shared container之间的关系。

share container

注意:当我们建立好一个共享容器时,containing app 和 每个app extension 都具有对容器读写的权限,所以我们必须要考虑数据同步的问题。

3. 访问网页

在Share extension 和 Action extension(仅iOS)中,可以让用户访问web内容通过请求Safari运行JavaScript文件并将结果返回到扩展名。

4. 执行上传和下载

5. 声明支持的数据类型

6. 将Containing app 部署到老版本的应用中

3-6的具体步骤可参考苹果官方文档

总结:本文是我在阅读APP官方文档后将官方文档中不易理解的一些东西图形化并针对例如app,extension,host app, containing app等混淆概念统一对比,更易于理解,在做每一种具体的extension中肯定会遇到不同的问题,所以整体先了解extension的工作原理及注意点还是十分必要的,关于更多内容请参考苹果官方文档

上一篇下一篇

猜你喜欢

热点阅读