Swift 并发症不会出现在图库中

Swift 并发症不会出现在图库中,swift,watchkit,watchos-3,Swift,Watchkit,Watchos 3,从手表界面启动我的应用程序很简单。它不显示任何数据,只显示一个图像。我遵循指南,但我无法将我的并发症添加到iPhone Watch应用程序中的并发症库中 public func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) { guard let tempalte =

从手表界面启动我的应用程序很简单。它不显示任何数据,只显示一个图像。我遵循指南,但我无法将我的并发症添加到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文件。

{
  "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"
}
项目设置。

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

故障排除。

{
  "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.ckcompositions
  • gallery.cn
    位于项目的根级别。与
    .xcodeproj
    相同的级别
更新。

{
  "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"
}
我添加了更多的代码。我还向Watch扩展目标添加了
ckcomposition.strings

再次阅读《苹果指南》和下面这句话让我想到:

例如,MyBundleName.ck


也许我们应该用bundle名称重命名生成的文件夹名称gallery。我已经试过了。到目前为止运气不好。

我不确定您的方法的其余部分是什么样子的,但在确保为我们支持的所有并发症类型添加了足够的信息之前,我遇到了同样的问题。然后生成相应的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);
}

这是一个很难解决的问题,我认为正确的解决方案是提供真实的图像(和文本)数据,但这似乎是可行的。

我不确定您的方法的其余部分是什么,但在我确保为我们支持的所有复杂类型添加了足够的信息之前,我遇到了同样的问题。然后生成相应的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);
}
这是一个很难解决的问题,我认为正确的解决方案是提供真实的图像(和文本)数据,但这似乎是可行的。

我再次观看,注意到
ComplicationController
在目标首选项中有前缀
$(产品模块名称)

我的项目没有这个前缀,我很快就发现CompliationController方法从未调用过。因为这是我们设置
tintColor
时的位置,所以会显示默认值

我通过删除我的手表应用程序和手表扩展目标并从头开始创建新的应用程序来解决这个问题。前缀出现在Xcode中,我可以在Simulator中运行的Complements Gallery中看到我的应用程序图标。

我再次观看并注意到
ComplementController
在目标首选项中有前缀
$(产品模块名称)

我的项目没有这个前缀,我很快就发现CompliationController方法从未调用过。因为这是我们设置
tintColor
时的位置,所以会显示默认值


我通过删除我的手表应用程序和手表扩展目标并从头开始创建新的应用程序来解决这个问题。前缀出现在Xcode中,我可以在Simulator中运行的Complements Gallery中看到我的应用程序图标。

在我2020年的情况下,watchOS7上的复杂度很好,但我的应用程序也支持WatchOS5,但复杂度不在那里,因此我将此添加到watch extension 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>
CLKComplicationPrincipalClass
$(产品\模块名称)。复杂控制器
CLK复杂支持家庭
CLKCompletionFamilyModularsmall
CLKComplicationFamilymollarge
CLK复杂家庭小
CLK复合家庭小型公寓
CLK复杂家族大型
CLK复杂家庭循环购物中心
CLK复杂家庭额外费用

在我2020年的案例中,watchOS7上的并发症没有问题,但我的应用程序也支持WatchOS5,但没有并发症,因此我将此添加到watch extension 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>
CLKComplicationPrincipalClass
$(产品模块名称)。复杂控制器
CLK复杂支持家庭
CLKComplicationFamilymodelarsmall
CLKComplicationFamilymollarge
CLK复杂家庭小
CLK复合家庭小型公寓
CLK复杂家族大型
CLK复杂家庭循环购物中心
CLK复杂家庭额外费用

我在
buildTemplate()方法中也做了完全相同的事情。我提供了真实的图像。你也设置了文本?您是否尝试过设置断点并查看它是否崩溃?这就是我发现我需要添加缺少的文本的原因。我没有添加任何文本,因为我的复杂性只是一张图片。我将尝试使用断点并添加文本,谢谢。迈克,我已经更新了问题。未调用断点。我添加了文本文件和字符串文件。@MikeWelsh,您是如何将所有必需的图像大小放在一个“模板”名称下的?我在
buildTemplate()
方法中也做了同样的事情。我提供了真实的图像。你也设置了文本?您是否尝试过设置断点并查看它是否崩溃?这就是我发现我需要添加缺少的文本的原因。我没有添加任何文本,因为我的复杂性只是一张图片。我将尝试使用断点并添加文本,谢谢。迈克,我已经更新了问题。未调用断点。我已经添加了文本文件和字符串文件。@MikeWelsh,您是如何将所有必需的图像大小放在一个“模板”名称下的?不需要$(产品模块名称),没有这个就可以工作。只要让控制器变得复杂就足够了。正确答案来自Mike。不需要$(PRODUCT\u MODULE\u NAME),没有这个就可以工作。只要让控制器变得复杂就足够了。正确答案来自迈克。