私の Cocoa アプリケーションでは、特権のある場所に plist を書き出す必要があるため、セキュリティ フレームワークを調べていました。以下のコードは、管理者パスワードを要求するダイアログ ボックスを適切にポップアップ表示するように見えますが、「成功」ブロックにぶつかっています。ただし、ここには 2 つの部分がありません。
- writeToUrl:atomically: を実行するにはどうすればよいですか?
- 特権をユーザーが最初に持っていたものに戻すにはどうすればよいですか?
私が使用している方法は次のとおりです。
- (void)writePreferences:(NSDictionary *)prefs url:(NSURL *)url {
AuthorizationRef auth = NULL;
OSStatus authResult = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &auth);
if (errAuthorizationSuccess != authResult) {
NSLog(@"couldn't create authorization object, error %d", authResult);
exit(-1);
}
@try {
AuthorizationItem item;
item.name = "com.gargoylesoft.FolderWatch.writePrefs";
item.valueLength = 0;
item.value = NULL;
item.flags = 0;
AuthorizationRights requestedRights;
requestedRights.count = 1;
requestedRights.items = &item;
AuthorizationRights *grantedRights = NULL;
authResult = AuthorizationCopyRights(auth,
&requestedRights,
kAuthorizationEmptyEnvironment,
kAuthorizationFlagExtendRights | kAuthorizationFlagInteractionAllowed,
&grantedRights);
if (authResult == errAuthorizationSuccess) {
[prefs writeToURL:url atomically:YES];
}
AuthorizationFreeItemSet(grantedRights);
} @finally {
AuthorizationFree(auth, kAuthorizationFlagDefaults);
}
}