unity3D接入Sign in with Apple

unity3D接入Sign in with Apple

前言,觉得好的同学别忘了给个好评哦,另外,如果有什么疑问的,欢迎随时提问~~

苹果明确规定2020.6.30之后提交到AppStroe审核的app如接入了第三方登录,则必须接入Sign in with Apple;下面给大家分享一下unity3D接入Sign in with Apple的具体流程:

1、首先是按钮格式必须使用苹果给定的几种,具体可以参考链接 苹果官方登录按钮样式

2、oc代码:

#import <Foundation/Foundation.h>
#import <AuthenticationServices/AuthenticationServices.h>
#import "UnityAppController.h"

struct UserInfo
{
    const char * userId;
    const char * email;
    const char * displayName;

    const char * idToken;
    const char * error;

    ASUserDetectionStatus userDetectionStatus;
};

typedef void (*SignInWithAppleCallback)(int result, struct UserInfo s1);
API_AVAILABLE(ios(13.0), tvos(13.0))
typedef void (*CredentialStateCallback)(ASAuthorizationAppleIDProviderCredentialState state);

API_AVAILABLE(ios(13.0), tvos(13.0))
@interface UnitySignInWithApple : NSObject<ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding>

@property (nonatomic) SignInWithAppleCallback loginCallback;
@property (nonatomic) CredentialStateCallback credentialStateCallback;

@end

API_AVAILABLE(ios(13.0), tvos(13.0))
static UnitySignInWithApple* _unitySignInWithAppleInstance;

@implementation UnitySignInWithApple
{
    ASAuthorizationAppleIDRequest* request;
}

+(UnitySignInWithApple*)instance
{
    if (_unitySignInWithAppleInstance == nil)
        _unitySignInWithAppleInstance = [[UnitySignInWithApple alloc] init];
    return _unitySignInWithAppleInstance;
}

-(void)startRequest
{
    if (@available(iOS 13.0, tvOS 13.0, *)) {
        ASAuthorizationAppleIDProvider* provider = [[ASAuthorizationAppleIDProvider alloc] init];
        request = [provider createRequest];
        [request setRequestedScopes: @[ASAuthorizationScopeEmail, ASAuthorizationScopeFullName]];

        ASAuthorizationController* controller = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
        controller.delegate = self;
        controller.presentationContextProvider = self;
        [controller performRequests];
    } else {
        // Fallback on earlier versions
    }
}

-(ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller
{
    return _UnityAppController.window;
}

-(void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization
{
    if (self.loginCallback)
    {
        struct UserInfo data;

        if (@available(iOS 13.0, tvOS 13.0, *)) {
            ASAuthorizationAppleIDCredential* credential = (ASAuthorizationAppleIDCredential*)authorization.credential;
            NSString* idToken = [[NSString alloc] initWithData:credential.identityToken encoding:NSUTF8StringEncoding];
            NSPersonNameComponents* name = credential.fullName;

            data.idToken = [idToken UTF8String];

            data.displayName = [[NSPersonNameComponentsFormatter localizedStringFromPersonNameComponents:name
                                                                                                   style:NSPersonNameComponentsFormatterStyleDefault
                                                                                                 options:0] UTF8String];
            data.email = [credential.email UTF8String];
            data.userId = [credential.user UTF8String];
            data.userDetectionStatus = credential.realUserStatus;
            data.error = "";
            self.loginCallback(1, data);
        } else {
            // Fallback on earlier versions
        }
    }
}

-(void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error
{
    if (self.loginCallback)
    {
        // All members need to be set to a non-null value.
        struct UserInfo data;
        data.idToken = "";
        data.displayName = "";
        data.email = "";
        data.userId = "";
        data.userDetectionStatus = 1;
        data.error = [error.localizedDescription UTF8String];
        self.loginCallback(0, data);
    }
}

@end

void UnitySignInWithApple_Login(SignInWithAppleCallback callback)
{
    if (@available(iOS 13.0, tvOS 13.0, *)) {
        UnitySignInWithApple* login = [UnitySignInWithApple instance];
        login.loginCallback = callback;
        [login startRequest];
    } else {
        struct UserInfo data;
        data.idToken = "";
        data.displayName = "";
        data.email = "";
        data.userId = "";
        data.userDetectionStatus = 1;
        data.error = "";
        callback(2, data);
    }
}

3、然后是C#代码,由于我们项目是用toLua开发的,所以这里的C#提供Lua接口

using System;
using System.Runtime.InteropServices;
using AOT;
using UnityEngine;

public class SignInWithApple
{
    private static LuaFunction s_LoginCompletedCallback;

    public enum UserDetectionStatus
    {
        LikelyReal,
        Unknown,
        Unsupported
    }

    public enum UserCredentialState
    {
        Revoked,
        Authorized,
        NotFound
    }

    public struct UserInfo
    {
        public string userId;
        public string email;
        public string displayName;

        public string idToken;
        public string error;

        public UserDetectionStatus userDetectionStatus;
    }

    public delegate void LuaFunction(int result,string str);

    private delegate void LoginCompleted(int result, UserInfo info);

    [MonoPInvokeCallback(typeof(LoginCompleted))]
    private static void LoginCompletedCallback(int result, [MarshalAs(UnmanagedType.Struct)]UserInfo info)
    {
        UserInfo userInfo = new UserInfo
        {
            idToken = info.idToken,
            displayName = info.displayName,
            email = info.email,
            userId = info.userId,
            error = info.error,
            userDetectionStatus = info.userDetectionStatus
        };

        string str = JsonUtility.ToJson(userInfo);
        s_LoginCompletedCallback(result,str);//result:0-失败,1-成功,2-iOs版本低于13
        s_LoginCompletedCallback = null;
    }

    public static void Login(LuaFunction callback)
    {
        if (s_LoginCompletedCallback != null)
            throw new InvalidOperationException("Login called while another login is in progress");
        s_LoginCompletedCallback = callback;
        LoginInternal();
    }

    private static void LoginInternal()
    {
        IntPtr cback = IntPtr.Zero;
        LoginCompleted d = LoginCompletedCallback;
        cback = Marshal.GetFunctionPointerForDelegate(d);

        UnitySignInWithApple_Login(cback);
    }

    [DllImport("__Internal")]
    private static extern void UnitySignInWithApple_Login(IntPtr callback);
}


4、在toLua的CustomSettings(这里的类名可以自定义,我用的是toLua默认的)类中注册SignInWithApple后就可以在Lua中调用了:

例如,SignInWithApple.Login(function(result,userInfo) end)。

Unity3D是一款流行的跨平台游戏开发引擎,支持多种移动平台和操作系统。最近,苹果推出了“Sign in with Apple”功能,该功能允许用户使用其Apple ID来登录第三方应用程序。 要在Unity3D接入Sign in with Apple”功能,需要遵循以下步骤: 1. 首先,确保你的Unity3D版本是最新的,以便能够支持最新的API和功能。 2. 在苹果开发者平台上创建一个新的App ID,并将其与你的Unity3D项目关联。确保在App ID设置中启用“Sign in with Apple”功能。 3. 在Unity3D中,编写代码以实现与苹果登录服务通信的逻辑。你需要使用Unity内置的网络API,通过发送HTTP请求和接收回复来实现与苹果服务器的通信。 4. 在Unity3D项目中创建一个用户界面,允许用户点击“Sign in with Apple”按钮。当用户点击这个按钮时,你的代码将向苹果服务器发送请求,获取用户的验证凭证。 5. 将从苹果服务器接收到的验证凭证与你的后端服务器通信。你的后端服务器需要验证这个凭证的有效性,并通过向苹果服务器发送请求获得用户的基本信息。 6. 在Unity3D中使用这些用户信息,例如显示用户的用户名、头像等。 需要注意的是,为了保护用户的隐私,苹果有一些要求和限制,开发人员需要遵守这些规定,例如要求提供“其他登录选项”以及对于用户与苹果登录服务的数据处理等。 总结:要在Unity3D接入Sign in with Apple”功能,你需要使用最新版本的Unity3D、遵循苹果开发者平台的规定、实现与苹果服务器的通信逻辑、创建用户界面、验证凭证、获取用户信息,并遵守苹果的隐私规定。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值