私はまだ SwiftUI と Firebase に慣れていません。最近、趣味で学校用のアプリを開発しています。Xcode 12 のリリース後、ウィジェットなどの新機能を試すことにしました。ただし、私のアプリは Firebase からデータを取得するため、いくつかの問題が発生しています。私の最近の問題は、この「スレッド 1:「FirebaseApp インスタンスの取得に失敗しました。Firestore を使用する前に FirebaseApp.configure() を呼び出してください」。ウィジェット用の AppDelegate.swift がないため、「FirebaseApp.configure()」をどこに配置すればよいか完全にはわかりません。私のコードは以下のとおりです。
編集: 元の iOS アプリ データ モデルからデータを取得するように、コードを再配置しました。したがって、ウィジェット Swift ファイル内で Firebase をインポートしていません。ただし、それでも同じエラーが発生します (「SendProcessControlEvent:toPid: エラーが発生しました: エラー Domain=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!")
}
}
}
}
ウィジェット ビュー
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()
}
}
}
ウィジェット @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])
}
}