Combine 框架下的 AWS Amplify for Swift / SwiftUI 令人头疼

AWS Amplify for Swift / SwiftUI under Combine framework cause headache

有人 copy/sample 将 AWS Amplify 与 Combine 框架结合使用吗?

提供的样品 https://docs.amplify.aws/lib/datastore/data-access/q/platform/ios https://docs.amplify.aws/lib/auth/getting-started/q/platform/ios#configure-auth-category 看起来真的很简单,我正在逐字使用它,但由于我不太精通 Combine,可能是我失去了水槽,尤其是当这些函数被放置在 Observable class 中时。

并且在进行 URL 会话时,我的尝试产生了相同的错误负载:

Error Domain=NSCocoaErrorDomain Code=4099 “与名为 com.apple.commcenter.coretelephony.xpc 的 pid 0 上的服务的连接已从此进程失效。” UserInfo={NSDebugDescription=与名为 com.apple.commcenter.coretelephony.xpc 的 pid 0 上的服务的连接已从此进程失效。}

以下示例展示了如何使用用户名和密码登录:

import SwiftUI
import Combine
import Amplify

enum AuthState {
  case signUp
  case login
  case confirmCode(email: String)
  case session(user: AuthUser)
}

final class SessionManager: ObservableObject {
  @Published var authState: AuthState = .login
  var storage = Set<AnyCancellable>()

  func getCurrentAuthUser() {
    if let user = Amplify.Auth.getCurrentUser() {
      DispatchQueue.main.async {
        self.authState = .session(user: user)
      }
    } else {
      DispatchQueue.main.async {
        self.authState = .login
      }
    }
  }

  func signIn(email: String, password: String) {
    Amplify.Auth.signIn(username: email, password: password)
      .resultPublisher
      .receive(on: DispatchQueue.main)
      .sink(
        receiveCompletion: {
          if case .failure(let error) = [=10=] {
            print("Sign in error: \(error)")
          }
        }) { result in
        self.getCurrentAuthUser()
      }.store(in: &self.storage)
  }
}

我在模拟器上测试时遇到了同样的错误,但是在设备上测试消除了它。

此外,Don 的示例展示了如何使用 .store(in: &self.storage) 处理 sink 调用的结果。这是必需的,放大文档显示得不是很好。