2015-05-22 3 views
2

Я разрабатываю расширение яблочного чата для уже существующего приложения.Инициировать звонок из яблочных часов

Приложение для наблюдения за часами имеет контакт с нами, где клиент может позвонить по бесплатному номеру.

Мой вопрос в том, как я могу начать звонить в яблочном часе при нажатии кнопки, а не сохранять свое приложение на переднем плане и начинать вызов.

В настоящее время я использую этот код для начала вызова

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

ответ

3

Примечание: это было верно на WatchOS 1, и может быть изменен с выпуском WatchOS 2.


От Ray Wenderlich WatchKit FAQ:

Может быть третьим Приложения-партнёры делают телефонные звонки из приложения для часов?

Нет общедоступного API, который позволяет инициировать телефонный звонок непосредственно из расширения WatchKit. Так как приложение iPhone для сопутствующих приложений также не может быть выведено на передний план, система молча игнорирует все телефонные звонки или openURL: запросы сопутствующего приложения iPhone.

2

Использование 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 os2 и iOS 9.0.2.

Из другого сообщения, которое также работает в одной и той же проблеме. Another watchKit SO post

Ссылка на документацию Apple, тоже: Apple Doc sendMessage:

Смежные вопросы