ICloud基础

  1. 在开发者后台创建AppID,启用iCloud服务。
  2. 在Xcode的Capabilities面板开启iCloud选项,勾选iCloud Documents,之后Xcode会自动在工程目录下生成entitlements文件,里面包含对应的iCloud container id。这个id不能包含通配符’*’。
  3. 每个新生成的iCloud container都默认包含名为Documents的子目录。这个目录及其子目录都是对玩家可见的。你可以在手机里通过iCloud>Storage & Backup > Manage Storage直接查看和操作这个目录里的文件和文件夹。在Documents目录之外的目录对玩家都是不可见的。
  4. 在游戏使用iCloud功能前,要先询问系统当前游戏的iCloud是否可用。通过获取当前默认container的云端基址来实现,如果是空,说明iCloud暂时不可使用。
id containerUrl = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier: nil];

这是个阻塞方法,所以最好在后台线程调用它。示例代码如下:

dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {NSURL* containerUrl = [[NSFileManager defaultManager]URLForUbiquityContainerIdentifier: nil]; // 实际项目里最好把containerUrl保存下来if (containerUrl != nil) {NSLog(@"iCloud已开启");dispatch_async (dispatch_get_main_queue (), ^(void) {// 回到主线程,执行下一步操作});}else{NSLog(@"iCloud未开启");}
});

得到containerUrl后,通过方法URLByAppendingPathComponent:即可一级级的拼接出你想要的目录地址。

// 获取documents目录
NSURL* documentsUrl = [containerUrl URLByAppendingPathComponent:@"Documents"];

ICloud文件存储

  1. 首先要继承UIDocument类。这个类自带文档和云端基于NSURL的存取功能,我们只需要再实现以下两个方法,从而定义文档内容和云端数据是如何相互转换的就可以了。
/***  保存文档时调用,将文档内容转换成NSXX类型云端数据*  @param typeName 文档文件类型*  @param outError 错误信息输出*  @return 文档数据 NSData*/
-(id)contentsForType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError;/***  读取数据时调用,将云端数据转换成文档内容*  @param contents 云端文档数据,NSXX类型*  @param typeName 文档文件类型*  @param outError 错误信息输出*  @return 读取是否成功*/
-(BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError;

贴一个我自己实现的LDDocuments:

LDDocuments.h

@interface LDDocument : UIDocument
@property (nonatomic, copy) NSString *text;
-(nullable id)contentsForType:(NSString *)typeName error:(NSError **)outError;
-(BOOL)loadFromContents:(id)contents ofType:(nullable NSString *)typeName error:(NSError **)outError ;
@end

LDDocuments.mm

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "LZDocument.h"
@implementation LZDocument-(id)contentsForType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError
{if (self.text.length <= 0) {     self.text = @"";}NSData *data = [self.text dataUsingEncoding:NSUTF8StringEncoding];   return data;
}-(BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError
{ self.text = [[NSString alloc]initWithData:contents encoding:NSUTF8StringEncoding];  return YES;
}
@end
  1. 下面介绍针对UIDocument的存取操作
  • 创建或者保存UIDocument
LZDocument *doc = [[LZDocument alloc] initWithFileURL:url]; // url是文档地址
doc.text = text; //文档内容
[doc saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {if(success){NSLog(@"保存成功");}else{NSLog(@"保存失败");}
}];
  • 读取UIDocument
LZDocument * doc = [[LZDocument alloc] initWithFileURL:url];
[doc openWithCompletionHandler:^(BOOL success) {if(success){NSLog(@"读取成功 text = %@", [doc.text UTF8String]);}else{NSLog(@"读取失败");}
}];
  • 删除UIDocument
NSError error = nil;
[[NSFileManager defaultManager] removeItemAtURL: url error:&error];
if (error) {NSLog(@"删除文档过程中发生错误,错误信息:%@",error.localizedDescription);
}
  1. 通常为了保证玩家的存档的绝对安全性(甩锅),iCloud云同步的实际上是本地游戏存档的一个打包备份。由玩家依据备份的创建时间,自己决定是否上传本地存档或者下载云端备份。这需要我们通过NSMetaQuery元数据查询获取iCloud文档列表,进而得到文档最后一次修改的时间。
- (void)getICloudTime
{if (!_metaQuery) {_metaQuery = [[NSMetadataQuery alloc] init];_metaQuery.searchScopes = @[NSMetadataQueryUbiquitousDocumentsScope];//查询状态是通过通知的形式告诉监听对象的NSNotificationCenter *center = [NSNotificationCenter defaultCenter];[center addObserver:self selector:@selector(queryFinish:)name:NSMetadataQueryDidFinishGatheringNotification object:_metaQuery];//数据获取完成通知}else{[_metaQuery stopQuery];}//开始查询[_metaQuery startQuery];
}- (void)queryFinish:(NSNotification *)notification
{NSLog(@"数据获取成功!");NSArray *items = _metaQuery.results;[items enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {NSMetadataItem *item = obj;//获取文件名NSString *fileName = [item valueForAttribute:NSMetadataItemFSNameKey];if([fileName hasPrefix:@"packsave"]){//获取文件最后一次修改的日期NSDate *date = [item valueForAttribute:NSMetadataItemFSContentChangeDateKey];NSTimeInterval interval = [date timeIntervalSince1970];  long totalMilliseconds = interval * 1000;stop = true;// 弹出UI}}];
}

iOS之iCloud云存档实现笔记相关推荐

  1. iOS - 选取相册中iCloud云上图片和视频的处理

    关于iOS选取相册中iCloud云上图片和视频 推荐看: TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因, ...

  2. iOS开发-iCloud的使用 apple云储存的使用

    iOS开发-iCloud的使用 apple云储存的使用 前言 开发准备 代码 前言 iOS开发中为了防止用户将app卸载,再安装的时候丢失数据,所以关于apple提供的沙盒本地存储外,还提供了云存储i ...

  3. 微信备份到云服务器失败怎么回事,iCloud云备份失败是为什么呢?iCloud云备份启用失败如何解决...

    许多果粉们在使用iCloud的进行备份手机数据的时候都遇到过:iCloud云备份失败,启用"iCloud云备份"时发生问题这样的提示.那么,iCloud云备份失败是怎么样发生的,又 ...

  4. 微信备份到云服务器失败怎么回事,icloud云备份失败怎么办 icloud云备份失败原因及解决方法...

    许多刚接触苹果设备的用户朋友经常会发生自己的设备出现iCloud云备份启动或者备份失败的情况却又不知道icloud云备份失败怎么办,连这都不知道的用户朋友不用着急,马上点击查看icloud云备份失败原 ...

  5. icloud安装错误怎么办_怎么办?iCloud云备份失败该如何解决?

    iCloud云备份是很多果粉在备份手机里的数据时,常用到的一项操作.但是很多用户发现,自己在使用iCloud备份数据时,经常会遇到:iCloud云备份失败.造成iCloud云备份失败的原因是什么呢,又 ...

  6. 如何将Mac文件添加到 iCloud 云盘的具体操作方法!

    iCloud 内置在每一部 Apple 设备中.因此,你的照片.文件.备忘录等内容都能得到安全的保护.实时的更新,并随处供你取用.它能自动运作,让你专心去做自己的事.一开始使用 iCloud 时,每个 ...

  7. 存储在icloud云盘文件夹顶层_iCloud云盘文件夹共享功能使用方法

    类型:桌面工具大小:37.2M语言:中文 评分:10.0 标签: 立即下载 在我们的苹果手机当中很多人不知道其实我们手机自带有云盘的,就是iCloud云盘文件夹,其中也有个共享的功能,可以和别人互相分 ...

  8. iCloud配置问题(iOS 支持iCloud)

    关于iOS支持iCloud Drive配置问题 首先解释下:iCloud是什么?有何作用? iCloud是苹果公司所提供的云端服务,使用者可以免费储存5GB的资料. 可以备份存放照片.音乐.通讯录.短 ...

  9. android icloud云盘,icloud备份恢复到安卓手机(全方面了解iCloud轻松玩转iCloud)

    今天是8月23日星期五,今天小编教大家如何通过苹果iCloud云备份快速恢复iPhone和iPad等设备.小编建议大家经常使用iCloud云备份进行相关的数据备份,如果设备出现故障无法正常使用.我们就 ...

  10. 如何向icloud上传文件_如何用ICloud云盘分享文件?如何将本地文件上传到 iCloud Drive?...

    在我们的苹果手机当中很多人不知道其实我们手机自带有云盘的,就是iCloud云盘文件夹,其中也有个共享的功能,可以和别人互相分享文件,非常的方便,那么这个功能具体要怎么用呢, 赶紧跟随小编一起来看看吧! ...

最新文章

  1. 浅谈对html css的理解,HTML+CSS入门 CSS选择器 、属性和值浅谈
  2. mysql表分区占用存储_MySQL 分区分表应用场景分析和分区中可能遇到的坑点
  3. 22课时、19大主题,CS 231n进阶版课程视频上线
  4. 排序算法整理(第十五周实践项目)
  5. 用立异,声东击西——贵阳Flex创客团队航行器吸引世界眼光
  6. hybris backoffice和产品主数据相关的一些sample data
  7. 方案计数(带修计数题/线段树)
  8. 机器学习算法应用30篇(十一)-理解逻辑回归及二分类、多分类代码实践
  9. 关于移植jSON编译时报错sbrkr.c:(.text+0xc): undefined reference to `_sbrk'处理
  10. c# 反射技术杂谈。,
  11. 怎么改变鼠标图案HTML,怎么换鼠标指针的颜色和图案?
  12. raster包—aggregate函数
  13. 均值滤波器类型_滤波器的种类归纳
  14. 阿里王坚:每一个物体都将是互联网终端
  15. 深入理解文字高度和行高的设置
  16. 2018科大讯飞AI营销算法比赛笔记
  17. 发光字招牌制作底板的种类
  18. WPF(三) WPF 命令
  19. linux下安装blas和lapack
  20. python中true_python中的true是什么

热门文章

  1. CodeBlocks配置openGL教程
  2. 【SQL Server 2005 彻底卸载、重装问题】
  3. 银河麒麟v10下载(服务器版 桌面版) - 2022-09-08更新
  4. linux下运行vasp,VASP5.3.5 并行版本+VTST从头编译教程(完整版)
  5. linux终端下如何下载文件,Linux终端下载文件的方法有哪些?
  6. linux xps文件,xps文件扩展名,xps文件怎么打开?
  7. 计算机桌面图标被挡怎么办,win7电脑桌面图标被挡住怎么恢复 - 卡饭网
  8. w10计算机管理权限,设置win10管理权限_win10系统如何获取管理员权限
  9. 五笔字根表识别码图_五笔字根识别码学习
  10. 网上订餐系统开源代码java_基于SSM实现的网上订餐系统【附源码】(毕设)