SwiftUI を使用して、watchOS にSign in with Appleを実装しています。
WKInterfaceAuthorizationAppleIDButton
は View プロトコルに準拠していないため、SwiftUI ビューで使用するためにラップしていますWKInterfaceObjectRepresentable
。
ボタンのタップを処理するコーディネーターを実装しました。これは、サインアップ プロセスのコールバックのデリゲートとしても機能します。
以下は私のコードです:
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 で Sign in with Apple を実装すると、問題なく動作します。
そのため、実装の詳細がいくつか欠けているようです。これについて何か助けていただければ幸いです。
更新: 私はEXCエラーを探しましたが、ほとんどの回答は、これらのクラッシュの原因として不正なメモリ アクセスを指摘しています。
ターゲット アクション クラッシュをさらに検索すると、ターゲットがメモリ プールから解放されるとクラッシュすることが明らかになりました。
コーディネーターを自動解放せずにメモリに保持するにはどうすればよいですか?