4

私の Cocoa アプリケーションでは、特権のある場所に plist を書き出す必要があるため、セキュリティ フレームワークを調べていました。以下のコードは、管理者パスワードを要求するダイアログ ボックスを適切にポップアップ表示するように見えますが、「成功」ブロックにぶつかっています。ただし、ここには 2 つの部分がありません。

  1. writeToUrl:atomically: を実行するにはどうすればよいですか?
  2. 特権をユーザーが最初に持っていたものに戻すにはどうすればよいですか?

私が使用している方法は次のとおりです。

- (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);
    }
}
4

0 に答える 0