iOS 读取iCloud文件并修改等骚操作

首先第一步开启iCloud服务:

image.png

然后就是看代码了。

先定义一个继承UIDocument的,

它用来存储文件的Data.其内部响应外部调用。先看UIDocument的接口,

#pragma mark *** Simple Reading and Writing ***

// These methods will be all most apps need to access files. Applications with complex reading and writing needs should see the Advanced Reading and Writing section below.

// Typical subclasses will implement this method to do reading. UIKit will pass NSData typed contents for flat files and NSFileWrapper typed contents for file packages.
// typeName is the UTI of the loaded file.
- (BOOL)loadFromContents:(id)contents ofType:(nullable NSString *)typeName error:(NSError **)outError API_UNAVAILABLE(tvos);

// Typical subclasses will implement this method and return an NSFileWrapper or NSData encapsulating a snapshot of their data to be written to disk during saving.
// Subclasses that return something other than a valid NSFileWrapper or NSData instance, or don't override this method must override one of the writing methods in the Advanced Saving section to write data to disk.
- (nullable id)contentsForType:(NSString *)typeName error:(NSError **)outError API_UNAVAILABLE(tvos);

再看看MyDocument的代码。


#import <UIKit/UIKit.h>

@interface MyDocument : UIDocument
@property(strong,nonatomic)NSData * myData;
@end

@implementation MyDocument

//读取icloud数据调用,响应openWithCompletionHandler
- (BOOL)loadFromContents:(id)contents ofType:(nullable NSString *)typeName error:(NSError **)outError __TVOS_PROHIBITED
{
    self.myData = [contents copy];
    return true;
}

//保存数据、修改数据到icloud,响应save
- (nullable id)contentsForType:(NSString *)typeName error:(NSError **)outError __TVOS_PROHIBITED
{
    if (!self.myData) {
        self.myData = [[NSData alloc] init];
    }
    return self.myData;
}
@end

怎么使用,


#import "MyDocument.h" 


#define UbiquityContainerIdentifier @"iCloud.com.qzzn.damon.iosIcloudDemoa"
@interface ViewController ()<UIDocumentPickerDelegate>
@property(strong,nonatomic) NSUbiquitousKeyValueStore  *myKeyValue; //字符串使用
@property(strong,nonatomic) MyDocument  *myDocument;   //icloud数据处理
@property(strong,nonatomic) NSMetadataQuery *myMetadataQuery;//icloud查询需要用这个类
@property(strong,nonatomic) NSURL *myUrl;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 100, 100, 30)];
    [button setTitle:@"保存字符串" forState:UIControlStateNormal];
    [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(saveString) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    
    UIButton *button2 = [[UIButton alloc] initWithFrame:CGRectMake(10, 200, 100, 30)];
    [button2 setTitle:@"读取字符串" forState:UIControlStateNormal];
    [button2 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [button2 addTarget:self action:@selector(loadString) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button2];
    
    UIButton *button3 = [[UIButton alloc] initWithFrame:CGRectMake(10, 300, 100, 30)];
    [button3 setTitle:@"上传资料" forState:UIControlStateNormal];
    [button3 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [button3 addTarget:self action:@selector(uploadDoc) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button3];
    
    UIButton *button5 = [[UIButton alloc] initWithFrame:CGRectMake(10, 400, 100, 30)];
    [button5 setTitle:@"修改资料" forState:UIControlStateNormal];
    [button5 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [button5 addTarget:self action:@selector(editDoc) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button5];
    
    UIButton *button4 = [[UIButton alloc] initWithFrame:CGRectMake(10, 500, 200, 30)];
    [button4 setTitle:@"获取最新数据" forState:UIControlStateNormal];
    [button4 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [button4 addTarget:self action:@selector(downloadDoc) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button4];
    
    UIButton *button6 = [[UIButton alloc] initWithFrame:CGRectMake(10, 600, 100, 30)];
    [button6 setTitle:@"删除资料" forState:UIControlStateNormal];
    [button6 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [button6 addTarget:self action:@selector(removeDoc) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button6];
    
    self.myKeyValue = [NSUbiquitousKeyValueStore defaultStore];
    //字符串
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(StringChange:) name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:self.myKeyValue];
    //文档
    //数据获取完成
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MetadataQueryDidFinishGathering:) name:NSMetadataQueryDidFinishGatheringNotification object:self.myMetadataQuery];
    //数据更新通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MetadataQueryDidUpdate:) name:NSMetadataQueryDidUpdateNotification object:self.myMetadataQuery];
    
    //文档
    self.myMetadataQuery = [[NSMetadataQuery alloc] init];
}

-(void)StringChange:(NSNotification*)noti
{
    NSLog(@"%@",noti.object);
}

-(void)saveString{
    NSLog(@"savestring");
    static int i = 0;
    i++;
    if (i==1) {
        [self.myKeyValue setObject:@"damon" forKey:@"name"];
    }
    else if (i==2){
        [self.myKeyValue setObject:@"dong" forKey:@"name"];
        i=0;
    }
    [self.myKeyValue synchronize];
}

-(void)loadString{
    NSLog(@"loadstring");
    NSLog(@"name:%@",[self.myKeyValue objectForKey:@"name"]);
}

//创建文档并上传
-(void)uploadDoc{
    NSLog(@"uploadDoc");
    //文档名字
    NSString *fileName =@"atest.txt";
    
    fileName = @"OpenGL ES 2.0 编程指南 中文版@www.java1234.com.pdf";
    
    NSURL *url = [self getUbiquityContainerUrl:fileName];
    if (!url) {
        return;
    }
    NSLog(@"%@",url);
    
  NSURL *  oldurl = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"OpenGL ES 2.0 编程指南 中文版@www.java1234.com" ofType:@"pdf"]];
    MyDocument *doc = [[MyDocument alloc] initWithFileURL:oldurl];
    //文档内容
//    NSString*str = @"测试文本数据";
//    doc.myData = [str dataUsingEncoding:NSUTF8StringEncoding];
    [doc saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
        if (success) {
            NSLog(@"创建成功");
        }
        else{
            NSLog(@"创建失败");
        }
    }];
}

//保存文档,只是save参数不一样用UIDocumentSaveForOverwriting
-(void)editDoc{
    NSLog(@"editDoc");
    //文档名字
    NSString *fileName =@"test.txt";
    NSURL *url = [self getUbiquityContainerUrl:fileName];
    MyDocument *doc = [[MyDocument alloc] initWithFileURL:url];
    //文档内容
    NSString*str = @"修改了数据";
    doc.myData = [str dataUsingEncoding:NSUTF8StringEncoding];
    [doc saveToURL:url forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) {
        if (success) {
            NSLog(@"修改成功");
        }
        else{
            NSLog(@"修改失败");
        }
    }];
}

//移除文档
-(void)removeDoc{
    NSLog(@"removeDoc");
    NSString *fileName =@"test.txt";
    NSURL *url = [self getUbiquityContainerUrl:fileName];
    NSError* error;
    [[NSFileManager defaultManager] removeItemAtURL:url error:&error];
    if (error) {
        NSLog(@"%@",error.localizedDescription);
    }else{
        NSLog(@"remove success");
    }
}

//获取最新数据
-(void)downloadDoc{
    NSLog(@"downloaddoc");
    //设置搜索文档
    [self.myMetadataQuery setSearchScopes:@[NSMetadataQueryUbiquitousDocumentsScope]];
    [self.myMetadataQuery startQuery];
    
    
    [self importDocumentFromiCloud];
}

//获取成功
-(void)MetadataQueryDidFinishGathering:(NSNotification*)noti{
    NSLog(@"MetadataQueryDidFinishGathering");
    NSArray *items = self.myMetadataQuery.results;//查询结果集
    //便利结果
    [items 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);
        
        //file:///private/var/mobile/Containers/Shared/AppGroup/AA2BACA6-84BC-4918-8499-AD6BD445EDF6/File%20Provider%20Storage/%E7%83%AD%E8%85%BE%E8%85%BE.pdf
        //读取文件内容
        MyDocument *doc =[[MyDocument alloc] initWithFileURL:[self getUbiquityContainerUrl:fileName]];
        [doc openWithCompletionHandler:^(BOOL success) {
            if (success) {
                NSLog(@"读取数据成功.");
                NSString *dataText = [[NSString alloc] initWithData:doc.myData encoding:NSUTF8StringEncoding];
                NSLog(@"数据:%@",dataText);
            }else{
                
            }
        }];
    }];
}

//数据有更新
-(void)MetadataQueryDidUpdate:(NSNotification*)noti{
    NSLog(@"icloud数据有更新");
}

//获取url
-(NSURL*)getUbiquityContainerUrl:(NSString*)fileName{
    if (!self.myUrl) {
        self.myUrl = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:UbiquityContainerIdentifier];//URLForUbiquityContainerIdentifier
        if (!self.myUrl) {
            NSLog(@"未开启iCloud功能");
            return nil;
        }

    }
    NSLog(@"myUrl:%@",self.myUrl);
    NSURL *url = [self.myUrl URLByAppendingPathComponent:@"Documents"];
    url = [url URLByAppendingPathComponent:fileName];
    
    NSLog(@"url= %@",url);
    return url;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)importDocumentFromiCloud{
    
//    - (void)presentDocumentPicker {
        NSArray *documentTypes = @[@"public.content", @"public.text", @"public.source-code ", @"public.image", @"public.audiovisual-content", @"com.adobe.pdf", @"com.apple.keynote.key", @"com.microsoft.word.doc", @"com.microsoft.excel.xls", @"com.microsoft.powerpoint.ppt"];
        
        UIDocumentPickerViewController *documentPickerViewController = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:documentTypes inMode:UIDocumentPickerModeOpen];
        documentPickerViewController.delegate = self;
        [self presentViewController:documentPickerViewController animated:YES completion:nil];
//    }
    
}
#pragma mark - UIDocumentPickerDelegate

- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url {
    
    
    NSArray *array = [[url absoluteString] componentsSeparatedByString:@"/"];
    NSString *fileName = [array lastObject];
    fileName = [fileName stringByRemovingPercentEncoding];
    NSLog(@"url,fileName:::%@/%@",url,fileName);
    
    MyDocument *iCloudDoc = [[MyDocument alloc]initWithFileURL:url];
       
       [iCloudDoc openWithCompletionHandler:^(BOOL success) {
           if (success) {
               
               [iCloudDoc closeWithCompletionHandler:^(BOOL success) {
                   NSLog(@"关闭成功");
               }];
               
               NSString *content = [[NSString alloc]initWithData:iCloudDoc.myData encoding:NSUTF8StringEncoding];// iCloudDoc.myData
              
               NSLog(@"%@",content);
               
           }
       }];
    
}

@end

全部评论

相关推荐

程序员花海:实习太简单了 学历可以的 实习描述应该是先介绍业务 再介绍技术 技术咋推动业务的 做到了啥收益 有没有做实验 实验组和对照组有什么不同 你最后学到了什么 有没有参与处理过线上问题 有没有参与过公司的code review 有没有参与过技术分享 这些都是可以在实习描述中写的 并且实习和项目不一样不会撞车 应该放在最前面 放在教育背景下面 另外项目有点烂大街 可以看下我主页的简历优化案例
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务