简体   繁体   中英

How can i save NSData in iCloud

I have NSData in my App and i want to save that data in iCloud. I DONT want to synchronize my NSUserDefaults with iCloud, so its no clone of " Can I use iCloud to sync the NSUserDefaults plist file ". Is that possible? How can i do that? How can I retrieve that saved data?

Yes it is possible. I have done that before and my answer is at syncing zip with iCloud ,in which I am creating zip and converting it into NSData and syncing with iCloud, later I am receiving NSData and again converting back it into zip and unzipping content. Here your main need is syncing of NSData so All you to have work around for NSData .

1) Create subclass of UIDocument

#import <UIKit/UIKit.h>

@interface MyDocument : UIDocument
    @property (strong) NSData *dataContent;
@end

2) MyDocument.m

#import "MyDocument.h"

@implementation MyDocument
@synthesize dataContent;

// Called whenever the application reads data from the file system
- (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError **)outError
{
    self.dataContent = [[NSData alloc] initWithBytes:[contents bytes] length:[contents length]];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"noteModified" object:self];
    return YES;     
}

// Called whenever the application (auto)saves the content of a note
- (id)contentsForType:(NSString *)typeName error:(NSError **)outError 
{
    return self.dataContent;
}

@end

3) Syncing with iCloud (You can do as per you need)

-(IBAction) iCloudSyncing:(id)sender
{

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

    MyDocument *mydoc = [[MyDocument alloc] initWithFileURL:ubiquitousPackage];
    NSData *data = << YOUR NSDATA >>;
    mydoc.dataContent = data;

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

     }];
}

Hope this helps..

// 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 :)

1) Converting data into zip file and then saving to icloud

2) saving a xml file to icloud

here you have solutions to save data in icloud or else we can write that data into file and we can save that file directly to icloud by giving its file path

for custom objects NOTE: LIMITED FOR 1 MB per iCloud user!

+(void)write{

//Decode using
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:[HistoryFile files]];

//Save Data To NSUserDefault
NSUbiquitousKeyValueStore *iCloud =  [NSUbiquitousKeyValueStore defaultStore];

//let ios know we want to save the data    
[iCloud setObject:data forKey:@"app_data"];


//iOS will save the data when it is ready.
[iCloud synchronize];

}


+(NSMutableArray*)read{
    //Read Settings Value From NSUserDefault
    //get the NSUserDefaults object

    NSUbiquitousKeyValueStore *iCloud =  [NSUbiquitousKeyValueStore defaultStore];
    //read value back from the settings
    NSData *data = [iCloud objectForKey:@"app_data"];
    NSMutableArray *data_array = (NSMutableArray*)[NSKeyedUnarchiver unarchiveObjectWithData:data];    
    NSLog(@"data_array %@",data_array);
    return data_array;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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