share Extension

754 阅读1分钟

组件创建

share Extension是iOS共享数据的组件,可以提供从本地文件app,相册和第三方支持共享数据的app发送数据到自己app中,其实可以理解成一个app之间连接的桥。

当前项目---> targets ---> + 号----> 添加一个share Extension组件,得到一个分享的icon的东西,如:

image.png

项目也为此创建了一份默认的ShareViewController,在组件项目的info.plist中,可以修改一些共享的设置

image.png

比如NSExtensionActivationSupportslmageWithMaxCount 是限制了共享图片的个数,你可以在系统相册进行图片共享可以尝试
NSExtensionPrincipalClass 是我使用自己创建的分享页面,我并没有使用默认提供的ShareViewController,而且需要把默认对应storyboard给干掉。

自己新建的分享页面,继承于UIViewController其实就OK了,当然继承于SLComposeServiceViewController也是可以,看个人需要。

数据共享

别人app共享过来的数据是先到share Extension,然后再通过share Extension打开主程序的,所以,数据的校验和保存要放在share Extension。 比如:

for (NSExtensionItem *item in self.extensionContext.inputItems) {

            NSInteger count = item.attachments.count;

            for (NSItemProvider *itemProvider in item.attachments) {
// 图片处理
                if ([itemProvider hasItemConformingToTypeIdentifier:@"public.image"]) {
                    [itemProvider loadItemForTypeIdentifier:@"public.image" options:nil completionHandler:^(UIImage *image, NSError *error) {
                        [self.imagesArr addObject:image];
                    }];

                } else if ([itemProvider hasItemConformingToTypeIdentifier:@"public.url"]) { //文件处理

                   [itemProvider loadItemForTypeIdentifier:@"public.url" options:nil completionHandler:^(NSURL *_Nullable url, NSError *_Nullable error) {

                       NSURL *path = url;
                      if (!path.fileURL) {

                            return;
                        }

                        NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.xxx.com.xxx.xxx"];
                        NSURL *fileURL = [groupURL URLByAppendingPathComponent:[url.absoluteString.lastPathComponent stringByRemovingPercentEncoding]];

                        self.filepath = fileURL;

                        NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.com.xxx.xxx"];

                        [userDefaults setObject:self.filepath.absoluteString forKey:@"shareFile"];
                        if ([[NSFileManager defaultManager] fileExistsAtPath:fileURL.absoluteString]) {
                                 [[NSFileManager defaultManager] removeItemAtPath:fileURL.absoluteString error:nil];
                        } else {
                            [[NSFileManager defaultManager] copyItemAtURL:path toURL:fileURL error:nil];
                        }

通过GroupIdentifier,就是app groups,让主程序和share extension能数据共享

image.png

回到主程序,你可以通过通过GroupIdentifier获取数据

NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.com.xxx.xxx"];

NSString *filePath = [userDefaults objectForKey:@"shareFile"];
[userDefaults removeObjectForKey:@"shareFile"];

以上仅作参考,个人需求不一还得看情况调整