简体   繁体   English

iCloud Drive-读写(NSData)

[英]iCloud Drive - Read & Write (NSData)

Trying to save custom objects as NSData then upload to iCloud Drive 尝试将自定义对象另存为NSData,然后上传到iCloud 驱动器

any direction? 有什么方向吗? I tried already the Key-Value Method, but it is limited for 1MB :/ 我已经尝试过键值方法,但仅限于1MB:/

is it the correct way? 这是正确的方法吗? if yes, how can I read from the iCloud path? 如果是,如何从iCloud路径读取?

+(void)iCloudWrite:(NSData*)data
{

    NSURL* ubiq = [[NSFileManager defaultManager]URLForUbiquityContainerIdentifier:nil];
    NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"]  URLByAppendingPathComponent:@"iCloudHistory.zip"];

    MyDocument *mydoc = [[MyDocument alloc] initWithFileURL:ubiquitousPackage];
    mydoc.dataContent = data;

    [mydoc saveToURL:[mydoc fileURL] forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success)
     {
         if (success)
         {
             NSLog(@"Synced with icloud");
         }
         else
             NSLog(@"Syncing FAILED with icloud");
     }];
}

EDITED: 编辑:

在此处输入图片说明

// 1. Any file can be uploaded to iCloud container of any size (yes you should be having that much of space in iCloud) lets take an example SampleData.zip

// 2. This method will upload or sync SampleData.zip file in iCloud container, iCloud actually checks the metadata of your file before it uploads it into your iCloud container (so for first time it will upload the file and from next time it will only upload the changes)

-(void) iCloudSyncing:(id)sender
{
    //Doc dir
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"SampleData.zip"];
    NSURL *u = [[NSURL alloc] initFileURLWithPath:filePath];
    NSData *data = [[NSData alloc] initWithContentsOfURL:u];

    //Get iCloud container URL
    NSURL *ubiq = [[NSFileManager defaultManager]URLForUbiquityContainerIdentifier:nil];// in place of nil you can add your container name
    //Create Document dir in iCloud container and upload/sync SampleData.zip
    NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"]URLByAppendingPathComponent:@"SampleData.zip"];
    Mydoc = [[MyDocument alloc] initWithFileURL:ubiquitousPackage];
    Mydoc.zipDataContent = data;

    [Mydoc saveToURL:[Mydoc fileURL] forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success)
     {
         if (success)
         {
             NSLog(@"SampleData.zip: Synced with icloud");
         }
         else
             NSLog(@"SampleData.zip: Syncing FAILED with icloud");

     }];
}



  // 3 Download data from the iCloud Container

- (IBAction)GetData:(id)sender {

    //--------------------------Get data back from iCloud -----------------------------//
    id token = [[NSFileManager defaultManager] ubiquityIdentityToken];
    if (token == nil)
    {
        NSLog(@"ICloud Is not LogIn");
    }
    else
    {
        NSLog(@"ICloud Is LogIn");

        NSError *error = nil;
        NSURL *ubiq = [[NSFileManager defaultManager]URLForUbiquityContainerIdentifier:nil];// in place of nil you can add your container name
        NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"]URLByAppendingPathComponent:@"SampleData.zip"];
        BOOL isFileDounloaded = [[NSFileManager defaultManager]startDownloadingUbiquitousItemAtURL:ubiquitousPackage error:&error];
        if (isFileDounloaded) {
            NSLog(@"%d",isFileDounloaded);
            NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
            //changing the file name as SampleData.zip is already present in doc directory which we have used for upload
            NSString* fileName = [NSString stringWithFormat:@"RecSampleData.zip"];
            NSString* fileAtPath = [documentsDirectory stringByAppendingPathComponent:fileName];
            NSData *dataFile = [NSData dataWithContentsOfURL:ubiquitousPackage];
            BOOL fileStatus = [dataFile writeToFile:fileAtPath atomically:NO];
            if (fileStatus) {
                NSLog(@"success");
            }
        }
        else{
            NSLog(@"%d",isFileDounloaded);
        }
    }
}

//4 voila its done :)

Don't forget to add following parameters to your plist 不要忘记在您的plist中添加以下参数

<key>NSUbiquitousContainers</key>
    <dict>
        <key>YourCloudContainerID</key>
        <dict>
            <key>NSUbiquitousContainerIsDocumentScopePublic</key>
            <true/>
            <key>NSUbiquitousContainerName</key>
            <string>YourCloudContainerName</string>
            <key>NSUbiquitousContainerSupportedFolderLevels</key>
            <string>Any</string>
        </dict>
    </dict>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM