簡単に言うと、サンドボックス化されたアプリを使用してそれを行うことはできません. サンドボックスをオフにすると、機能することがわかります。なんで?そうですね、コンテナのせいです。サンドボックスは独自のコンテナに存在するため、[NSUserDefaults standardUserDefaults] を呼び出すと、Cocoa は、com.apple.iApps.plist が存在する ~/Library/Preferences の POSIX パスではなく、コンテナのパスを使用します。これは、nil を取得する理由をまとめたものです。また、ここ NSUserDefaults にはこれに関する宣伝文句があります:リンク
これを修正する方法は?
本当に悪くない。最初に、ホーム ディレクトリの POSIX パスを取得するために少し作業を行う必要があります。一連の NSURL カテゴリ メソッドをセットアップします。ただし、ルート パスは POSIX ベースです。開始するためのコード スニペットを次に示します。
1.
+ (NSURL *) homePOSIXURL {
struct passwd *pwUser = getpwuid(getuid());
const char *homeDir = pwUser->pw_dir;
return [NSURL fileURLWithPath:[NSString stringWithUTF8String:homeDir] isDirectory:YES]; }
すべてが完了したら、plist へのフル パスを作成します。何年も変わっていないので、粘着性があると考えることができます。
したがって、次のようなものが得られる可能性があります。
2.
NSURL * prefURL = [[NSURL libraryPOSIXURL] URLByAppendingPathComponent:@"Preferences" isDirectory:YES];
prefURL = [prefURL URLByAppendingPathComponent:@"com.apple.iApps.plist"];
では、かなり小さいこの plist を、操作できるものに変えてみましょう。おそらくNSData?いいですね。
3.
NSData * prefData = [NSData dataWithContentsOfURL:prefURL];
OK、ついにこれを使って NSDictionary を取得できます。これが私のやり方です。
4.
NSDictionary * prefDict = [NSDictionary collectionFromPropertyList:prefData];
ええ、ええ、NSDictionary の別のカテゴリです。私はそれらの百万を持っている必要があります。
私は分かち合いの気分にいるので、ここに行きます:
+ (id) collectionFromPropertyList:(NSData *)pList {
if ( [pList length] > 0 )
return [NSPropertyListSerialization propertyListWithData:pList
options:NSPropertyListImmutable
format:nil error:nil];
return nil;
}
それで、あなたは私たちが終わったと思いますか?よくほとんど。ここまで来ると、次のように拒否されます。
ファイル読み取りデータを拒否 /Users/UserName/Library/Preferences/com.apple.iApps.plist
私たちはサンドボックス化されたアプリを愛していますか?! 基本的に、一時的な資格を追加すると、再びレースに出られるはずです. 幸運を祈ります!