如何从我的应用程序启动Mac通讯簿并选择特定的人?

时间:2010-05-09 18:39:02

标签: objective-c cocoa macos hyperlink addressbook

我有一个应用程序,我正在使用ABAddressBook API阅读地址簿信息并选择一个人。我想从我的应用程序中提供一个链接,以启动Mac地址簿并预先选择特定用户。

我确信有几种方法可以做到这一点 - 我想出了一个似乎有用的方法,但感觉有点笨重。我启动了“Address Book.app”,如果成功,它会调用一点AppleScript来选择“currentPerson”uniqueId(来自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");
    }

}

如果地址簿之前已经选择了“所有联系人”以外的其他组,那么这种情况就会失败;它可能会或可能不会根据他们是否在所选组中找到该人。但是,在应用程序中第二次单击该链接会正确转到“所有联系人”并找到该人。

有什么方法可以实现这种行为?

2 个答案:

答案 0 :(得分:3)

您可以改用URL。

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

答案 1 :(得分:1)

可能与你无关,但值得指出,因为我偶然遇到过它。如果你从ABPeoplePicker那里得到了你的人,那就是一个单行。在PeoplePicker中选择此人后,请致电

[myPeoplePicker selectInAddressBook: self];

您可以使用nil代替self。 地址簿在该人的页面上启动。 您还可以使用editInAddressBook:与准备好编辑的人一起启动地址簿。

在我看来,这应该是ABPerson的方法,而不是ABPeoplePicker。