iOS之iCloud云存档实现笔记
ICloud基础
- 在开发者后台创建AppID,启用iCloud服务。
- 在Xcode的Capabilities面板开启iCloud选项,勾选iCloud Documents,之后Xcode会自动在工程目录下生成entitlements文件,里面包含对应的iCloud container id。这个id不能包含通配符’*’。
- 每个新生成的iCloud container都默认包含名为Documents的子目录。这个目录及其子目录都是对玩家可见的。你可以在手机里通过iCloud>Storage & Backup > Manage Storage直接查看和操作这个目录里的文件和文件夹。在Documents目录之外的目录对玩家都是不可见的。
- 在游戏使用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文件存储
- 首先要继承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
- 下面介绍针对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);
}
- 通常为了保证玩家的存档的绝对安全性(甩锅),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云存档实现笔记相关推荐
- iOS - 选取相册中iCloud云上图片和视频的处理
关于iOS选取相册中iCloud云上图片和视频 推荐看: TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因, ...
- iOS开发-iCloud的使用 apple云储存的使用
iOS开发-iCloud的使用 apple云储存的使用 前言 开发准备 代码 前言 iOS开发中为了防止用户将app卸载,再安装的时候丢失数据,所以关于apple提供的沙盒本地存储外,还提供了云存储i ...
- 微信备份到云服务器失败怎么回事,iCloud云备份失败是为什么呢?iCloud云备份启用失败如何解决...
许多果粉们在使用iCloud的进行备份手机数据的时候都遇到过:iCloud云备份失败,启用"iCloud云备份"时发生问题这样的提示.那么,iCloud云备份失败是怎么样发生的,又 ...
- 微信备份到云服务器失败怎么回事,icloud云备份失败怎么办 icloud云备份失败原因及解决方法...
许多刚接触苹果设备的用户朋友经常会发生自己的设备出现iCloud云备份启动或者备份失败的情况却又不知道icloud云备份失败怎么办,连这都不知道的用户朋友不用着急,马上点击查看icloud云备份失败原 ...
- icloud安装错误怎么办_怎么办?iCloud云备份失败该如何解决?
iCloud云备份是很多果粉在备份手机里的数据时,常用到的一项操作.但是很多用户发现,自己在使用iCloud备份数据时,经常会遇到:iCloud云备份失败.造成iCloud云备份失败的原因是什么呢,又 ...
- 如何将Mac文件添加到 iCloud 云盘的具体操作方法!
iCloud 内置在每一部 Apple 设备中.因此,你的照片.文件.备忘录等内容都能得到安全的保护.实时的更新,并随处供你取用.它能自动运作,让你专心去做自己的事.一开始使用 iCloud 时,每个 ...
- 存储在icloud云盘文件夹顶层_iCloud云盘文件夹共享功能使用方法
类型:桌面工具大小:37.2M语言:中文 评分:10.0 标签: 立即下载 在我们的苹果手机当中很多人不知道其实我们手机自带有云盘的,就是iCloud云盘文件夹,其中也有个共享的功能,可以和别人互相分 ...
- iCloud配置问题(iOS 支持iCloud)
关于iOS支持iCloud Drive配置问题 首先解释下:iCloud是什么?有何作用? iCloud是苹果公司所提供的云端服务,使用者可以免费储存5GB的资料. 可以备份存放照片.音乐.通讯录.短 ...
- android icloud云盘,icloud备份恢复到安卓手机(全方面了解iCloud轻松玩转iCloud)
今天是8月23日星期五,今天小编教大家如何通过苹果iCloud云备份快速恢复iPhone和iPad等设备.小编建议大家经常使用iCloud云备份进行相关的数据备份,如果设备出现故障无法正常使用.我们就 ...
- 如何向icloud上传文件_如何用ICloud云盘分享文件?如何将本地文件上传到 iCloud Drive?...
在我们的苹果手机当中很多人不知道其实我们手机自带有云盘的,就是iCloud云盘文件夹,其中也有个共享的功能,可以和别人互相分享文件,非常的方便,那么这个功能具体要怎么用呢, 赶紧跟随小编一起来看看吧! ...
最新文章
- 浅谈对html css的理解,HTML+CSS入门 CSS选择器 、属性和值浅谈
- mysql表分区占用存储_MySQL 分区分表应用场景分析和分区中可能遇到的坑点
- 22课时、19大主题,CS 231n进阶版课程视频上线
- 排序算法整理(第十五周实践项目)
- 用立异,声东击西——贵阳Flex创客团队航行器吸引世界眼光
- hybris backoffice和产品主数据相关的一些sample data
- 方案计数(带修计数题/线段树)
- 机器学习算法应用30篇(十一)-理解逻辑回归及二分类、多分类代码实践
- 关于移植jSON编译时报错sbrkr.c:(.text+0xc): undefined reference to `_sbrk'处理
- c# 反射技术杂谈。,
- 怎么改变鼠标图案HTML,怎么换鼠标指针的颜色和图案?
- raster包—aggregate函数
- 均值滤波器类型_滤波器的种类归纳
- 阿里王坚:每一个物体都将是互联网终端
- 深入理解文字高度和行高的设置
- 2018科大讯飞AI营销算法比赛笔记
- 发光字招牌制作底板的种类
- WPF(三) WPF 命令
- linux下安装blas和lapack
- python中true_python中的true是什么
热门文章
- CodeBlocks配置openGL教程
- 【SQL Server 2005 彻底卸载、重装问题】
- 银河麒麟v10下载(服务器版 桌面版) - 2022-09-08更新
- linux下运行vasp,VASP5.3.5 并行版本+VTST从头编译教程(完整版)
- linux终端下如何下载文件,Linux终端下载文件的方法有哪些?
- linux xps文件,xps文件扩展名,xps文件怎么打开?
- 计算机桌面图标被挡怎么办,win7电脑桌面图标被挡住怎么恢复 - 卡饭网
- w10计算机管理权限,设置win10管理权限_win10系统如何获取管理员权限
- 五笔字根表识别码图_五笔字根识别码学习
- 网上订餐系统开源代码java_基于SSM实现的网上订餐系统【附源码】(毕设)