我的应用程序中有一个CoreML模型。
在运行时,应该在iOS8 8-10上禁用预测功能,在iOS11上禁用该功能。
为了能够在所有使用CoreML的类上编译,我添加了以下内容:
@查阅(iOS 11.0,*)
但是,.mlmodel在每次重建时生成Swift代码,丢弃所有注释。因此,创建编译错误如下:
'MLModel‘只能在iOS 11.0或更高版本上使用。
在Xcode9中是否有一种方法可以使mlmodel iOS11只存在?
编辑:这个bug是在XCode 9 beta 4中修复的,不再需要解决方法了。
发布于 2017-07-20 14:22:59
Upd.07/25/17:苹果公司刚刚推出了新API,用于在设备上编译模型。这意味着,您现在可以避免步骤1-4。
sudo xcode-select --switch /Applications/Xcode-beta.app/Contents/Developer
。xcrun coremlcompiler compile /path/to/MyModel.mlmodel /path/to/output/folder
。MyModel.mlmodelc
放入应用程序包中。MyModel.swift
)手动添加到项目中,并使用@available(iOS 11.0, *)
对其进行注释。
警告:,我还没有尝试将这样的应用上传到AppStore。我已经在我的测试设备上试过了,它可以工作,我只是不确定它在发布到Appstore之后是否继续工作。
发布于 2017-07-21 17:01:36
这听起来像是一个bug --生成的Swift代码应该包括与您的代码一样的@available
注释,这样您的应用程序就可以编译、在运行iOS 11时调用它,并且在运行旧的iOS版本时不需要调用它。
我强烈推荐把那个错误提交给苹果公司,这样他们就能在Xcode 9 GM之前修复它。
同时,您可以禁用模型的代码生成。在代码项目设置中,在“目标生成设置”下,查找“CoreML代码生成语言”,并将其更改为“无”。
当然,这将阻止您在项目中使用生成的Swift类。这给您留下了两个选择:
MLModel(contentsOf: url)
而不是MyModelClass()
等等)很方便地,您已经看到但没有使用的生成的Swift类显示了您需要的所有API调用。@available
声明,以便将最小部署目标更改为iOS 10或更高版本。在这两种情况下,如果您更改模型,您可能需要重新做一些工作。
https://stackoverflow.com/questions/45215789
复制相似问题