0

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エラーを探しましたが、ほとんどの回答は、これらのクラッシュの原因として不正なメモリ アクセスを指摘しています。

ターゲット アクション クラッシュをさらに検索すると、ターゲットがメモリ プールから解放されるとクラッシュすることが明らかになりました。

コーディネーターを自動解放せずにメモリに保持するにはどうすればよいですか?

4

1 に答える 1

7

この問題に関して Apple にフィードバックを提出したところ、次の修正が返信されました。

WKInterfaceAuthorizationAppleIDButton は、sender パラメーターを使用してアクションをトリガーしません。ここでの修正は、buttonPressed での送信者パラメーターの指定を停止することです。そう:

@objc func buttonPressed(_ sender: WKInterfaceAuthorizationAppleIDButton)

になる

@objc func buttonPressed()

次に行:

WKInterfaceAuthorizationAppleIDButton(target: context.coordinator, action: #selector(Coordinator.buttonPressed(_:)))

になる

WKInterfaceAuthorizationAppleIDButton(target: context.coordinator, action: #selector(Coordinator.buttonPressed))

上記の変更により問題が修正され、実際のデバイスで同じことをテストしました。誰かがこれが役に立つことを願っています。

于 2019-08-28T16:02:12.303 に答える