Усложнение не отображается в галерее

У меня есть простая сложность для запуска моего приложения с циферблата. Он не показывает никаких данных, просто отображает изображение. Я выполнил добавление осложнений в руководство «Галерея», но мне не удалось добавить свое усложнение в галерею усложнений в приложении iPhone Watch.

public func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) {

    guard let tempalte = buildTemplate(for: complication) else {
        fatalError("Unsuported Complication Family.")
    }
    handler(tempalte)
}

// Helper function to build template.

fileprivate func buildTemplate(for complication: CLKComplication) -> CLKComplicationTemplate? {

    let textProvider = CLKSimpleTextProvider.localizableTextProvider(withStringsFileTextKey: "Caffeine")

    switch complication.family {
    case .modularSmall:

        let icon = #imageLiteral(resourceName: "Complication/Modular")

        let complicationTemplate = CLKComplicationTemplateModularSmallSimpleImage()
        complicationTemplate.imageProvider = CLKImageProvider(onePieceImage: icon)

        return complicationTemplate

    case .circularSmall:

        let icon = #imageLiteral(resourceName: "Complication/Circular")

        let complicationTemplate = CLKComplicationTemplateCircularSmallSimpleImage()
        complicationTemplate.imageProvider = CLKImageProvider(onePieceImage: icon)
        return complicationTemplate

    case .utilitarianSmall:

        let icon = #imageLiteral(resourceName: "Complication/Utilitarian")

        let complicationTemplate = CLKComplicationTemplateUtilitarianSmallSquare()
        complicationTemplate.imageProvider = CLKImageProvider(onePieceImage: icon)
        return complicationTemplate

    case .utilitarianLarge:

        let icon = #imageLiteral(resourceName: "Complication/Utilitarian")

        let complicationTemplate = CLKComplicationTemplateUtilitarianLargeFlat()
        complicationTemplate.imageProvider = CLKImageProvider(onePieceImage: icon)
        complicationTemplate.textProvider = textProvider
        return complicationTemplate

    case .utilitarianSmallFlat:

        let icon = #imageLiteral(resourceName: "Complication/Utilitarian")

        let complicationTemplate = CLKComplicationTemplateUtilitarianSmallFlat()
        complicationTemplate.imageProvider = CLKImageProvider(onePieceImage: icon)
        complicationTemplate.textProvider = textProvider
        return complicationTemplate

    case .extraLarge:

        let icon = #imageLiteral(resourceName: "Complication/Extra Large")

        let complicationTemplate = CLKComplicationTemplateExtraLargeSimpleImage()
        complicationTemplate.imageProvider = CLKImageProvider(onePieceImage: icon)
        return complicationTemplate

    default:
        return nil
    }
}

файл compplicationManifest.json.

{
  "supported complication families" : {
    "3" : "B82ADE2C-045D-491D-87DD-C24148804480.json",
    "6" : "A332202A-4B7B-49E0-83FB-DB398089E4FE.json",
    "4" : "817476CB-1683-4604-A76D-2977236448AD.json",
    "2" : "50AB27ED-0FA3-41AD-A3E7-CC9C62E48D82.json",
    "0" : "DBE31877-7BB0-4671-B065-6FE00333929E.json",
    "7" : "96966B70-AB8D-4DB3-AB64-AFDF1F09EB88.json"
  },
  "client ID" : "net.borisy.ProductDisplayName.watchkitapp.watchkitextension"
}

Настройки проекта.

Устранение неполадок.

  • Пробовал сбросить симуляторы.
  • Пробовал и на реальном устройстве и на Симуляторе.
  • Пакет усложнений сохранен как «Создать ссылку на папку» путем перетаскивания gallery.ckcomplication
  • gallery.ckcomplication находится в проекте на корневом уровне. Тот же уровень, что и .xcodeproj.

Обновить.

Я добавил больше кода. Я также добавил ckcomplication.strings в цель расширения просмотра.

Повторное чтение руководства Apple и следующая строка заставили меня задуматься:

Например, MyBundleName.ckcomplication.

Возможно, мы предполагаем переименовать сгенерированное имя папки gallery в имя пакета. Я пытался это сделать. Пока не повезло.


person Boris Y.    schedule 26.12.2016    source источник


Ответы (3)


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

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

- (void)getLocalizableSampleTemplateForComplication:(CLKComplication *)complication
                                        withHandler:(void(^)(CLKComplicationTemplate *complicationTemplate))handler {
// This method will be called once per supported complication,
// and the results will be cached
  UIImage *templateImage = [UIImage imageNamed:@"template"];
  CLKImageProvider *image =
      [CLKImageProvider imageProviderWithOnePieceImage:templateImage];
  CLKTextProvider *text = [CLKTextProvider textProviderWithFormat:@""];
  CLKComplicationTemplate *complicationTemplate;

  switch (complication.family) {
    case CLKComplicationFamilyCircularSmall: {
      CLKComplicationTemplateCircularSmallSimpleImage *small =
          [[CLKComplicationTemplateCircularSmallSimpleImage alloc] init];
      small.imageProvider = image;
      complicationTemplate = small;
      break;
    }
    case CLKComplicationFamilyExtraLarge: {
      CLKComplicationTemplateExtraLargeSimpleImage *large =
          [[CLKComplicationTemplateExtraLargeSimpleImage alloc] init];
      large.imageProvider = image;
      complicationTemplate = large;
      break;
    }
    case CLKComplicationFamilyModularLarge: {
      // Unexpected complication type.
      break;
    }
    case CLKComplicationFamilyModularSmall: {
      CLKComplicationTemplateModularSmallSimpleImage *small =
          [[CLKComplicationTemplateModularSmallSimpleImage alloc] init];
      small.imageProvider = image;
      complicationTemplate = small;
      break;
    }
    case CLKComplicationFamilyUtilitarianLarge: {
      CLKComplicationTemplateUtilitarianLargeFlat *large =
          [[CLKComplicationTemplateUtilitarianLargeFlat alloc] init];
      large.imageProvider = image;
      large.textProvider = text;
      complicationTemplate = large;
      break;
    }
    case CLKComplicationFamilyUtilitarianSmall: {
      CLKComplicationTemplateUtilitarianSmallSquare *small =
          [[CLKComplicationTemplateUtilitarianSmallSquare alloc] init];
      small.imageProvider = image;
      complicationTemplate = small;
      break;
    }
    case CLKComplicationFamilyUtilitarianSmallFlat: {
      CLKComplicationTemplateUtilitarianSmallFlat *small =
          [[CLKComplicationTemplateUtilitarianSmallFlat alloc] init];
      small.imageProvider = image;
      small.textProvider = text;
      complicationTemplate = small;
      break;
    }
  }
  handler(complicationTemplate);
}

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

person Mike Welsh    schedule 05.01.2017
comment
Я также делаю то же самое в методе buildTemplate(). Я предоставляю реальный образ. - person Boris Y.; 06.01.2017
comment
И вы также устанавливаете текст? Вы пытались поставить точку останова и посмотреть, не сработает ли она? Вот как я обнаружил, что мне нужно добавить недостающий текст. - person Mike Welsh; 07.01.2017
comment
Я не добавляю никакого текста, потому что мое усложнение — это просто картинка. Попробую поэкспериментировать с точками останова и добавить текст, спасибо. - person Boris Y.; 15.01.2017
comment
Майк, я обновил вопрос. Точка останова не вызывается. Я добавил текстовый файл и файл строк. - person Boris Y.; 19.01.2017
comment
@MikeWelsh, как вам удалось поместить все необходимые размеры изображений под одним именем шаблона? - person kelin; 21.06.2017
comment
@kelin Я не считаю, что размер изображения имеет значение при создании изображения шаблона выше. Система изменит его размер при создании набора файлов ckcomplication. Я использовал шаблон с одним изображением выше, но если я посмотрю на сгенерированное мной ckcomplication, то увидим, что изображения бывают разных размеров. - person Mike Welsh; 21.06.2017
comment
@MikeWelsh, не могли бы вы сказать мне, каков был размер исходного изображения шаблона, который был добавлен в ваш проект? - person kelin; 22.06.2017
comment
@kelin Исходный размер изображения был 80x80 в 2-кратном активе изображения. - person Mike Welsh; 22.06.2017
comment
WatchOS4-5 -> Будьте осторожны с названием изображений. Apple использует папку Complication и исправляет имена, такие как Modular и т. Д., Для различных размеров, и лучше всего оставить их такими, какие они есть, и указать их, например, как Complication/Modular. Другие активы получают имя импортированного файла, но не здесь, и из-за этого я потерял часы! Все API и их документы, надежность отладки и тестирования, а также вся среда разработки Apple Watch — особенно верно в случае сложностей, таких как форматы и размеры изображений, именование — действительно беспорядочны, а не настоящая работа Apple, как я вижу. - person BootMaker; 27.06.2018

Я снова смотрю это видео и заметил, что ComplicationController имеет префикс $(PRODUCT_MODULE_NAME) в целевых настройках. :

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

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

person Boris Y.    schedule 20.11.2017
comment
НЕ нужен этот $(PRODUCT_MODULE_NAME), он работает и без этого. Просто ComplicationController достаточно. Правильный ответ от Майка. - person BootMaker; 27.06.2018

В моем случае в 2020 году осложнения были в порядке на watchOS7, но мое приложение также поддерживало WatchOS5, но осложнений не было, поэтому я добавил это в файл info.plist расширения просмотра:

<key>CLKComplicationPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).ComplicationController</string>
<key>CLKComplicationSupportedFamilies</key>
<array>
    <string>CLKComplicationFamilyModularSmall</string>
    <string>CLKComplicationFamilyModularLarge</string>
    <string>CLKComplicationFamilyUtilitarianSmall</string>
    <string>CLKComplicationFamilyUtilitarianSmallFlat</string>
    <string>CLKComplicationFamilyUtilitarianLarge</string>
    <string>CLKComplicationFamilyCircularSmall</string>
    <string>CLKComplicationFamilyExtraLarge</string>
</array>
person Ahmadreza    schedule 25.11.2020