2010-05-09 1 views
2

У меня есть приложение, и я читаю в адресной книге информацию с помощью API ABAddressBook и выбора человека. Я хотел бы предоставить ссылку из своего приложения, чтобы запустить адресную книгу Mac и предварительно выбрать конкретного пользователя.Как запустить Mac Address Book из своего приложения и выбрать конкретного человека?

Я уверен, что есть несколько способов сделать это - я придумал тот, который, похоже, работает, но он чувствует себя немного неуклюжим. Я запускаю «Address Book.app», в случае успеха он вызывает немного AppleScript для выбора уникального идентификатора «currentPerson» (из объекта ABRecord).

- (void) notifyABSelect 
{ 
    NSString *src = [NSString stringWithFormat:@"tell application \"Address Book\"\r\n\tset selection to first person whose id is \"%@\" \r\nend tell", [currentPerson uniqueId]]; 

    NSMutableDictionary *err = [NSMutableDictionary dictionary]; 
    NSAppleScript *script = [[NSAppleScript alloc] initWithSource:src]; 
    [script executeAndReturnError:&err]; 

    [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self]; 

    [src release]; 
    [err release]; 
    [script release]; 
} 

- (IBAction) launchAddressBook:(id)sender 
{ 
    [[[NSWorkspace sharedWorkspace] notificationCenter] 
    addObserver:self 
    selector:@selector(notifyABSelect) 
    name:NSWorkspaceDidLaunchApplicationNotification 
    object:nil]; 

    if ([[NSWorkspace sharedWorkspace] launchApplication:@"Address Book.app"] == YES) 
    { 
     [self notifyABSelect]; 
    } 
    else 
    { 
     NSLog(@"Unable to launch address book"); 
    } 

} 

В том случае, если это падение, если в адресной книге ранее была выбрана группа, отличная от «Все контакты»; он может или не может найти человека в зависимости от того, находятся ли они в выбранной группе. Однако, щелкнув ссылку второй раз в приложении, правильно перейдите в «Все контакты» и найдите человека.

Каковы альтернативы для достижения такого поведения?

ответ

3

Вместо этого вы можете использовать URL.

[[NSWorkspace sharedWorkspace] openURL: 
[NSURL URLWithString: 
    [NSString stringWithFormat: 
    @"addressbook://%@", [currentPerson uniqueId]]]]; 
+0

Спасибо, Николас - видимо, мне нравится делать что-то трудное. :) Работает как шарм. – Eric

1

Может быть, не имеет значения для вас, но стоит указать, потому что я натолкнулся на него случайно. Если у вас есть ваш человек из ABPeoplePicker, это однострочный. С человеком, выбранным в PeoplePicker, вызовите

[myPeoplePicker selectInAddressBook: self]; 

Вы можете использовать nil вместо self. Адресная книга запускается на странице этого человека. Вы также можете использовать editInAddressBook: для запуска адресной книги с человеком, готовым к редактированию.

Кажется, это должен быть метод ABPerson, а не ABPeoplePicker.