3

我的应用程序中有 NSData,我想将该数据保存在 iCloud 中。我不想将我的 NSUserDefaults 与 iCloud 同步,所以它没有“我可以使用 iCloud 同步 NSUserDefaults plist 文件”的克隆。那可能吗?我怎样才能做到这一点?如何检索已保存的数据?

4

4 回答 4

3

是的,有可能。我之前已经这样做了,我的答案是与 iCloud 同步 zip,在其中我正在创建 zip 并将其转换为NSDataiCloud 并与 iCloud 同步,后来我收到 NSData 并再次将其转换回 zip 并解压缩内容。在这里,您的主要需求是同步 NSData,因此您需要为NSData.

1)创建子类UIDocument

#import <UIKit/UIKit.h>

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

2) 我的文档.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)与iCloud同步(您可以根据需要进行操作)

-(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");

     }];
}

希望这可以帮助..

于 2013-03-04T10:01:13.433 回答
1
// 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 :)
于 2017-08-22T07:24:41.043 回答
0

1)将数据转换为 zip 文件,然后保存到 icloud

2)将 xml 文件保存到 icloud

在这里,您有将数据保存在 icloud 中的解决方案,否则我们可以将该数据写入文件,我们可以通过提供文件路径将该文件直接保存到 icloud

于 2013-03-04T10:05:49.260 回答
0

对于自定义对象注意:每个 iCloud 用户仅限 1 MB!

+(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;
}
于 2017-08-08T07:11:02.383 回答