APP Extension

1 10月

开发好APP,可以开发一些Extension,作为功能的扩展被其他APP调用。一个APP可以有多个Extension,例如share功能,Today功能等,用户可以在APP或Settings中开启和关闭功能。

Extension作为Target拥有自己独立的运行和存储空间和生命周期,但并不是说Extension可以独立于APP存在,它不能单独存在,被包括在了我们上传的APP文件中,一旦用户安装了APP就同时安装了所有的Extension。但在运行时Extension是作为独立的二进制文件被运行的,和主APP无关。

包括Extension的主APP被称为Container APP,而其他使用Extension的APP被称为Host APP。流程关系如图:

上图中就能看出Extension虽然打包发布时是Container APP的一部分,但Extension运行时,和Container APP是分别独立运行的。Extension和Container APP要数据共享或通信时,就像两个不同APP间通信一样。Host APP的主要责任就是调用Extension,并提供UI展示。

Extension的生命周期如图:当Container APP调用Extension时,被唤起。等它完成它的功能后,系统就将它kill掉。全程和Container APP无关,Container APP是活着还是休眠还是被kill掉了,都和Extension无关。

创建Extension:File->New->Target,系统为我们提供了很多Extension,例如选择Today Extension

创建好之后,在工程中就能看到主APP和Extension是不同的Target:

在工程里根据业务需求修改完Extension目录里的代码,正常编译就行。例如点击唤起主APP:

- (void)_openMainApp {
    // 用url Scheme的方式唤起APP,但Extension提供了extensionContext,内含openURL方法,可以直接用
    [self.extensionContext openURL:[NSURL URLWithString:@"myTestApp://"] completionHandler:^(BOOL success) {
        
    }];
}

例如复用主APP已有的业务逻辑,可以将这些复用的代码打包成Framework并加入主APP后,Extension里就能使用了:

#import <TencentOpenApi/QQApiInterface.h>

如果出现找不到,说明Framework未link到Extension上,可以在Framework的右侧属性面板上勾上:

需要注意的是,因为Extension和Container APP是独立运行,独立存储的,所以Extension的业务代码里:

  • 不能使用标记为NS_EXTENSION_UNAVAILABLE的宏的方法,例如[UIApplication sharedApplication]。
  • 不能直接访问Container APP的沙盒空间,只能通过App Groups建立组来进行组内数据共享。

发表评论

电子邮件地址不会被公开。 必填项已用*标注