美文网首页
ios 跨软件传输数据之Share Extension将分享数据

ios 跨软件传输数据之Share Extension将分享数据

作者: 大大的西瓜灬 | 来源:发表于2019-05-06 12:23 被阅读0次

    上面章节已经讲述了如何取得宿主应用所分享的内容。那么,接下来就是将这些内容传递给容器程序进行相应的操作(如:在一款社交应用中,可能会为取得的分享内容发布一条用户动态)。在默认情况下,iOS的应用是存在一个沙盒里面的,不允许应用与应用直接进行数据的交互。为此,苹果提供了一项叫App Groups的服务,该服务允许开发者可以在自己的应用之间通过NSUserDefaults、NSFileManager或者CoreData来进行相互的数据传输。下面介绍如何激活App Groups服务:

    • 首先要有一个独立的AppID(带通配符*号的AppID是不允许激活App Groups的)


      配置App ID

    使用AppGroup如果之前已经创建好的有不带有*号的App ID 可以直接编辑App ID把App Groups选中,然后编辑并添加 App Groups ID。

    • 然后打开容器应用的项目配置的Capabilities页签,激活App Groups特性,如图:


      设置AppGroup

    激活AppGroup特性

    • 点击+号添加一个App Groups,点击OK按钮:


      激活特性

    设置Group名称

    • 创建完成后,XCode会自动把应用添加到新建的分组中。如图:


      激活特性

    容器程序启用AppGroup

    • 上述步骤完成后,容器程序的App Groups已经算是设置完成。然后轮到Share Extension插件需要激活App Groups服务,设置步骤跟容器程序相同,唯一不同的是,插件不需要创建新的App Group,只要加入到容器程序刚才创建的Group即可(这里可以理解为,哪些应用要实现共享数据,那么他们必须在同一个Group里面)。如图:


      勾选启用

    扩展程序启用AppGroup

    至此,应用和扩展的App Groups服务都已经启动,现在就要进行分享内容的传输操作。下面分别介绍一下NSUserDefaults、NSFileManager以及CoreData三种方式是如何实现App Groups下的数据操作:

    • NSUserDefaults:要想设置或访问Group的数据,不能在使用standardUserDefaults方法来获取一个NSUserDefaults对象了。应该使用initWithSuiteName:方法来初始化一个NSUserDefaults对象,其中的SuiteName就是创建的Group的名字,然后利用这个对象来实现,跨应用的数据读写,代码如下:
    //初始化一个供App Groups使用的NSUserDefaults对象
    NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.cn.vimfung.ShareExtensionDemo"];
    
    //写入数据
    [userDefaults setValue:@"value" forKey:@"key"];
    
    //读取数据
    NSLog(@"%@", [userDefaults valueForKey:@"key"]);
    
    • NSFileManager:通过调用 containerURLForSecurityApplicationGroupIdentifier:方法可以获得AppGroup的共享目录,然后在此目录的基础上实现任意的文件操作。代码如下:
    //获取分组的共享目录
    NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.cn.vimfung.ShareExtensionDemo"];
    NSURL *fileURL = [groupURL URLByAppendingPathComponent:@"demo.txt"];
    
    //写入文件
    [@"abc" writeToURL:fileURL atomically:YES encoding:NSUTF8StringEncoding error:nil];
    
    //读取文件
    NSString *str = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"str = %@", str);
    
    • CoreData:其实CoreData是基于NSFileManager取得共享目录后来实现数据共享的。即在初始化CoreData时,先使用NSFileManager取得共享目录,然后再指定共享目录为存储数据文件的目录(如存储的sqlite文件)。代码如下:
    //获取分组的共享项目
    NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.cn.vimfung.ShareExtensionDemo"];
    NSURL *storeURL = [containerURL URLByAppendingPathComponent:@"DataModel.sqlite"];
    
    //初始化持久化存储调度器
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DataModel" withExtension:@"momd"];
    
    NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    
    [coordinator addPersistentStoreWithType:NSSQLiteStoreType
                              configuration:nil
                                        URL:storeURL
                                    options:nil
                                      error:nil];
    
    //创建受控对象上下文
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    
    [context performBlockAndWait:^{
        [context setPersistentStoreCoordinator:coordinator];
    }];
    

    为了方便演示,这里会使用NSUserDefault来直接把取到的url地址保存起来。代码如下所示:

    /**
     *  点击提交按钮
     */
    - (void)didSelectPost
    {
        __block BOOL hasExistsUrl = NO;
        [self.extensionContext.inputItems enumerateObjectsUsingBlock:^(NSExtensionItem * _Nonnull extItem, NSUInteger idx, BOOL * _Nonnull stop) {
    
            [item.attachments enumerateObjectsUsingBlock:^(NSItemProvider * _Nonnull itemProvider, NSUInteger idx, BOOL * _Nonnull stop) {
    
                if ([itemProvider hasItemConformingToTypeIdentifier:@"public.url"])
                {
                    [itemProvider loadItemForTypeIdentifier:@"public.url"
                                                    options:nil
                                          completionHandler:^(id<NSSecureCoding>  _Nullable item, NSError * _Null_unspecified error) {
    
                                              if ([(NSObject *)item isKindOfClass:[NSURL class]])
                                              {
                                                  NSLog(@"分享的URL = %@", item);
                                                  NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.cn.vimfung.ShareExtensionDemo"];
                                                  [userDefaults setValue: ((NSURL *)item).absoluteString forKey:@"share-url"];
                                                   //用于标记是新的分享
                                                  [userDefaults setBool:YES forKey:@"has-new-share"];
                                              }
    
                                          }];
    
                    hasExistsUrl = YES;
                    *stop = YES;
                }
    
            }];
    
            if (hasExistsUrl)
            {
                *stop = YES;
            }
    
        }];
    

    相关文章

      网友评论

          本文标题:ios 跨软件传输数据之Share Extension将分享数据

          本文链接:https://www.haomeiwen.com/subject/fajroqtx.html