Осложнение не появляется в галерее
У меня есть простое усложнение для запуска моего приложения из Watch Face. Он не показывает никаких данных, просто отображает изображение. Я следовал инструкциям "Добавление осложнений в галерею", но не смог добавить свое усложнение в галерею осложнений в приложении 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
}
}
файл усложнения Manifest.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"
}
Настройки проекта.
Поиск проблемы.
- Пытался сбросить симуляторы.
- Пробовал как на реальном устройстве, так и на симуляторе.
- Пакет Complication Bundle сохраняется как "Создать ссылку на папку" путем перетаскивания.
gallery.ckcomplication
gallery.ckcomplication
находится в проекте на корневом уровне. Тот же уровень, что и.xcodeproj
,
Обновить.
Я добавил больше кода. Я также добавил ckcomplication.strings
к цели расширения часов.
Чтение руководства Apple снова и следующая строка заставили меня задуматься:
Например, MyBundleName.ckcomplication.
Возможно, мы предполагаем переименовать сгенерированную галерею имен папок в имя пакета. Я пытался это сделать. Пока не повезло.
2 ответа
Я снова смотрю это видео и заметил ComplicationController
имеет префикс $(PRODUCT_MODULE_NAME)
в целевых настройках:
Мой проект не имел этого префикса, я быстро обнаружил, что методы ComplicationController никогда не вызывались. Потому что это было место, когда мы установили tintColor
, сложность по умолчанию была отображена.
Я решил эту проблему, удалив мое приложение для часов и отслеживая цели расширения и создавая новые с нуля. Префикс появился в Xcode, и я мог видеть иконку моего приложения в галерее осложнений, запущенной в симуляторе.
Я не уверен, как выглядит остальная часть вашего метода, но у меня была та же проблема, пока я не убедился, что добавил достаточно информации для всех типов сложности, которые мы поддерживаем. Затем он генерирует соответствующие файлы 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);
}
Это глупо, и я думаю, что правильным решением является предоставление реальных данных (и текстовых) данных, но, похоже, это работает.
В моем случае в 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>