JS技术

Photo Editing Extension 详解 (附带应用滤镜Demo) - Colin丶 - 博客频道 - CS

字号+ 作者:H5之家 来源:H5之家 2015-12-14 16:09 我要评论( )

Android应用中菜单(Menu)的位置显示问题

extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制。允许应用帮助系统扩展自定义功能,去实现一个特定作用域的任务,如照片编辑、自定义键盘、通知中心、Action动作、Share分享等。 这对于一向封闭的iOS来说, 无疑是一大福音。

虽然iOS8离现在比较远了, 分享 “Extension “ 相关的文章也很多了, 不过对于“Photo Editing”, 我觉得还是有必要来讲一讲的, 一来多数教程介绍Extension 的时候都是拿Widgets举例, 再有Photo Editing是可自定义内容最丰富的一个, 你完全可以把它当作App里额外的一个界面来完成。

正好前一阵在实习的时候, 实现过相关功能, 总结一番也是极好。

1. 相关概念 1.1 Extension Point

系统中支持Extension 的区域,Extension 的类别也是据此区分的,iOS上共有Today、Share、Action、Photo Editing、Storage Provider、Custom keyboard几种,其中Today中的extension又被称为Widget。

由于每个扩展点都有与之相关的使用策略和专门的API,开发人员必须为他们想要提供的那种功能选择恰当的扩展点, 每种Extension Point的使用方式和适合干的活都不一样,因此不存在通用的Extension 。

例如,在默认情况下,键盘Extension“不能访问网络,而且不能与其包含应用程序共享同一容器”。通过对Extension进行恰当的配置,这样的限制可以移除,但开发人员仍然需要遵守苹果应用商店审查指南和iOS开发者计划许可协议中的具体的网络键盘指南。

Extension Point

1.2 App Extension

即为本文所说的Extension。Extension并不是一个独立的app,它有一个包含在App Bundle中的独立Bundle,Extension的Bundle后缀名是.appex。其生命周期也和普通App不同,这些后文将会详述。

Extension不能单独存在,必须有一个包含它的Containing App。

另外,Extension需要用户手动激活,不同的Extension激活方式也不同。

比如:

1.3 Containing App

尽管苹果开放了Extension,但是在iOS中Extension并不能单独存在,要想提交到AppStore,必须将Extension包含在一个app中提交,并且App的实现部分不能为空, 这个包含Extension的App就叫Containing App。

Extension会随着Containing App的安装而安装,同时随着Containing App的卸载而卸载。

1.4 Host App

能够调起Extension的App被称为Host App。

比如:

  • widget的Host App就是Today。
  • Photo Editing 的 Host App 就是 Photos
  • 2. Extension和Containing App、Host App通信 2.1 Extension和Host App

    Extension和Host App之间可以通过extensionContext属性直接通信,该属性是新增加的UIViewController类别:

    @interface UIViewController(NSExtensionAdditions) <NSExtensionRequestHandling> // Returns the extension context. Also acts as a convenience method for a view controller to check if it participating in an extension request. @property (nonatomic,readonly,retain) NSExtensionContext *extensionContext NS_AVAILABLE_IOS(8_0); @end

    实际上extension和Host App之间是通过IPC(interprocess communication)实现的,只是苹果把调用接口高度抽象了,我们并不需要关注那么底层的东西。

    2.2 Containing App和Host App

    他们之间没有任何直接关系,也从来不需要通信。

    2.3 Extension和Containing App

    这二者之间的关系最复杂,纠纠缠缠扯不清关系。

    众所周知,每个iOS应用程序都有自己的沙箱。通过Mac苹果应用商店分发的OS X应用程序也有类似的要求,不过许多OS X应用程序是在Mac苹果应用商店之外分发的,并不需要遵守这一沙箱要求。

    沙箱是苹果iOS安全策略的基石之一。沙箱是为了限制应用程序对文件、首选项、网络资源、硬件等的访问,具体来讲,其目的是为了限制受损的应用程序可能对系统造成的损害。

    考虑到并不是所有可以用在应用程序中的API都可以用在Extension中,所以与通常的应用程序相比,App Extension运行在有更多限制的沙箱中。不能在Extension中使用的API标记为不可用宏,如NS_EXTENSIONS_UNAVAILABLE,它会在链接时导致失败。

    此外,对于Extension与其它应用程序之间的通信,苹果有几项强制规定:

    正如Ars Technica的Andrew Cunningham总结的那样,这些规则的最终结果主要是一个应用程序不能进入另一个应用程序的沙箱。这与Android相反,在Android上,内容提供程序和解析程序仍然可以一起工作来为应用程序提供对其它应用程序中数据的访问。

    不能直接通信:

    首先,尽管Extension的bundle是放在Containing App的bundle中,但是他们是两个完全独立的进程,之间不能直接通信。不过Extension可以通过openURL的方式启动Containing App(当然也能启动其它App),不过必须通过extensionContext借助host app来实现:

    //通过openURL的方式启动Containing APP - (void)openURLContainingAPP { [self.extensionContext openURL:[NSURL URLWithString:@"appextension://123"] completionHandler:^(BOOL success) { NSLog(@"open url result:%d",success); }]; }

    Extension中是无法直接使用openURL的。

    可以共享Shared Resources:

    Extension和Containing App可以共同读写一个被称为Shared Resources的存储区域,这是通过App Groups实现的,后文将会详述。

    三者间的关系可以通过官网给的两张图片形象地说明:

    Extension_Containing_App_1

    Extension_Containing_App_2

    3. 数据共享

    App Groups这是iOS8新开放的功能,在OS X上早就可用了。它主要用于同一Group下的App共享同一份读写空间,以实现数据共享。

    3.1 功能开启

    为了便于后续操作,请先确保你的开发者账号在Xcode上处于登录状态。

    3.1.1 在App中开启

    App Groups位于:

    TARGETS–>AppExtensionDemo–>Capabilities–>App Groups`

    找到以后,将App Groups右上角的开关打开,然后选择添加Groups,正规的命名规则应该是:group.com.company.app。

    添加成功以后如下图所示:

    App_Groups

    3.1.2 在Extension中开启

    开启方式和App中一样,需要注意的是必须保证这里地App Groups名称和App中的相同。

    3.2 extension和containing app数据共享

    App Groups给我们提供了同一Group内App可以共同读写的区域,可以通过以下方式实现数据共享:

    3.2.1 通过NSUserDefaults共享数据

    存数据

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • JS弹出框+地区选择代码实例

      JS弹出框+地区选择代码实例

      2014-11-16 22:20

    网友点评