我目前正在为我的应用程序创建第一个小部件。数据是通过 API 调用获取的。我想知道是否可以从应用程序发出此请求,然后将该请求的结果发送到小部件?(有点像 WatchConnectivity 对手表的作用)
感谢您的帮助 :-)
我有一个使用 Core Data + CloudKit 堆栈的应用程序。(核心数据在设备之间同步。)。现在我想在 iOS 14 小部件中显示来自 Core Data 的数据(在 WidgetKit 目标中查看)。
\n我的目标是让小部件中的数据也是来自核心数据的实际数据:即 \xe2\x80\x94 用户更改了设备 A 上的记录,稍后在设备 B(带有小部件)上更改了小部件中表示的记录。
\n我应该怎么做:
\na)为主应用程序目标和小部件目标添加应用程序组功能;并在小部件目标中获取核心数据。
\nb) 在主应用程序目标中获取核心数据,保存到文件(plist?、JSON?),然后在小部件中使用该文件。
\nc)在主应用程序目标中获取核心数据,从小部件目标中获取该数据。(是否可以?)
什么才是最合理的方式呢?感谢您的任何建议。
\n我正在为 ios 14 Home Widget 开发一个应用程序,在显示当前时间(数字时钟)时遇到一个问题,即该小部件没有每秒更新。众所周知,苹果不允许每秒触发时间线,有没有其他方法可以实时更新显示当前时间?
我尝试了这些方法,但没有按预期工作
class NetworkManager: ObservableObject {
@Published var dateIs = Date()
init() {
startTimer() // fetch data must be called at least once
}
private func startTimer() {
let t = RepeatingTimer(timeInterval: 3)
t.eventHandler = {
DispatchQueue.main.async() {
// your UI update code
print("Timer Fired")
self.dateIs = Date()
WidgetCenter.shared.reloadAllTimelines() // reload timelines
}
if(false){ //I know this makes no sense, but it works. Go figure...
t.suspend()
}
}
t.resume()
}
}
struct Provider: TimelineProvider { …Run Code Online (Sandbox Code Playgroud) 当我将cornerRadius修改器添加到 SwiftUI 布局中的视图或clipShape剪辑视图时,我的 iOS Widget 就会崩溃。
有人经历过同样的行为并找到解决方案吗?
我用 Xcode 12.1 和 iOS 14.1 模拟器尝试过,也用 Xcode 12.2 和 iOS 14.2 模拟器尝试过,得到了相同的结果。
导致小部件崩溃的示例代码:
Image("sampleimage")
.background(Color.blue)
.cornerRadius(20)
Run Code Online (Sandbox Code Playgroud) 我目前正在为我的应用程序设计一个小部件,基本上,该小部件应由三个按钮组成。到目前为止,我还没有找到任何关于如何向 iOS Widget 扩展添加按钮的教程。我看到例如谷歌地图在其小部件中使用按钮。
如何才能做到这一点?
<TLDR;> ; 尝试在小部件中通过 CTFontManagerRegisterFontsForURL 使用下载的字体在真实设备上不起作用。(适用于模拟器)。看起来注册字体可以,但是加载字体时出现权限问题
error 14:39:07.672799-0800 chronod [com.x.y.widgetx:widgetx:small:1536744920620481560@148.0/148.0/20.2] reload: could not decode view
error 14:39:07.674984-0800 kernel Sandbox: chronod(2128) deny(1) file-read-metadata /private/var/mobile/Containers/Shared/AppGroup/9B524570-1765-4C24-9E0C-15BC3982F0DC/downloadedFonts/Chewy/Chewy-Regular.ttf
error 14:39:07.675762-0800 kernel Sandbox: chronod(2128) deny(1) file-read-data /private/var/mobile/Containers/Shared/AppGroup/9B524570-1765-4C24-9E0C-15BC3982F0DC/downloadedFonts/Chewy/Chewy-Regular.ttf
Run Code Online (Sandbox Code Playgroud)
</TLDR;>
项目结构是:App目标+小部件扩展+小部件意图扩展
所有共享一个公共应用程序组 group.com.xyz并且所有文件处理都是使用
FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.x.y.z")
Run Code Online (Sandbox Code Playgroud)
这样就只使用共享容器。
使用主应用程序目标,下载字体“Chewy-Regular.ttf”并将其保存到共享 AppGroup 容器中。
现在可以通过以下方式加载字体:
CTFontManagerRegisterFontsForURL()
Run Code Online (Sandbox Code Playgroud)
并显示在主应用程序文本视图中:
Text("Testing...").font(Font.custom("Chewy-Regular", size: 20))
Run Code Online (Sandbox Code Playgroud)
现在添加一个使用此字体的 Widgetkit 小部件实例。
在 IntentTimelineProvider 的 getTimeLine() 和 getSnapShot() 中,我们通过 CTFontManagerRegisterFontsForURL 再次加载字体(这可能需要再次发生,因为小部件在与主应用程序不同的进程中运行?)。
在模拟器上,小部件将显示正确的字体。但在 iPhone7 真实设备上,小部件将显示“编辑的占位符视图”。
我在设备控制台中看到:
error 14:39:07.567120-0800 chronod No configuration found for configured widget identifier: D9BF75EE-4A04-441A-8C85-1507F7ECE379
fault 14:39:07.625600-0800 widgetxExtension -[EXSwiftUI_Subsystem beginUsing:withBundle:] unexpectedly …Run Code Online (Sandbox Code Playgroud) 我创建了一个小部件,并将其添加@main到声明的顶部。
但是,当我切换到 Widget 扩展目标并运行它时,我收到错误,'main' attribute can only apply to one type in a module因为@main我的主应用程序文件(入口点)中也有一个。我需要根据我是否要运行应用程序或小部件目标,@main从我不想运行的目标中删除,运行它,然后添加它。
我做错了什么吗?我试图查找这一点,但没有发现任何提及它的内容。
提前致谢!
我有一个带有 SwiftUIText计时器日期的小部件。它按预期倒计时。但是,当设备锁定时,计时器将被冻结。
要重现它,请将 SwiftUIText(_:style:)视图添加到小部件并将小部件放置在“今日视图”上。倒计时应该按预期进行。但是,请锁定手机,然后在锁定状态下查看“今日视图”。计时器被冻结。
以下是完整的工作示例代码:
import WidgetKit
import SwiftUI
struct Provider: TimelineProvider {
func placeholder(in context: Context) -> SimpleEntry {
SimpleEntry(date: Date())
}
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
let entry = SimpleEntry(date: Date())
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
var entries: [SimpleEntry] = []
// Generate a timeline consisting of five entries an hour apart, starting from the current date.
let currentDate = Date()
for …Run Code Online (Sandbox Code Playgroud) 我试图找出为什么我的小部件没有重新加载。我想entries从内部打印数组func getTimeline到控制台。
但是打印语句不会出现在控制台中。
如何让打印语句出现在控制台中?
这是在 iOS 17 Beta 8 和 Xcode 15 Beta 8 上
在我的应用程序中,我有一个在主应用程序和扩展之间共享的代码框架。在此框架中,我声明了 AppEntities 和 AppEnums。我可以从任何地方(主应用程序和扩展)完美地使用它们来处理按钮之类的事情,以及框架中声明的意图参数。它们也按预期出现在快捷方式中。问题是,当我尝试将它们用于 WidgetConfigurationIntent 的参数时,我收到Unable to determine value type for type <AppEnum>编译器错误。
框架已导入,我的 AppEnum 已公开。我还尝试使用 AppIntentsPackage API,但据我所知,这没有任何作用。到目前为止,我发现的唯一解决方法是基本上复制代码并使用不同的名称在扩展中重新声明 AppEnum,将其用作参数,然后初始化框架的 AppEnum 版本(这是我使用的标准意图)按钮和快捷方式期望)。这并不完全优雅且不易维护,因此我们将不胜感激适当的解决方案。有任何想法吗?