从苹果手表发起电话

时间:2015-05-22 08:48:27

标签: ios objective-c apple-watch

我正在为已有的应用程序开发Apple Watch扩展程序。

我的手表应用程序已与我们联系,客户可以拨打免费电话。

我的问题是如何点击按钮开始拨打Apple Watch,而不是让我的应用程序保持在前台并开始通话。

目前我正在使用此代码开始调用

+ (void)callWithNumberWithoutPrompt:(NSString *)phoneNo {
    NSString *prefixedMobileNumber = [phoneNo hasPrefix:@"+"]?phoneNo:[NSString stringWithFormat:@"+%@",phoneNo];
    NSString *phoneNumber = [@"tel://" stringByAppendingString:prefixedMobileNumber];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber]];
}

2 个答案:

答案 0 :(得分:3)

注意:这在WatchOS 1上是正确的,并且可能随着WatchOS 2的发布而改变。

来自Ray Wenderlich WatchKit FAQ

  

第三方应用可以通过观看应用拨打电话吗?

     

否。没有公共API可让您直接从WatchKit扩展程序发起电话呼叫。由于配套的iPhone应用程序也无法显示在前台,系统会默默地忽略来自配套iPhone应用程序的所有电话或openURL:请求。

答案 1 :(得分:3)

WatchConnectivity中使用WatchOS2,您可以将观看应用中的数据发送回父应用,然后尝试从父应用发起呼叫。这是一个例子:

//App Delegate in iOS Parent App 

#pragma mark Watch Kit Data Sharing

-(void)initializeWatchKit{
    if ([WCSession isSupported]){
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    }
}

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message{
    DLog(@"%@", message);
    [self callRestaurantWithNumber:[NSString formattedPhoneNumber:[message valueForKey:@"phone_number"]]];
}

-(void)callRestaurantWithNumber:(NSString *)formattedPhoneNumber{
    [[UIApplication sharedApplication]
     openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel:%@",
                                   formattedPhoneNumber]]];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [self initializeWatchKit];

    return YES;
}

现在在watchKit扩展中,您可以将数据发送回父应用程序,如下所示:

 override func willActivate() {
        super.willActivate()

    if WCSession.isSupported() {

        let defaultSession = WCSession.defaultSession()
        defaultSession.delegate = self
        defaultSession.activateSession()
        if defaultSession.reachable == true {
            let phoneNumberDict = [ "phone_number": "123-456-7890"]

            defaultSession.sendMessage(phoneNumberDict, replyHandler: nil, errorHandler: { (error) -> Void in
                print("THERE WAS AN ERROR SENDING DATA TO THE IOS APP: \(error.localizedDescription)")
            })

        } 
    }
}

然而,我在这种方法中遇到的一个限制是父应用程序需要打开以实际接收数据并进行调用。文档似乎表明当您从手表向ios父应用程序发送消息时,应用程序将在后台打开。然而,到目前为止,在我的测试中,在真实设备(手表和iphone)和模拟器上,父应用程序仅在父ios应用程序打开并且前置时才接收数据。即使ios父应用程序处于后台状态,它似乎仍然无法启动呼叫。我在watch os2iOS 9.0.2上运行此操作。

另一篇文章似乎也遇到了同样的问题。 Another watchKit SO post

链接到Apple文档: Apple Doc sendMessage: