我正在使用 SwiftUI 在 watchOS 上实现Sign in with Apple 。
由于WKInterfaceAuthorizationAppleIDButton
不符合 View 协议,因此我将其包装WKInterfaceObjectRepresentable
用于在 SwiftUI 视图中使用它。
我已经实现了一个协调器来处理按钮上的点击,它还充当注册过程回调的委托。
下面是我的代码:
struct AppleLoginButton: WKInterfaceObjectRepresentable {
typealias WKInterfaceObjectRepresentable = WKInterfaceObjectRepresentableContext<AppleLoginButton>
func updateWKInterfaceObject(_ wkInterfaceObject: WKInterfaceAuthorizationAppleIDButton, context: WKInterfaceObjectRepresentableContext<AppleLoginButton>) {
// No code required
}
class Coordinator: NSObject, ASAuthorizationControllerDelegate {
@objc func buttonPressed(_ sender: WKInterfaceAuthorizationAppleIDButton) {
let appleIDProvider = ASAuthorizationAppleIDProvider()
let request = appleIDProvider.createRequest()
request.requestedScopes = [.fullName, .email]
let authorizationController = ASAuthorizationController(authorizationRequests: [request])
authorizationController.delegate = self
authorizationController.performRequests()
}
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
// Verify the user
}
}
func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
// Handle error.
}
}
func makeCoordinator() -> Coordinator {
return Coordinator()
}
func makeWKInterfaceObject(context: WKInterfaceObjectRepresentableContext<AppleLoginButton>) -> WKInterfaceAuthorizationAppleIDButton {
return WKInterfaceAuthorizationAppleIDButton(target: context.coordinator, action: #selector(Coordinator.buttonPressed(_:)))
}
}
每当我点击登录按钮时,应用程序每次都会崩溃并出现以下错误,
线程 1:EXC_BAD_ACCESS(代码=1,地址=0x74747572)
如果我的代码或我实现协调器的方式有问题,有人可以帮助我吗?
然而,上面的代码在 SwiftUI 中的 iOS 上可以使用ASAuthorizationAppleIDButton
按钮
此外,如果我在 WatchKit 中使用 Apple 实现登录,它可以正常工作。
因此,我似乎缺少一些实现细节,希望对此有所帮助。
更新: 我搜索了EXC错误,大多数答案都指向非法内存访问是这些崩溃的罪魁祸首。
对目标动作崩溃的进一步谷歌搜索显示,如果目标从内存池中释放,则会导致崩溃。
那么任何人都可以帮助我如何将 Coordinator 保存在内存中而不自动释放它?