我正在为iOS 10+构建一个iOS应用程序。该应用程序在Debug配置中构建良好,但在Release中未能编译引用WidgetCenter
的swift源代码。
即使我正在导入WidgetKit
并可选地嵌入框架,它也会输出错误Cannot find WidgetCenter in scope
。
import Foundation
import WidgetKit
class MyWidgetCenter: NSObject {
@available(iOS 14, *)
func reloadTimelines(_ kind: String) {
// this line causes error: cannot find 'WidgetCenter' in scope
WidgetCenter.shared.reloadTimelines(ofKind: kind)
}
@available(iOS 14, *)
func reloadAllTimelines() {
// this line causes error: cannot find 'WidgetCenter' in scope
WidgetCenter.shared.reloadAllTimelines()
}
}
编辑:当我设置Build Active Architecture Only
标志时,它在Release配置中为模拟器和我的连接设备(iPhone XR(构建得很好。只有当它为多个体系结构构建时,它才会编译失败。WidgetKit
是否存在我没有考虑的体系结构限制?
我认为WidgetKit应该支持armv7
体系结构,但它未能编译WidgetCenter
对armv7
的使用。
我的解决方法是包装WidgetCenter
语句,只支持armv7
之外我需要的体系结构
class MyWidgetCenter: NSObject {
@available(iOS 14, *)
func reloadTimelines(_ kind: String) {
#if arch(arm64) || arch(i386) || arch(x86_64)
WidgetCenter.shared.reloadTimelines(ofKind: kind)
#endif
}
@available(iOS 14, *)
func reloadAllTimelines() {
#if arch(arm64) || arch(i386) || arch(x86_64)
WidgetCenter.shared.reloadAllTimelines()
#endif
}
}
您应该首先在文件中添加import WidgetKit
,然后在下面添加函数reloadAllWidget
。
@objc public func reloadAllWidget() {
#if arch(arm64) || arch(i386) || arch(x86_64)
WidgetCenter.shared.reloadAllTimelines()
#endif
}
当你想更新时间线时,你可以使用self.reloadAllWidget()
在我的情况下,我只需要检查arm64
。
@available(iOS 14, *)
@objc public func reloadWidget() {
// Compiler error fix. Arm64 - current 64-bit ARM CPU architecture,
// as used since the iPhone 5S and later (6, 6S, SE and 7),
// the iPad Air, Air 2 and Pro, with the A7 and later chips.
#if arch(arm64)
WidgetCenter.shared.reloadAllTimelines()
#endif
}