iOS - App Extension(Share Extension和Action Extension)

3,371 阅读3分钟

App Extension是iOS8以后苹果官方引入的一个新特性。Extension并不是一个单独的App,他是在你原有App上的一个扩展。个人因为项目需求需要,弄了Share Extension和Action Extension两方面的扩展,今天跟大家分享一下,第一次写文章,如果有什么问题,请大家指出。大佬勿喷!

Share Extension主要用于将Host应用中的内容分享到Container应用中,而Action Extension则主要用于将Host应用中的内容进行对应处理,原则上来说作用范围比Share Extension要广。这两个扩展都可以从宿主App(就是能够调起扩展的App)把东西共享到容器App(支持扩展的App,比如图上的message)

App Extension的创建 选择自己需要的AppExtension 这里直接选Activate就行,这个时候你的项目里面就会有一个share文件出现
然后我们直接运行extension的项目,就会叫你选择宿主App。我们选个safari

好了,简单的配置就完了,而Action Extension的操作跟Share Extension的操作差不多。
然后就到了我们去配置share文件夹下的plist文件了 其实最主要的就是plist文件夹下的NSExtension描述字段
NSExtensionPointIdentifier,扩展标识,在分享扩展中为:com.apple.share-services,而在Action Extension中为,com.apple.ui-services或com.apple.services分别对应有UI和没UI的。
激活扩展的规则。默认为字符串“TRUEPREDICATE”,表示在分享菜单中一直显示该扩展。可以将类型改为Dictionary类型,然后添加字段,由于我的项目支持图片,文字和视频就添加
NSExtensionActivationSupportsText (BOOL类型)
NSExtensionActivationSupportsImageWithMaxCount (NSNumber类型)
NSExtensionActivationSupportsMovieWithMaxCount (NSNumber类型)

后面的一些ShareVC和Action的解析,还有跟我们的容器App共享数据的操作,需要通过苹果的AppGroup服务,在俊华博客上也有很详细的讲解(偷懒ing)。我下面就说几个注意,还有自己踩过的坑吧!

主要是Action Extension方面的
第一个,不知道那个版本开始,在TARGETS的GENEGENERAL上就已经不知道添加icons,要去build settings搜icon添加

第二个,在模拟器上build扩展项目才能下断点去debug调试,如果真机的话,应该是进不去扩展项目的断点debug的。

第三个,我个人是用NSFileManager和NSUserdefault去存extension中的数据到group的,然后再在我的主App拿数据,然后用NSUserdefault去处理文字是没问题的,但到了NSFileManager去处理图片和视频的时候就出现问题了,因为我直接加载他的URL是加载不出来东西的,NSData去把数据拉出来,然后如果是image就直接imageWithData咯。如果是视频就要再把data转成文件,存入document目录后,用新文件的url才能加载出来。

-(NSString *)createFileWithName:(NSString *)fileName withData:(NSData *)data{
    //获取Documents路径
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [paths objectAtIndex:0];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *iOSPath = [documentsPath stringByAppendingPathComponent:fileName];
    BOOL isSuccess = [fileManager createFileAtPath:iOSPath contents:nil attributes:nil];
    if (isSuccess) {
        BOOL insert = [data writeToFile:iOSPath atomically:YES];
        if (insert) {
            return iOSPath;
        }
    }
    return nil;
}

最后附上俊华大佬的博客
Share Extension对应的文章:www.cnblogs.com/junhuawang/…
Action Extension对应的文章:www.cnblogs.com/junhuawang/…