Как создать усложнение Apple WatchOS5?

Я никогда не работал в WatchOS5 и хочу разработать горизонтальное усложнение (Modular large) для AppleWatch, например «Пульс». Идея состоит в том, что я бы отображал данные о частоте сердечных сокращений по-другому. Прямо сейчас я хочу развернуть усложнение на вахте разработки.

Я создал новый проект с добавленным флажком для «усложнения». Я вижу, что это добавило контроллер осложнений с заполнителями конфигурации временной шкалы.

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

  • Могу ли я предоставить только один стиль сложности (большой горизонтальный - модульный большой)
  • Нужно ли мне предоставлять какое-либо содержимое приложения для iPhone помимо управления логикой усложнения, или я могу обойтись без контроллера представления?
  • Я контролирую внешний вид своего усложнения, добавляя что-то в папку с ресурсами (в ней куча графических слотов)?

Извините за полный проект для начинающих, я не видел проекта, посвященного конкретно горизонтальному усложнению для watch OS 5.


person Alex Stone    schedule 26.09.2018    source источник


Ответы (2)


Вы должны быть в состоянии развернуть его немедленно, хотя это ничего не сделает. Посмотрите видео wwdc, объясняющее, как создать усложнение: видео.

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

Вам не обязательно поддерживать все стили усложнения.

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

Добавление вашей графики в каталог активов ничего не даст, вы должны ссылаться на нее при настройке шаблонов.

person ARMatt    schedule 27.09.2018

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

  • Ваши основные ресурсы приложения для телефона не видны приложению для часов
  • Ресурсы раскадровки ваших часов попадают в цель WatchKit
  • Ваши ресурсы, к которым осуществляется программный доступ, переходят в цель расширения отслеживания.

Оригинальные ответы:

  • Могу ли я предоставить только один стиль сложности (большой горизонтальный - модульный большой) - ДА
  • Нужно ли мне предоставлять какое-либо содержимое приложения для iPhone помимо управления логикой усложнения, или я могу обойтись без контроллера представления? ДА — для приложений отслеживания наложены ограничения на вычислительные мощности
  • Я контролирую внешний вид своего усложнения, добавляя что-то в папку с ресурсами (в ней куча графических слотов)? См. ниже — это и папка ресурсов, и заполнители

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

func getPlaceholderTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) {
// Pass the template to ClockKit.
if complication.family == .graphicRectangular {

    // Display a random number string on the body.
    let template = CLKComplicationTemplateGraphicRectangularLargeImage()
    template.textProvider = CLKSimpleTextProvider(text: "---")
    let image = UIImage(named: "imageFromWatchExtensionAssets") ?? UIImage()
    template.imageProvider = CLKFullColorImageProvider(fullColorImage: image)

    // Pass the entry to ClockKit.
    handler(template)
}else {
    handler(nil);
    return
}

}

отправка небольших пакетов на часы (изображения не отправляются!)

func updateHeartRate(with sample: HKQuantitySample){

    let context: [String: Any] = ["title": "String from phone"]
    do {
        try WCSession.default.updateApplicationContext(context)
    } catch {
        print("Failed to transmit app context")
    }
}

Передача изображений и файлов:

func uploadImage(_ image: UIImage, name: String, title: String = "") {

    let data: Data? = UIImagePNGRepresentation(image)

    do {
        let fileManager = FileManager.default
        let documentDirectory = try fileManager.url(for: .cachesDirectory,
                                                    in: .userDomainMask,
                                                    appropriateFor:nil,
                                                    create:true)
        let fileURL = try FileManager.fileURL("\(name).png")

        if fileManager.fileExists(atPath: fileURL.path) {
            try fileManager.removeItem(at: fileURL)
            try data?.write(to: fileURL, options: Data.WritingOptions.atomic)
        } else {
            try data?.write(to: fileURL, options: Data.WritingOptions.atomic)
        }

        if WCSession.default.activationState != .activated {
            print("session not activated")
        }
        fileTransfer = WCSession.default.transferFile(fileURL, metadata: ["name":name, "title": title])

    }
    catch {
        print(error)
    }
    print("Completed transfer \(name)")
}
person Alex Stone    schedule 19.11.2018