我们可以在手表扩展上打开联系人吗?

时间:2015-01-15 10:56:18

标签: ios watchkit apple-watch

如何在iOS中使用AddressBook以编程方式打开iPhone的联系人。

提前致谢

3 个答案:

答案 0 :(得分:5)

一般情况下,要使用WatchKit扩展程序与iPhone通信,请使用

+ (BOOL)openParentApplication:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo, NSError *error)) reply;    // launches containing iOS application on the phone. userInfo must be non-nil

WKInterfaceController类的方法。

例如,您可以将故事板中按钮的IBAction附加到此方法

- (IBAction)callPhoneAppButtonTapped
{
    NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"text to display on iPhone", @"key", nil];

    [InterfaceController openParentApplication:dictionary reply:^(NSDictionary *replyInfo, NSError *error) {
        NSLog(@"Reply received by Watch app: %@", replyInfo);
    }];
}

注意:要从地址簿中获取数据,用户需要授予您的应用权限。但应用程序将在后台启动,用户将专注于Watch,因此最好在您的iPhone应用程序中请求此权限。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
        ABAddressBookRequestAccessWithCompletion(ABAddressBookCreateWithOptions(NULL,  nil), ^(bool granted, CFErrorRef error) {
    if (!granted){
        NSLog(@"Access denied");
        return;
    }
    NSLog(@"Access granted");
});
}

为了处理AppDelegate工具中openParentApplication:reply发送的消息

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply
{
    NSLog(@"Request received by iOS app");
    NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"your value to return to Apple Watch", @"key", nil];

    // Here your app will be launch in background. Fetch AddressBook or other data you need.
    // Remember to call reply block in the end.  

    // Example of saving data to Address Book
    NSString *firstName;
    NSString *lastName;

    firstName = @"Maggie";
    lastName = @"Peggie";

    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, nil);
    ABRecordRef contact = ABPersonCreate();

    ABRecordSetValue(contact, kABPersonFirstNameProperty, (__bridge CFStringRef) firstName, nil);
    ABRecordSetValue(contact, kABPersonLastNameProperty, (__bridge CFStringRef)lastName, nil);

    ABAddressBookAddRecord(addressBookRef, contact, nil);
    ABAddressBookSave(addressBookRef, nil);

    reply(dictionary);
}

答案 1 :(得分:3)

虽然当前版本的Apple Watch应用程序本身无法执行代码,但您的WatchKit Extension可以在手机上运行,​​并且可以访问标准iOS应用程序可以使用的所有iPhone API。作为开发人员,我们在如何以编程方式更改界面方面受到更多限制,而不是在访问服务方面所做的工作。

因此,没有技术要求通过iOS应用程序访问地址簿数据 - 您可以直接对地址簿数据进行这些请求。如果这些方法快速执行,是否直接在Extension或iPhone应用程序中执行此操作的选择将归结为关于什么会最小化代码复杂性并因此最大化代码可维护性的决定。 Apple表示iPhone应用程序和WatchKit Extension 之间的通信延迟可以在很大程度上被忽略,因为它将是微不足道的。 (扩展,在手机上运行以及我们需要关注的Watch应用之间的延迟。)

但是,我们也被告知,Watch Watch应用程序可能会立即终止WatchKit Extensions,我们需要准备好以秒为单位而不是几分钟来衡量的参与时间。 WatchKit Extensions没有给出iPhone应用程序在用户界面终止后在后台完成任务的自由度。因此,建议应该在iPhone应用程序中运行任何可能更耗时或需要完成数据完整性的操作。 lvp的答案提供的代码可以帮助解决这个问题。

答案 2 :(得分:0)

您的应用在手机上运行,​​因此您可以抓取联系人并将其发送给观看