Шрифты принадлежат ~ user / Library / Fonts / для одного пользователя или / Library / Fonts / и доступны всем пользователям. Вам нужно получить разрешение, чтобы писать в / Library / Fonts /, хотя для этого есть API, который делает его относительно простым. (У меня где-то есть код, и я могу посмотреть его, если никто другой не знает, как это происходит.)
По запросу, вот несколько документов API:
http://developer.apple.com/mac/library/documentation/Security/Reference/authorization_ref/Reference/reference.html
Это старый код, который я обновлял под Carbon (отсюда и строки паскаля). Он был основан на примере кода, который, вероятно, где-то в приведенном выше URL. Я не пытался делать это под Какао, и это отредактированная версия кода (все еще немного грязная), так что YMMV.
int main()
{
OSStatus myStatus = -1;
char path[1024];
char myToolPath[2048];
getUpdateAppPath(myToolPath);
getFilePath(path);
if (path[0] != 0)
{
char temp[2048];
FILE *f;
printf("Attempting to open \'%s\'\n", path);
f = fopen(path, "w+");
if (f != 0) // we seem to have write permission
{
fclose(f);
SInt16 res;
sprintf(temp, "\'%s\' \'%s\'", myToolPath, path);
system(temp);
StandardAlert(kAlertNoteAlert, "\pUpdate Complete", "\pSuccessfully updated.", 0, &res);
return 0;
}
AuthorizationFlags myFlags = kAuthorizationFlagDefaults;
AuthorizationRef myAuthorizationRef;
myStatus = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment,
myFlags, &myAuthorizationRef);
if (myStatus != errAuthorizationSuccess)
{
SInt16 res;
StandardAlert(kAlertNoteAlert, "\pAuthorization Error", "\pCould not authorize application to update.", 0, &res);
return myStatus;
}
AuthorizationItem myItems = {kAuthorizationRightExecute, 0, NULL, 0};
AuthorizationRights myRights = {1, &myItems};
myFlags = kAuthorizationFlagDefaults |
kAuthorizationFlagInteractionAllowed |
kAuthorizationFlagPreAuthorize |
kAuthorizationFlagExtendRights;
myStatus = AuthorizationCopyRights (myAuthorizationRef, &myRights, NULL, myFlags, NULL );
if (myStatus != errAuthorizationSuccess)
break;
char *myArguments[] = { path, NULL };
FILE *myCommunicationsPipe = NULL;
char myReadBuffer[128];
myFlags = kAuthorizationFlagDefaults;
myStatus = AuthorizationExecuteWithPrivileges(myAuthorizationRef, myToolPath, myFlags, myArguments,
&myCommunicationsPipe);
if (myStatus == errAuthorizationSuccess)
for(;;)
{
int bytesRead = read (fileno (myCommunicationsPipe),
myReadBuffer, sizeof (myReadBuffer));
if (bytesRead < 1) break;
write (fileno (stdout), myReadBuffer, bytesRead);
}
AuthorizationFree (myAuthorizationRef, kAuthorizationFlagDefaults); // 17
}
if (myStatus)
{
printf("Status: %ld\n", myStatus);
SInt16 res;
StandardAlert(kAlertNoteAlert, "\pUpdater Error", "\pMay not have updated properly.", 0, &res);
}
else {
SInt16 res;
StandardAlert(kAlertNoteAlert, "\pUpdate Complete", "\pSuccessfully updated.", 0, &res);
}
return myStatus;
}