iCloud上传备份和下载的Demo

完成此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文件,如下图所示:

iCloud上传备份和下载的Demo_第1张图片


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 -- 储存与备份 -- 管理储存空间 看到项目刚刚上传的备份,如左图所示,然后下载成功的界面如右图:

iCloud上传备份和下载的Demo_第2张图片  


3、在设备1(白色iPhone4)中更改textview内容,并上传成功(如左下图);然后用设备2(黑色iPod)下载成功(如右下图)。


四、源码下载

真机调试运行,需要进行证书更换,及*.entitlements文件里的相应字段进行更改,详见 一、准备工作。


你可能感兴趣的:(备份,下载,上传,icloud)