完成此Demo前,应该对iCloud有个基本概念。(查看 iCloud简介)
一、准备工作(xcode 4.X iOS 5.0 sdk)
1.需要创建一个新的app id,要是有了一个的话,保证着个app id 不是一个通配符(即app id 不能是“com.yourcompany.*”形式)。
2.创建完成之后,开启设备的iCloud,然后在创建一个新的Provisional Profile,若已有则不需要创建。
(即,生成的证书,需要支持iCloud,类似推送通知的证书一样。若最后你项目完成,真机运行调试时出现:The executable was signed with invalid entitlements. 则去检查一下证书是否生成正确,及*.entitlements文件里面的字段是否填写正确。)
3.选择工程的summary,滚动到entitlement点击entitlements,xcode会自动的创建一个*.entitlements文件,如下图所示:
4.点击创建的*.entitlements,分别把pist列表里的三个字段都添上内容,格式为 “Team_ID.Bundle Identifie”,不要把team_id 跟 app_id弄混了啊,team_id是你创建完Provisional的时候,在最前面显示的那10个字符。
Xcode ——> Organizer ——> 相应证书的App Identifier 查看
二、代码编写
1、首先验证iCloud是否开启激活
// 得到文件管理器 NSFileManager *manager = [NSFileManager defaultManager]; // 验证iCloud是否激活 NSURL *url = [manager URLForUbiquityContainerIdentifier:nil]; if (url == nil) { NSLog(@"iCloud未激活"); return; }
2、关于上传文件
// 另起一个线程上传 [NSThread detachNewThreadSelector:@selector(uploadICloud) toTarget:self withObject:nil];
而在uploadICloud方法中,首先判断本地将要上传到iCloud的文件是否存在,若不存在则创建:
// 判断本地文件是否存在 if (![manager fileExistsAtPath:self.filePath]) { // 不存在则创建 if (![data writeToFile:self.filePath atomically:YES]) { [self performSelectorOnMainThread:@selector(setLabelText:) withObject:@"写本地文件失败" waitUntilDone:NO]; } }
然后判断在iCloud中该文件是否存在,若存在则进行修改操作(仅上传元数据和修改部分),若不存在则上传文本所有内容:
// 判断iCloud里该文件是否存在 if ([manager isUbiquitousItemAtURL:self.iCloudURL]) { // 存在则修改 if (![data writeToURL:self.iCloudURL atomically:YES]) { [self performSelectorOnMainThread:@selector(setLabelText:) withObject:@"写iCloud文件失败" waitUntilDone:NO]; } [self performSelectorOnMainThread:@selector(setLabelText:) withObject:@"上传成功" waitUntilDone:NO]; return; } // (若将下面写在else中,则可能导致2台机子各有备份,即一个设备的iCloud存储管理里面存在一个app的2个备份) // 上传至iCloud // 指定本地文件完整路径 NSURL *url = [NSURL fileURLWithPath:self.filePath]; NSError *error; // 官方文档建议本方法不要在主进程里执行 if (![manager setUbiquitous:YES itemAtURL:url destinationURL:self.iCloudURL error:&error]) { NSLog(@"setUbiquitous error %@,\n%@", error, [error userInfo]); self.myLabel.text = @"上传失败"; return; } self.myLabel.text = @"上传成功";
3、关于下载:利用官方文档提供的方法,用来检查文件状态并下载
- (BOOL)downloadFileIfNotAvailable:(NSURL*)file { NSNumber* isIniCloud = nil; if ([file getResourceValue:&isIniCloud forKey:NSURLIsUbiquitousItemKey error:nil]) { // If the item is in iCloud, see if it is downloaded. if ([isIniCloud boolValue]) { NSNumber* isDownloaded = nil; if ([file getResourceValue:&isDownloaded forKey:NSURLUbiquitousItemIsDownloadedKey error:nil]) { if ([isDownloaded boolValue]){ return YES; } // Download the file. NSFileManager* fm = [NSFileManager defaultManager]; if (![fm startDownloadingUbiquitousItemAtURL:file error:nil]) { return NO; } return YES; } } } // Return YES as long as an explicit download was not started. return YES; }
1、初始界面:(最上的label显示了iCloud URL)
2、上传成功后,你会在 设置-- iCloud -- 储存与备份 -- 管理储存空间 看到项目刚刚上传的备份,如左图所示,然后下载成功的界面如右图:
3、在设备1(白色iPhone4)中更改textview内容,并上传成功(如左下图);然后用设备2(黑色iPod)下载成功(如右下图)。
四、源码下载
真机调试运行,需要进行证书更换,及*.entitlements文件里的相应字段进行更改,详见 一、准备工作。