美文网首页
iOS开发-iCloud的简单使用(2)-Documents数据

iOS开发-iCloud的简单使用(2)-Documents数据

作者: 张囧瑞 | 来源:发表于2018-01-23 21:48 被阅读1892次

    上次说到了iCloud的简单配置和key-value类型的简单使用,这次我们来看一下另外一种类型Documents类型的使用。

    相较于key-value的存储类型,Documents是用来管理一些比较大的文件,比如用户创建的文档等等。

    基本概念

    iCloud Entitlements

    在我们打开iCloud选项的时候,系统就是自动为我们添加一个 xxx.entitlements的文件,这个东西用来保证应用的安全性,确保只有你的应用才能访问你自己创建的文档,系统也是依赖于他来区分用户的iCloud账户中每个应用的文档。

    查看这个xxx.entitlements我们会发现在他里边有这样的一个keyUbiquity Container Identifiers,对应的value为iCloud.$(CFBundleIdentifier)。其实这个$(CFBundleIdentifier)就代表这你的APP ID。所以也可以看成是iCloud.com.zzr.ZZRiCloudDemo

    NSFileManager

    NSFileManager主要是对文件的操作,我们用它来获取iCloud的存储地址。

    根据我们的entitlements,通过NSFileManager就可以获得iCloud的存储地址,在获取地址之后,我们要先判断一下获取的地址是否为空,如果这个地址为空,则说明用户的iCloud暂时不可用,接下来一切的操作都没办法进行下去。

    //获取地址
    
    + (NSURL *)getUbiquityContauneURLWithFileName:(NSString *)fileName
    
    {
    
     NSURL *ubiquityURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:UbiquityContainerIdentifiers];
    
     //验证iCloud是否可用
    
     if(!ubiquityURL)
    
     {
    
     NSLog(@"尚未开启iCloud功能");
    
     return nil;
    
     }
    
     NSURL *URLWithFileName = [ubiquityURL URLByAppendingPathComponent:@"Documents"];
    
     URLWithFileName = [URLWithFileName URLByAppendingPathComponent:fileName];
    
     return URLWithFileName;
    
    }
    
    

    UIDocument

    UIDocument主要是用于对文件内容的操作。

    其实获取了文件的地址之后,我们已经可以直接对文件进行操作了,但是官方还是让我们通过UIDocument来操作,因为当我们在对iCloud进行操作的时候,不止是只有我们自己对他进行操作,iCloud daemon也会对iCloud操作,用UIDocument操作能够保证存取安全。

    在使用UIDocument之前,我们新建一个类,继承于UIDocument,并且重写两个方法:

    
    - (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError
    
    {
    
     self.myData = [contents copy];
    
     return YES;
    
    }
    
    - (nullable id)contentsForType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError
    
    {
    
     if(!self.myData)
    
     {
    
     self.myData = [[NSData alloc] init];
    
     }
    
     return self.myData;
    
    }
    
    

    NSMetadataQuery

    NSMetadataQuery主要用来查询数据。

    增删改查

    创建文档

    有了之前的准备工作,创建一个文档就非常简单了,只要创建好我们要保存的文件,通过

    
    - (void)saveToURL:(NSURL *)url forSaveOperation:(UIDocumentSaveOperation)saveOperation completionHandler:(void (^ __nullable)(BOOL success))completionHandler __TVOS_PROHIBITED;
    
    

    就可以将文档上传到iCloud中了。

    我们以一个txt文件作为示范。

    
    //创建文档
    
    + (void)createDocument
    
    {
    
     NSString *fileName = @"test.txt";
    
     NSURL *url = [iCloudHandle getUbiquityContauneURLWithFileName:fileName];
    
     ZZRDocument *doc = [[ZZRDocument alloc] initWithFileURL:url];
    
     NSString *docContent = @"iCloud Document 测试数据";
    
     doc.myData = [docContent dataUsingEncoding:NSUTF8StringEncoding];
    
     [doc saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
    
     if(success)
    
     {
    
     NSLog(@"创建文档成功");
    
     }
    
     else
    
     {
    
     NSLog(@"创建文档失败");
    
     }
    
     }];
    
    }
    
    

    修改文档

    修改文档,其实就是重写文档,就是将上边创建文档中的UIDocumentSaveForCreating改为UIDocumentSaveForOverwriting

    
    //修改文档 实际上是overwrite重写
    
    + (void)overwriteDocument
    
    {
    
     NSString *fileName = @"test.txt";
    
     NSURL *url = [iCloudHandle getUbiquityContauneURLWithFileName:fileName];
    
     ZZRDocument *doc = [[ZZRDocument alloc] initWithFileURL:url];
    
     NSString *docContent = @"iCloud Document 修改数据";
    
     doc.myData = [docContent dataUsingEncoding:NSUTF8StringEncoding];
    
     [doc saveToURL:url forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) {
    
     if(success)
    
     {
    
     NSLog(@"修改文档成功");
    
     }
    
     else
    
     {
    
     NSLog(@"修改文档失败");
    
     }
    
     }];
    
    }
    
    

    删除文档

    删除文档其实就是通过之前的地址获取到文件,然后调用remove方法即可。

    
    //删除文档
    
    + (void)removeDocument
    
    {
    
     NSString *fileName = @"test.txt";
    
     NSURL *url = [iCloudHandle getUbiquityContauneURLWithFileName:fileName];
    
     NSError *error;
    
     [[NSFileManager defaultManager] removeItemAtURL:url error:&error];
    
     if(error)
    
     {
    
     NSLog(@"删除文档失败 %@",error);
    
     }
    
     else
    
     {
    
     NSLog(@"删除文档成功");
    
     }
    
    }
    
    

    查询文档

    之前讲了增加、删除、修改,好像增删改查中只剩下查询这个方法没有介绍了。查询和前边几个有点不同,他需要用到NSMetadataQuery

    
    //获取最新的数据
    
    + (void)getNewDocument:(NSMetadataQuery *)myMetadataQuery
    
    {
    
     [myMetadataQuery setSearchScopes:@[NSMetadataQueryUbiquitousDocumentsScope]];
    
     [myMetadataQuery startQuery];
    
    }
    
    

    直接调用startQuery开始查询,iCloud就已经开始帮我们查询了,查询好之后,iCloud会通过通知来告诉我们查询到了东西。

    所以我们注册两个通知

    
     //获取最新数据完成
    
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(finishedGetNewDocument:) name:NSMetadataQueryDidFinishGatheringNotification object:self.myMetadataQuery];
    
     //数据更新通知
    
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(documentDidChange:) name:NSMetadataQueryDidUpdateNotification object:self.myMetadataQuery];
    
    

    并相应他们

    
    - (void)finishedGetNewDocument:(NSMetadataQuery *)metadataQuery
    
    {
    
     NSArray *item =self.myMetadataQuery.results;
    
     [item enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    
     NSMetadataItem *item = obj;
    
     //获取文件名
    
     NSString *fileName = [item valueForAttribute:NSMetadataItemFSNameKey];
    
     //获取文件创建日期
    
     NSDate *date = [item valueForAttribute:NSMetadataItemFSContentChangeDateKey];
    
     NSLog(@"%@,%@",fileName,date);
    
     ZZRDocument *doc = [[ZZRDocument alloc] initWithFileURL:[iCloudHandle getUbiquityContauneURLWithFileName:fileName]];
    
     [doc openWithCompletionHandler:^(BOOL success) {
    
     if(success)
    
     {
    
     NSLog(@"读取数据成功。");
    
     NSString *docConten = [[NSString alloc] initWithData:doc.myData encoding:NSUTF8StringEncoding];
    
     NSLog(@"%@",docConten);
    
     }
    
     }];
    
     }];
    
    }
    
    - (void)documentDidChange:(NSMetadataQuery *)metadataQuery
    
    {
    
     NSLog(@"Document 数据更新");
    
    }
    
    

    其中

    
    NSArray *item =self.myMetadataQuery.results;
    
    

    就是查询到的内容的数组,遍历他,就可以获取到对应目录下的全部文件了。

    Demo

    先放一下demo的地址

    demo简单的制作了一个text文档的存储功能,一些交互没有完善,但是基本的增删改查功能都已经实现了。

    DocumentDemo.gif

    以上就是iCloud Document的简单使用。此文章仅供个人学习使用,如有不当,希望大佬指出。

    相关文章

      网友评论

          本文标题:iOS开发-iCloud的简单使用(2)-Documents数据

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