Unity에서 Apple 로그인 붙이기 – 생각보다 간단했다

개요

iOS 출시를 앞두고 Apple 로그인을 구현해야 했다. 애플 정책상 다른 소셜 로그인이 있으면 Apple 로그인도 필수로 넣어야 한다는 건 알고 있었지만, 막상 시작하려니 막막했다. 다행히 오픈소스 라이브러리 하나로 생각보다 쉽게 해결할 수 있었다.

패키지 설치

일단 가장 먼저 할 일은 패키지 설치다. Unity Package Manager를 열고 좌측 상단의 + 버튼을 누른 다음, “Add package from git URL”을 선택한다.

그리고 다음 URL을 입력하면 끝이다.

https://github.com/lupidan/apple-signin-unity.git?path=Source#1.5.0

이 라이브러리는 Apple Sign-In을 Unity에서 쉽게 쓸 수 있게 래핑해둔 거라서, 네이티브 코드 건드릴 필요 없이 C#만으로 처리할 수 있다.

AppleLoginManager 구현

다음은 매니저 클래스를 만들어야 한다. 싱글톤으로 만들어서 어디서든 접근할 수 있게 했다.

#if UNITY_IOS
using AppleAuth;
using AppleAuth.Native;
using AppleAuth.Enums;
using AppleAuth.Interfaces;
using AppleAuth.Extensions;
#endif
using Firebase.Extensions;

public class AppleLoginManager : PersistentSingleton<AppleLoginManager>
{
#if UNITY_IOS
    public IAppleAuthManager appleAuthManager;
#endif

    public void InitializeAppleAuthManager()
    {
#if UNITY_IOS
        if (AppleAuthManager.IsCurrentPlatformSupported)
        {
            var deserializer = new PayloadDeserializer();
            appleAuthManager = new AppleAuthManager(deserializer);
        }
#endif
    }

#if UNITY_IOS
    void Update()
    {
        appleAuthManager?.Update();
    }
#endif
}

여기서 중요한 건 Update() 함수다. Apple Auth Manager는 매 프레임마다 업데이트를 돌려줘야 콜백이 제대로 동작한다. 이거 빼먹으면 로그인 버튼 눌러도 아무 반응 없어서 한참 헤맸던 기억이 있다.

초기화 타이밍

앱 시작할 때 로그인 화면 들어가기 직전에 한 번 초기화를 해줘야 한다.

AppleLoginManager.Instance.InitializeAppleAuthManager();

나는 게임 인트로 씬에서 호출했는데, 타이밍은 프로젝트 구조에 맞게 조정하면 된다.

실제 로그인 처리

드디어 본격적인 로그인 로직이다. 버튼을 누르면 다음 함수를 호출하면 된다.

public void SignInWithApple()
{
    if (AppleLoginManager.Instance.appleAuthManager == null)
        AppleLoginManager.Instance.InitializeAppleAuthManager();

    var loginArgs = new AppleAuthLoginArgs(LoginOptions.IncludeEmail | LoginOptions.IncludeFullName);
    AppleLoginManager.Instance.appleAuthManager.LoginWithAppleId(loginArgs, OnAppleAuthSuccess, OnAppleAuthFailure);
}

private void OnAppleAuthSuccess(ICredential credential)
{
    if (credential is IAppleIDCredential appleIDCredential)
    {
        string idToken = Encoding.UTF8.GetString(appleIDCredential.IdentityToken);
        string authorizationCode = Encoding.UTF8.GetString(appleIDCredential.AuthorizationCode);
        // TODO: success
    }
}

private void OnAppleAuthFailure(IAppleError error)
{
    Debug.LogError("Apple Sign-In failed: " + error.ToString());
}

LoginOptions.IncludeEmail | LoginOptions.IncludeFullName은 사용자의 이메일과 이름 정보를 요청하는 옵션이다. 첫 로그인 때만 받아올 수 있으니 꼭 서버에 저장해두는 게 좋다.

성공하면 idTokenauthorizationCode를 받을 수 있는데, 이걸 서버로 보내서 Firebase나 백엔드 인증 처리를 하면 된다.

마무리

생각보다 간단하게 끝났다. Xcode에서 Sign In with Apple 활성화하고 시뮬레이터에서는 Apple 로그인이 제대로 안 될 수 있으니 실기기에서 테스트하고.

0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *