Как вызвать тактильное оповещение, когда неактивные часы получают локальное уведомление

Я работаю над приложением таймера для Apple Watch.

В определенное время (конец таймера) iPhone запускает запланированный UILocalNotification, который на неактивных Apple Watch должен вызвать тактильное оповещение, чтобы сообщить пользователю, что таймер закончился.

Я сделал это, поскольку таймеры не продолжают работать на Apple Watch, когда часы неактивны.

Проблема, с которой я столкнулся:

а) уведомление иногда отображается на iPhone, а не на часах Apple (судя по другим сообщениям, я боюсь, что это нельзя изменить ...)

б) на часах не отображается тактильное оповещение (чисто отображение уведомления, и это только в следующий раз, когда пользователь активирует часы, а не в то время, когда уведомление фактически запускается)

func sendAwakeNotification(nextTime:NSDate) {
    print("AppDelegate: - sendAwakeNotification")

    dispatch_async(dispatch_get_main_queue()) { () -> Void in

        let localNotification = UILocalNotification()
        localNotification.fireDate = nextTime
        localNotification.timeZone = NSTimeZone.defaultTimeZone()
        localNotification.alertBody = "Finished Step"
        localNotification.alertTitle = "Alert"

        localNotification.soundName = UILocalNotificationDefaultSoundName

        localNotification.category = "myTimer"
        let userInfo: [NSObject : AnyObject] = [
            "notification_id" : "myTimerNotification"
        ]
        localNotification.userInfo = userInfo

        UIApplication.sharedApplication().scheduleLocalNotification(localNotification)

    }
}

Код в уведомлении

override func didReceiveLocalNotification(localNotification: UILocalNotification, withCompletion completionHandler: ((WKUserNotificationInterfaceType) -> Void)) {

    print("received notification")

    dispatch_async(dispatch_get_main_queue()) { () -> Void in
        let notificationCenter = NSNotificationCenter.defaultCenter()
        notificationCenter.postNotificationName(NotificationAlertFromPhone, object: nil)
    }

    completionHandler(.Custom)
}

Я пытался вызвать тактильное оповещение непосредственно в NotificationController (WKInterfaceDevice.currentDevice().playHaptic(WKHapticType.Notification)), но это не сработало. Поэтому я вернулся к отправке уведомления, которое должно быть получено ExtensionDelegate, чтобы вызвать тактильную реакцию.

Вот код в ExtensionDelegate:

private func setupNotificationCenter() {
    print("ExtensionDelegate:  - setupNotificationCenter")

    notificationCenter.addObserverForName(NotificationAlertFromPhone, object: nil, queue: nil) { (notification:NSNotification) -> Void in
        WKInterfaceDevice.currentDevice().playHaptic(WKHapticType.Notification)
    }
}

person TPeter    schedule 12.05.2016    source источник


Ответы (2)


Где отображаются уведомления

а) уведомление иногда отображается на iPhone, а не на часах Apple Watch (судя по другим сообщениям, я боюсь, что это нельзя изменить ...)

Это правильно. Задача iOS - определить, где показывать уведомление.

  • Если ваш iPhone разблокирован, вы будете получать уведомления на iPhone, а не на Apple Watch.

  • Если ваш iPhone заблокирован или находится в спящем режиме, вы будете получать уведомления на Apple Watch, если только Apple Watch не заблокированы вашим паролем.

Когда в будущем сработает ваше локальное уведомление, оно может отображаться на телефоне. В этом случае часы вообще не получат никаких уведомлений.

Когда уведомление обрабатывается часами

б) на часах не отображается тактильное оповещение (чисто отображение уведомления, и это только в следующий раз, когда пользователь активирует часы, а не в то время, когда уведомление фактически запускается)

Это правильно. Вы ожидаете, что didReceiveLocalNotification сработает на часах, но это происходит только тогда, когда часы активированы:

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

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

Обходной путь для вашего подхода

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

Лучшее решение

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

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

Сделать запрос функции

Настоящая проблема, которую вы пытаетесь решить, заключается в том, что только приложение таймера Apple может планировать свои собственные локальные уведомления.

Если вы еще этого не сделали, вы можете отправить запрос функции, попросив Apple разрешить сторонним разработчикам размещать локальные уведомления на watchOS.

person Community    schedule 13.05.2016
comment
Дорогой PetahChristian, спасибо за ответ. Моя проблема в том, что тактильная обратная связь вообще не воспроизводится. Ни стандартный при получении уведомления, ни тот, который я пытаюсь запустить программно. - person TPeter; 14.05.2016
comment
Вы проверили приложение «Часы» на iPhone в разделе «Звуки и тактильность»? Убедитесь, что настройки тактильной силы (и громкости оповещения) не уменьшены. Также убедитесь, что вашему приложению предоставлено соответствующее разрешение пользователя для локальных уведомлений .Sound, .Alert и .Badge. В противном случае звуки уведомлений не воспроизводятся. Вы найдете настройки для конкретного приложения в приложении «Настройки» в разделе «Уведомления». - person ; 14.05.2016
comment
спасибо PetahChristian, это обычно самые очевидные ошибки ;-) дал разрешение только на оповещение, а не на звук ... - person TPeter; 14.05.2016
comment
Пожалуйста :) Помните, что целесообразнее описать реальную проблему - тактильная обратная связь не воспроизводится вообще - вместо предпринятое решение. - person ; 14.05.2016

Для всех, у кого есть эта проблема, также может быть, что звук не установлен. В официальной документации Apple Watch не указано, что вам нужно добавлять звук.

Не забудьте добавить:

content.sound = UNNotificationSound.default

person Joshua Bird    schedule 09.02.2020