阻止 iCloud 备份

Posted

技术标签:

【中文标题】阻止 iCloud 备份【英文标题】:Prevent iCloud Backup 【发布时间】:2012-05-21 23:26:42 【问题描述】:

我制作了一个应用程序,人们可以下载内容,他们可以离线访问它,它就像一个目录。但是 Apple 拒绝了它,因为它在 iCloud 中烘烤,我正在执行以下操作,但它似乎不起作用。

函数.m

+ (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL 
    const char* filePath = [[URL path] fileSystemRepresentation];

    const char* attrName = "com.apple.MobileBackup";
    u_int8_t attrValue = 1;

    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);

    return result == 0;

更新.m

- (void)updateImg:(NSString *)tipo 

    //tomamos el ultimo update
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSTimeInterval time = [defaults doubleForKey:@"lastUpdate"];
    NSLog(@"%f", time);

    CatalogoAppDelegate *app = [[UIApplication sharedApplication] delegate];

    NSString *post = [NSString stringWithFormat:@"lastUpdate=%f", time];
    NSData *postData = [post dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:NO];
    NSMutableURLRequest *urlRequest = [[[NSMutableURLRequest alloc] init] autorelease];
    NSString *url = [NSString stringWithFormat:@"%@iPhone/update%@Img.php", app.serverUrl, tipo];
    [urlRequest setURL:[NSURL URLWithString:url]];
    [urlRequest setHTTPMethod:@"POST"]; 
    [urlRequest setHTTPBody:postData];

    NSData *urlData; 
    NSURLResponse *response; 
    NSError *error;
    urlData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error]; 
    if(urlData) 


        NSString *aStr = [[[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding]autorelease];
        //NSLog(@"%@: %@", tipo, aStr);
        NSArray *temp = [aStr componentsSeparatedByString:@";"];

        //Direccionl Local de la APP
        NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

        for (int i=0; i<[temp count]; i++) 

            NSString *tempImg = [NSString stringWithFormat:@"%@", [temp objectAtIndex:i]];
            //NSLog(@"%@", tempImg);

            //pedimos cada url
            NSURL *tempURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@images/%@/%@", app.serverUrl, tipo, tempImg]];
            //[Funciones addSkipBackupAttributeToItemAtURL:tempURL];
            UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:tempURL]];
            NSLog(@"%@images/%@/%@", app.serverUrl, tipo, tempImg);
            NSString *pngFilePath = [NSString stringWithFormat:@"%@/%@", docDir, tempImg];
            NSData *data1 = [NSData dataWithData:UIImagePNGRepresentation(image)];
            [data1 writeToFile:pngFilePath atomically:YES];

            NSURL *backUrl = [NSURL fileURLWithPath:pngFilePath];
            [Funciones addSkipBackupAttributeToItemAtURL:backUrl];

        

    
    [self performSelectorInBackground:@selector(finUpdate) withObject:nil];

知道我做错了什么吗?

谢谢

【问题讨论】:

【参考方案1】:

setxattr 提供指示成功或错误的结果,Apple 的 addSkipBackupAttributeToItemAtURL: 方法检查错误并将此信息传递回您的代码。您的代码只是忽略它。首先确定它是否返回错误。

【讨论】:

嗨@Jim,该方法返回True。我检查它提供的每个网址。但我的问题是我需要在哪一部分添加该部分或在下载之前添加它? 你确定吗?您提供的代码根本不检查返回值。 嗨@Jim 不,我没有在那里检查它,但我调试它并返回 1 = true。但是你认为它的实现正确吗? 谢谢吉姆。没错,但 addSkipBackupAttributeToItemAtURL: 是在保存之前。而且我需要删除该应用程序并进行备份,因为它会使用以前的备份进行恢复,并且我认为它正在备份,但事实并非如此。苹果已经接受了。谢谢:)【参考方案2】:

可能是因为您的应用与 ios 5.0 兼容。 不备份变量仅从 5.1 开始可用。详情看这里http://developer.apple.com/library/ios/#qa/qa1719/_index.html#//apple_ref/doc/uid/DTS40011342

【讨论】:

嗨@CedricSoubrie 不,这是因为该应用程序有一个我永远不会擦除的备份缓存:P

以上是关于阻止 iCloud 备份的主要内容,如果未能解决你的问题,请参考以下文章

iOS 阻止文件备份到 iCloud

如何阻止核心数据同步到 iCloud

阻止文件不被上传到iCloud-b

如何使用终端默认情况下阻止Mac应用保存到iCloud

Apple 的 iCloud 阻止来自我网站的电子邮件

在我们的应用程序中以编程方式禁用 Documents 目录的备份