- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 SwiftUI 和 Firebase 还是很陌生。最近,作为一个爱好,我一直在为我的学校开发一个应用程序。在 Xcode 12 发布后,我决定尝试一些新功能,例如 Widgets。但是,由于我的应用程序从 Firebase 获取数据,我遇到了一些问题。我最近的问题是这个“线程 1:”无法获取 FirebaseApp 实例。请在使用 Firestore 之前调用 FirebaseApp.configure()。我不完全确定将“FirebaseApp.configure()”放在哪里,因为 WidgetKit 没有 AppDelegate.swift。我的代码如下。
编辑:
我重新安排了我的代码,以便我现在从原始 iOS 应用程序数据模型中获取数据。因此,我没有在 WidgetKit Swift 文件中导入 Firebase。但是,我仍然收到相同的错误(“SendProcessControlEvent:toPid: 遇到错误:错误域=com.apple.dt.deviceprocesscontrolservice Code=8”和“-> 0x7fff5bb6933a <+10>: jae 0x7fff5bb69344 ; <+20> -线程 1:“无法获取 FirebaseApp 实例。请在使用 Firestore 之前调用 FirebaseApp.configure()”)。我还包含了@Wendy Liga 的代码,但我仍然遇到同样的错误。我的新代码如下:
iOS 应用数据模型
import Foundation
import SwiftUI
import Firebase
import FirebaseFirestore
struct Assessment: Identifiable {
var id:String = UUID().uuidString
var Subject:String
var Class:Array<String>
var Day:Int
var Month:String
var Title:String
var Description:String
var Link:String
var Crit:Array<String>
}
class AssessmentsViewModel:ObservableObject {
@Published var books = [Assessment]()
private var db = Firestore.firestore()
// Add assessment variables
@Published var AssessmentSubject:String = ""
//@Published var AssessmentClass:Array<String> = [""]
@Published var AssessmentDay:Int = 1
@Published var AssessmentMonth:String = "Jan"
@Published var AssessmentTitle:String = ""
@Published var AssessmentDescription:String = ""
@Published var AssessmentLink:String = ""
@Published var AssessmentCrit:Array<String> = [""]
@Published var AssessmentDate:Date = Date()
func fetchData() {
db.collection("AssessmentsTest").order(by: "date").addSnapshotListener { (QuerySnapshot, error) in
guard let documents = QuerySnapshot?.documents else {
print("No documents")
return
}
self.books = documents.map { (QueryDocumentSnapshot) -> Assessment in
let data = QueryDocumentSnapshot.data()
let Subject = data["subject"] as? String ?? ""
let Class = data["class"] as? Array<String> ?? [""]
let Day = data["day"] as? Int ?? 0
let Month = data["month"] as? String ?? ""
let Title = data["title"] as? String ?? ""
let Description = data["description"] as? String ?? ""
let Link = data["link"] as? String ?? ""
let Crit = data["crit"] as? Array<String> ?? [""]
return Assessment(Subject: Subject, Class: Class, Day: Day, Month: Month, Title: Title, Description: Description, Link: Link, Crit: Crit)
}
}
}
func writeData() {
let DateConversion = DateFormatter()
DateConversion.dateFormat = "DD MMMM YYYY"
let Timestamp = DateConversion.date(from: "20 June 2020")
db.collection("AssessmentsTest").document(UUID().uuidString).setData([
"subject": AssessmentSubject,
"month": AssessmentMonth,
"day": AssessmentDay,
"title": AssessmentTitle,
"description": AssessmentDescription,
"link": AssessmentLink,
"crit": AssessmentCrit,
"date": AssessmentDate
]) { err in
if let err = err {
print("Error writing document: \(err)")
} else {
print("Document successfully written!")
}
}
}
}
WidgetKit View
struct WidgetsMainView: View {
@ObservedObject private var viewModel = AssessmentsViewModel()
var body: some View {
HStack {
Spacer().frame(width: 10)
VStack(alignment: .leading) {
Spacer().frame(height: 10)
ForEach(self.viewModel.books) { Data in
HStack {
VStack {
Text(String(Data.Day))
.bold()
.font(.system(size: 25))
Text(Data.Month)
}
.padding(EdgeInsets(top: 16, leading: 17, bottom: 16, trailing: 17))
.background(Color(red: 114/255, green: 112/255, blue: 110/255))
.foregroundColor(Color.white)
.cornerRadius(10)
VStack(alignment: .leading, spacing: 0) {
Text("\(Data.Subject) Crit \(Data.Crit.joined(separator: " + "))")
.bold()
if Data.Title != "" {
Text(Data.Title)
} else {
Text(Data.Class.joined(separator: ", "))
}
}
.padding(.leading, 10)
}
}
.onAppear {
viewModel.books.prefix(2)
}
Spacer()
}
Spacer()
}
}
}
WidgetKit @main
class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
FirebaseApp.configure()
return true
}
}
@main
struct AssessmentsWidget: Widget {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
private let kind: String = "Assessments Widget"
public var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider(), placeholder: PlaceholderView()) { entry in
AssessmentsWidgetEntryView(entry: entry)
}
.configurationDisplayName("Assessments Widget")
.description("Keep track of your upcoming assessments.")
.supportedFamilies([.systemMedium])
}
}
最佳答案
您的主应用程序需要将数据传递给您的扩展程序,这可以通过允许您的应用程序使用“应用程序组”功能来实现。 App Groups 所做的是,它创建了一个容器,您的应用可以在其中保存数据,以便您与应用扩展共享。因此,请按照以下步骤启用“应用程序组”。
1. 选择您的主要应用目标>签名和功能,然后点击+功能并选择“应用组”
2. 点击“+”添加新容器,并在分组后为其添加名称。示例:“group.com.widgetTest.widgetContainer”
在主应用程序上创建“应用程序组”后,您应该在“WidgetKit 扩展”目标上采取相同的步骤。这一次,您应该能够从主应用程序中选择您已经拥有的容器,而不是创建容器。你可以在 YouTube 上找到一个很好的视频,在这里 How to Share UserDefaults with app extensions 上很好地解释了这个过程。
我建议的下一步是创建一个 Swift 包或框架,并添加一个新的模型对象,这个模型对象是您将从主应用程序传递到 WidgetKit 扩展的模型对象。我选择了一个 Swift 包。
为此,请按照下列步骤操作:
1.文件>新建>Swift包
可以看到来自 WWDC19 的一个很好的视频 here
2. 在您的 Swift 包中,在“Sources”文件夹中,创建一个自定义模型,您将在主应用程序和 WidgetKit 扩展中使用它
使您的对象符合“可编码”并且它是公共(public)的。
重要 确保导入“Foundation”,以便在对对象进行解码/编码时,它会正确执行。
3. 将您的包添加到您的主应用程序和 WidgetKit 扩展
let mySharedObject = MySharedObject(name: "My Name", lastName: "My Last Name")
do {
let data = try JSONEncoder().encode(mySharedObject)
/// Make sure to use your "App Group" container suite name when saving and retrieving the object from UserDefaults
let container = UserDefaults(suiteName:"group.com.widgetTest.widgetContainer")
container?.setValue(data, forKey: "sharedObject")
/// Used to let the widget extension to reload the timeline
WidgetCenter.shared.reloadAllTimelines()
} catch {
print("Unable to encode WidgetDay: \(error.localizedDescription)")
}
然后在您的 WidgetKit 扩展中,您想从 UserDefaults 中检索您的对象,对其进行解码,您应该一切顺利。
关于firebase - iOS 14 WidgetKit + SwiftUI + Firebase?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62618123/
点击 WidgetKit WidgetKit 会自动启动其父应用程序。如何检测我的应用程序是否是从其 WidgetKit WidgetKit 扩展启动的? 我无法在应用程序 AppDelegate 中
我添加了带有配置意图的 WidgetKit 扩展。 出于日志记录的目的,我尝试记录应用程序用户拥有的 WidgetKit 数量 WidgetCenter.shared.getCurrentConfi
我想检查用户是否将我的 WidgetKit 添加到主屏幕,是否有 API?我找不到一个。 WidgetCenter.getCurrentConfigurations返回应用程序提供的所有可用 Widg
Apple Notes WidgetKit 展示了理想的示例。添加 Apple Notes WidgetKit 时,WidgetKit 会继续为新 WidgetKit 分配一个 IntentConfi
我有我的图像 Assets.xcassets,并尝试将它加载到我的 WidgetKit View 中。为了在 WidgetKit 中也使用图像,我已经为 WidgetKit 扩展设置了目标成员资格。但
我正在使用 UIKit应用程序并添加了一个 WidgetKit SwiftUI和 Widgetkit . 现在我想在用户执行主应用程序之一的操作时更新 WidgetKit 。 通常我应该使用 Widg
我想知道你们中是否有人知道 SwiftUI 中的系统可以在外观从 light 模式更改为 dark 模式时更新 Widget,反之亦然。 我可以更改文本和图像,但我使用一种方法来显示 map 的屏幕截
我想知道你们中是否有人知道 SwiftUI 中的系统可以在外观从 light 模式更改为 dark 模式时更新 Widget,反之亦然。 我可以更改文本和图像,但我使用一种方法来显示 map 的屏幕截
我正在尝试将我的应用程序 WidgetKit 的背景颜色设置为透明,但遇到了一些问题。 通过设置颜色可以正常工作:.background(Color.white) 但我不知道如何让它像这样透明: 我试
在网上搜索发现老版本的widgets有如下内存限制: Respond appropriately to user interactions. Perform well (in particular,
我正在开发一个带有两个动态参数的 WidgetKit WidgetKit 。其中一个参数仅限于第一个允许的选项。假设第一个是船长,第二个是船长的船。允许的配置可能是(忽略佳能): Captains:
我目前正在为我的应用程序设计一个 WidgetKit ,基本上, WidgetKit 应该由三个按钮组成。到目前为止,我没有找到任何关于如何向 iOS Widget Extension 添加按钮的教程
我的应用程序需要最新数据,但主应用程序可能有旧数据。 所以我想请求主应用程序更新其数据。 是否可以? 如果不是,我想知道任何替代方法。 ( WidgetKit 是否应该向服务器请求最新数据??) 谢谢
我正在为 iOS 开发 WidgetKit ,但我真的不知道如何下载 WidgetKit 的图像。 WidgetKit 当前下载一组对象,每个对象都有一个图像的 URL。这个想法是每个对象都会产生 S
我正在开发使用 widgetkit 扩展的应用程序。我遇到了一个奇怪的问题,比如 WidgetKit 在开发端正确显示,但是当我让应用程序上线时,它会向用户显示空白(黑色) WidgetKit 。 开
更新:我尝试将时间轴上的策略设置为 .atEnd ,因为只有一个条目。这并没有什么不同。我在 RSS Parser 文件和 AppDelegate 中都尝试过运行 WidgetCenter reloa
我有一个用户可以登录的应用程序。如果用户已登录,那么我会为我的 WidgetKit 显示一个占位符,并且可以通过意图扩展对其进行配置。 该配置有两个选项: 第一个选项取决于当前登录用户的用户名。 第二
我正在开发电池 WidgetKit ,但在更新电池电量时遇到问题经常够了。每次电池百分比变化时,我都希望更新 WidgetKit 。但是从我所做的所有阅读来看,这似乎是不可能的。我尝试每 5 分钟和每
我正在尝试构建一个更好的 WidgetKit ,我希望每次电池状态或电量变化时都能刷新 WidgetKit 。我知道两者都需要添加通知。所以我的逻辑是,当有关电池状态的通知发生变化时,我想刷新时间线。
最近在玩 SwiftUI 和 WidgetKit,遇到了一个棘手的问题。我的 WidgetKit 似乎可以在 SwiftUI Canvas 中运行,但在模拟器或设备上构建时它完全是空的。 图片: 在
我是一名优秀的程序员,十分优秀!