2016-12-26 3 views
1

У меня есть простое осложнение для запуска моего приложения из Face Watch. Он не показывает никаких данных, просто отображает изображение. Я последовал за Adding Complications to the Gallery, но я не смог добавить свое осложнение в галерею Complications в приложении 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 
    } 
} 

complicationManifest.json file.

{ 
    "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" 
} 

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

Xcode Complication Configuration

неисправностей.

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

Обновление.

Я добавил еще код. Я также добавил ckcomplication.strings в Target Extension Target.

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

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

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

ответ

0

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

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

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

2

Я не уверен, как выглядит остальная часть вашего метода, но у меня была такая же проблема, пока я не удостоверился, что добавил дополнительную информацию для всех типов осложнений, которые мы поддерживаем. Затем он сгенерировал соответствующие файлы 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); 
} 

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

+0

Я также делаю то же самое в методе 'buildTemplate()'. Я предоставляю реальный образ. –

+0

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

+0

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