ios: fix background refresh crash, memoize migrateChatDatabase (#1103)

* ios: fix background refresh crash, memoize migrateChatDatabase

* store returned value
This commit is contained in:
Evgeny Poberezkin
2022-09-23 12:51:40 +01:00
committed by GitHub
parent 7c06961ff8
commit 6e9cf2ba91
7 changed files with 28 additions and 15 deletions
+8 -5
View File
@@ -82,12 +82,15 @@ class BGManager {
}
self.completed = false
DispatchQueue.main.async {
do {
try initializeChat(start: true)
} catch let error {
fatalError("Failed to start or load chats: \(responseError(error))")
let m = ChatModel.shared
if (!m.chatInitialized) {
do {
try initializeChat(start: true)
} catch let error {
fatalError("Failed to start or load chats: \(responseError(error))")
}
}
if ChatModel.shared.currentUser == nil {
if m.currentUser == nil {
completeReceiving("no current user")
return
}
+1
View File
@@ -16,6 +16,7 @@ final class ChatModel: ObservableObject {
@Published var onboardingStage: OnboardingStage?
@Published var v3DBMigration: V3DBMigrationState = v3DBMigrationDefault.get()
@Published var currentUser: User?
@Published var chatInitialized = false
@Published var chatRunning: Bool?
@Published var chatDbChanged = false
@Published var chatDbEncrypted: Bool?
+1
View File
@@ -734,6 +734,7 @@ func initializeChat(start: Bool, dbKey: String? = nil) throws {
let _ = getChatCtrl(dbKey)
try apiSetFilesFolder(filesFolder: getAppFilesDirectory().path)
try apiSetIncognito(incognito: incognitoGroupDefault.get())
m.chatInitialized = true
m.currentUser = try apiGetActiveUser()
if m.currentUser == nil {
m.onboardingStage = .step1_SimpleXInfo
+7 -5
View File
@@ -41,11 +41,13 @@ struct SimpleXApp: App {
chatModel.appOpenUrl = url
}
.onAppear() {
do {
chatModel.v3DBMigration = v3DBMigrationDefault.get()
try initializeChat(start: chatModel.v3DBMigration.startChat)
} catch let error {
fatalError("Failed to start or load chats: \(responseError(error))")
if (!chatModel.chatInitialized) {
do {
chatModel.v3DBMigration = v3DBMigrationDefault.get()
try initializeChat(start: chatModel.v3DBMigration.startChat)
} catch let error {
fatalError("Failed to start or load chats: \(responseError(error))")
}
}
}
.onChange(of: scenePhase) { phase in
@@ -245,6 +245,7 @@ struct DatabaseEncryptionView: View {
private func operationEnded(_ dbAlert: DatabaseEncryptionAlert) async {
await MainActor.run {
m.chatDbChanged = true
m.chatInitialized = false
progressIndicator = false
alert = dbAlert
}
@@ -354,6 +354,7 @@ struct DatabaseView: View {
private func operationEnded(_ dbAlert: DatabaseAlert) async {
await MainActor.run {
m.chatDbChanged = true
m.chatInitialized = false
progressIndicator = false
alert = dbAlert
}
+9 -5
View File
@@ -10,6 +10,8 @@ import Foundation
private var chatController: chat_ctrl?
private var migrationResult: (Bool, DBMigrationResult)?
public func getChatCtrl(_ useKey: String? = nil) -> chat_ctrl {
if let controller = chatController { return controller }
let dbPath = getAppDatabasePath().path
@@ -23,6 +25,7 @@ public func getChatCtrl(_ useKey: String? = nil) -> chat_ctrl {
}
public func migrateChatDatabase(_ useKey: String? = nil) -> (Bool, DBMigrationResult) {
if let res = migrationResult { return res }
logger.debug("migrateChatDatabase \(storeDBPassphraseGroupDefault.get())")
let dbPath = getAppDatabasePath().path
var dbKey = ""
@@ -42,16 +45,17 @@ public func migrateChatDatabase(_ useKey: String? = nil) -> (Bool, DBMigrationRe
var cPath = dbPath.cString(using: .utf8)!
var cKey = dbKey.cString(using: .utf8)!
let cjson = chat_migrate_db(&cPath, &cKey)!
let res = dbMigrationResult(fromCString(cjson))
let dbRes = dbMigrationResult(fromCString(cjson))
let encrypted = dbKey != ""
if case .ok = res, useKeychain && encrypted && !setDatabaseKey(dbKey) {
return (encrypted, .errorKeychain)
}
return (encrypted, res)
let keychainErr = dbRes == .ok && useKeychain && encrypted && !setDatabaseKey(dbKey)
let result = (encrypted, keychainErr ? .errorKeychain : dbRes)
migrationResult = result
return result
}
public func resetChatCtrl() {
chatController = nil
migrationResult = nil
}
public func sendSimpleXCmd(_ cmd: ChatCommand) -> ChatResponse {