如何在具有相同苹果 ID 的多台设备的用户中找出“使用 Apple 登录”?

Posted

技术标签:

【中文标题】如何在具有相同苹果 ID 的多台设备的用户中找出“使用 Apple 登录”?【英文标题】:How to figure out "Sign in with Apple" in user with multiple devices with same apple id? 【发布时间】:2020-05-09 06:33:13 【问题描述】:

这是我的场景。

Someone has iPhone and iPad (ios 13.0 or later), and he signed up with same appleID.
And he `sign in with apple` in his iPhone and try to `sign in with apple` again in his iPad.

我不希望他在触摸登录按钮时通过编辑他的姓名或检查共享或隐藏他的电子邮件两次“使用苹果登录”。

我从示例代码中找到了一些可以帮助我实现上述场景的代码

func performExistingAccountSetupFlows() 
    // Prepare requests for both Apple ID and password providers.
    let requests = [ASAuthorizationAppleIDProvider().createRequest(),
                    ASAuthorizationPasswordProvider().createRequest()]

    // Create an authorization controller with the given requests.
    let authorizationController = ASAuthorizationController(authorizationRequests: requests)
    authorizationController.delegate = self
    authorizationController.presentationContextProvider = self
    authorizationController.performRequests()

我发现ASPasswordCredential 将帮助我定义凭据用户

    首先,我应该实现将用户标识符保存在iCloud Keychain 中吗?那我需要加Keychain group Capability吗? 首先,我真的不知道将performExistingAccountSetupFlows 函数放在哪里。我想在用户触摸按钮时显示AuthorizationController。所以我尝试了这种方法。
@available(iOS 13.0, *)
@objc private func handleAuthorizationAppleIDButtonPress() 
    let appleIDProvider = ASAuthorizationAppleIDProvider()
    appleIDProvider.getCredentialState(
        forUserID: KeychainItem.currentUserIdentifier ?? "")  [weak self] (credentialState, error) in
        guard let `self` = self else  return 
        log.debugPrint(KeychainItem.currentUserIdentifier ?? "nil")

        switch credentialState 
            case .authorized:
                // The Apple ID credential is valid. Show Home UI Here

                // MARK: Existing iCloud keychain 
                self.performExistingAccountSetupFlows() 
                break

            case .revoked, .notFound:
                let request = appleIDProvider.createRequest()
                request.requestedScopes = [
                    .fullName,
                    .email
                ]

                let controller = ASAuthorizationController(authorizationRequests: [request])
                controller.delegate = self
                controller.presentationContextProvider = self
                controller.performRequests()
                break
            default:
                break
            
        



这并不符合我的预期。

有没有好心的老师可以解答我的问题? 谢谢。

【问题讨论】:

【参考方案1】:

你不需要做任何事情。 Apple 通过将您的应用程序包与用户 iCloud 中的身份相关联来为您处理这一切。

如果他们在具有相同 iCloud 帐户的另一台设备上运行您的应用程序,那么当他们使用“使用 Apple 登录”时,他们没有机会创建新帐户 - 只会提示他们使用现有的登录帐户。

您可以选择使用performExistingAccountSetupFlows()中的代码提示用户登录,而无需点击“使用Apple登录”按钮;

当此代码运行时,如果发现现有帐户关联,则会提示他们进行身份验证。如果没有找到帐户,则不会发生任何事情。

【讨论】:

感谢您的回答。目前我正在测试我的测试版应用程序,但是当我在第二台设备上触摸登录按钮时(在登录第一台设备后(抄送相同的苹果 ID)),我发现提示要求用户提供姓名和电子邮件(共享或隐藏),即与第一台设备相同。我只想使用触摸(或面部 ID)或密码登录以登录第二台设备。我该如何解决这个问题? 嗯。确保在两台设备上的 iCloud 帐户下启用了钥匙串同步。我在两台设备上运行 Apple 的“Juice”示例,第二台设备正确提示我使用我在第一台设备上创建的帐户进行身份验证。 哦。感谢您的大力帮助。我刚刚删除了performExistingAccountSetupFlows(),并完全按照我的意图做了。顺便说一下,在第二次身份验证中,Given name 和 Family name 和 Email 是nil。这是正确的工作吗? 我在测试中看到了同样的情况 - 控制台中有一些关于 AKAuthenticationError Code=-7030 的错误消息 - 不确定那是什么。 好的,我认为这些消息不是问题。似乎名字、姓氏和电子邮件仅在注册时提供 - 我想您应该在注册时将这些保存在后端数据库中。

以上是关于如何在具有相同苹果 ID 的多台设备的用户中找出“使用 Apple 登录”?的主要内容,如果未能解决你的问题,请参考以下文章

如何查看苹果id的登陆设备

用户多台设备上的谷歌云消息通知

一台手机怎么控制多台手机呢

Android能够获取到唯一的设备ID吗

将一台蓝牙设备连接为多台设备

我如何知道用户是不是以相同的 ID 登录了其他设备,我在我的应用程序中使用了 XMPP