1

アプリのNSDocumentDirectoryのフォルダー全体にマークを付けて、iCloudバックアップから除外しようとしていますが、ターミナルに移動して次のコマンドを実行すると、次のエラーが発生します:xattr -plxv com.apple.MobileBackup:No such xattr: com.apple.MobileBackup

助けを提供してくれてありがとう。

これが私が使用しているコードです:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions 
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSURL *pathURL= [NSURL fileURLWithPath:documentsDirectory];

    [self addSkipBackupAttributeToItemAtURL:pathURL];
}

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    if (&NSURLIsExcludedFromBackupKey == nil) { // iOS <= 5.0.1
        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;
    } else { // iOS >= 5.1

        NSLog(@"%d",[URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:nil]);
        return [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:nil];
    }
}
4

1 に答える 1

5

iOSアプリのフォルダでターミナルを実行するにはどうすればよいですか?シミュレーターのことですか?

確かに、Appleはその属性を無視するか、プライマリドキュメントフォルダから削除します。あなたがすべきことは、Appleが開発者に(ファイルシステムプログラミングガイドから)行うように指示することです:

次の2つの方法のいずれかで、サポートファイル(アプリケーションがダウンロードまたは生成し、必要に応じて再作成できるファイル)を処理します。

  • iOS 5.0以前では、サポートファイルを<Application_Home>/Library/Cachesディレクトリに配置して、バックアップされないようにします。

  • iOS 5.0.1以降では、サポートファイルを<Application_Home>/Library/Application Supportディレクトリに配置し、com.apple.MobileBackup拡張属性をそれらに適用します。この属性は、ファイルがiTunesまたはiCloudにバックアップされないようにします。多数のサポートファイルがある場合は、それらをカスタムサブディレクトリに保存し、拡張属性をディレクトリのみに適用できます。

したがって、内部にファイル用の新しいディレクトリを作成し、Application Supportそのディレクトリに属性を適用します。

編集:まあ、情報は古く、ドキュメントは更新されていないようです。iOS 5.1リリースノートから:

iOS 5.1では、バックアップすべきでないファイルまたはディレクトリをマークするための新しいAPIが導入されています。オブジェクトの場合、対応するファイルがバックアップされないように属性をNSURL追加し ます。NSURLIsExcludedFromBackupKeyにはCFURLRef objects、対応する kCFURLIsExcludedFromBackupKey属性を使用します。

iOS 5.1以降で実行されているアプリは com.apple.MobileBackup、以前に説明されているように、新しい属性を使用する必要があり、拡張属性を直接追加しないでください。com.apple.MobileBackup拡張属性は非推奨であり、将来のリリースでサポートが削除される可能性があります。

テクニカルQ&A QA1719で、これを行うための実際のコードを取得できることがわかりました。

また、少なくともシミュレーターでアプリケーションサポートディレクトリを作成する必要があることがわかりました。このコードがお役に立てば幸いです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // got to make sure this exists
    NSFileManager *manager = [NSFileManager defaultManager];
    NSString *appSupportDir = [self applicationAppSupportDirectory];
    if(![manager fileExistsAtPath:appSupportDir]) {
        __autoreleasing NSError *error;
        BOOL ret = [manager createDirectoryAtPath:appSupportDir withIntermediateDirectories:NO attributes:nil error:&error];
        if(!ret) {
            LTLog(@"ERROR app support: %@", error);
            exit(0);
        }
    }
    ...
}

- (NSString *)applicationAppSupportDirectory
{
    return [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject];
}
于 2012-08-24T18:03:09.473 に答える