思路:接入sdk相关Android接口以aar形式提供给Unity使用
目录
一、创建Firebase项目工程
二、创建Android工程 接入Android接口
三、Unity工程配置
参考文档:https://firebase.google.com/docs/auth/android/google-signin#java_1
一、创建Firebase项目工程
https://console.firebase.google.com
进入到console创建工程,按照步骤进行,进入到具体工程console面板后,找到
添加测试用户
启动Google身份验证
进行到此时下载google-services.json 上面截图有这个按钮,下载下来后 把它拷贝到工程/Assets下,Unity工程,如果你是安卓则拷贝到安卓的应用工程根目录下。创建应用必须确保签名sha和包名和你Unity项目一样的。
此时已经进行完基本的Firebase工程配置
二、创建Android工程 接入Android接口
1、需在(应用级)app/build.gradle添加如下依赖
dependencies {
...
implementation platform('com.google.firebase:firebase-bom:28.4.0')
implementation 'com.google.firebase:firebase-analytics'
implementation 'com.google.firebase:firebase-auth'
implementation 'com.google.android.gms:play-services-auth:19.2.0'
}
其中analytics可能不需要 它是一个firebase分析工具的依赖
2、配置Firebase项目具体应用的SHA指纹,需要准备Unity包签名文件keystore 用如下文档方式进行获取SHA。(上方已经提及,这里给个文档)
https://developers.google.com/android/guides/client-auth
3、具体接口代码接入 MainActivity.java代码源码:
package com.test.googleloginTest1102;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.FirebaseApp;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;
public class MainActivity extends UnityPlayerActivity {
private GoogleSignInClient mGoogleSignInClient;
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
FirebaseApp.initializeApp(MainActivity.this);
}catch (Exception e){
Log.e("Unity", "App init fail: " + e.getMessage());
}
super.onCreate(savedInstanceState);
}
@Override
public void onStart() {
super.onStart();
try {
mAuth = FirebaseAuth.getInstance();
// Check if user is signed in (non-null) and update UI accordingly.
FirebaseUser currentUser = mAuth.getCurrentUser();
}catch (Exception e){
Log.e("Unity", "mAuth为nil n" + e.getMessage());
}
//TODO 检查用户是否已登录
// updateUI(currentUser);
}
public void GoogleLogin()
{
// Configure Google Sign In
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("填写你获取的idtoken")
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, 100);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
if (requestCode == 100) {
Task task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
// Google Sign In was successful, authenticate with Firebase
GoogleSignInAccount account = task.getResult(ApiException.class);
Log.d("Unity", "firebaseAuthWithGoogle:" + account.getId());
//沟通Unity传递idToken执行登录流程
Log.i("Unity", "Id Token:" + account.getIdToken());
// UnityPlayer.UnitySendMessage("GoogleLoginComponent", "GoogleLogin", account.getIdToken());
firebaseAuthWithGoogle(account.getIdToken());
} catch (ApiException e) {
// com.google.android.gms.common.api.ApiException: 10:
// Google Sign In failed, update UI appropriately
Log.w("Unity", "Google sign in failed", e);
//TODO Google登录异常回调?
}
}
}
private void firebaseAuthWithGoogle(String idToken) {
Log.i("Unity", "firebaseAuthWithGoogle: " + idToken);
AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null);
mAuth.signInWithCredential(credential)
.addonCompleteListener(this, new onCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d("Unity", "signInWithCredential:success");
FirebaseUser user = mAuth.getCurrentUser();
//TODO 回调unity userId
Log.d("Unity", "用户id:" + user.getUid());
// updateUI(user);
} else {
// If sign in fails, display a message to the user.
Log.w("Unity", "signInWithCredential:failure", task.getException());
// updateUI(null);
}
}
});
}
}
上方,requestIdToken("填写你获取的idtoken"),这个idtoken获取方法:
https://developers.google.com/identity/sign-in/android/start-integrating#get_your_backend_servers_oauth_20_client_id
按照步骤进行选中你的项目和应用,填写应用使用的sha和包名,最终获得一份带idtoken的配置,复制粘贴到上面的方法里传递进去。
最终会通过Intent方式回调一个携带了GoogleSignInAccount的task获取到account之后拿到它的用户id token进行一个firebaseAuthWithGoogle方法,它是客户端的身份验证。
如需做服务器的身份验证,需要参考服务器文档如下:
http方式:https://developers.google.com/identity/sign-in/android/backend-auth
游戏服务器java c# python等:https://firebase.google.com/docs/auth/admin/verify-id-tokens
值得注意的地方:
1、AndroidManifest.xml需要添加
2、由于使用UnityPlayerActivity类,它是Unity的classes.jar包里的类,但是在Unity2019可能会发现它不见了,具体解决方法:
Unity接入第三方SDK aar/jar没有sdk的依赖文件 和 Unity2019丢失UnityPlayerActivity问题_两水先木示的博客-CSDN博客
注销用户方法:
FirebaseAuth.getInstance().signOut();
注意:登录邮箱尽可能不要选择用开发者邮箱,如果无法登录可以选择美国邮箱测试下
安卓工程需切成库工程,即app/build.gradle修改
2点,改掉plugins内的 和 defaultConfig applicationId去掉。
Build生成aar,解压它,获取它根目录的classes.jar和AndroidManifest.xml,其中classes.jar里需要删除掉BuildConfig.class 不然会起冲突。(我使用【7z解压软件】能直接打开jar包 进行直接删除文件,如果不是需要解压jar后 删除文件 再压缩回去。)
接着jar和xml复制到工程Assests/Plugins/Android下,后续则是正常的Unity调用Android代码,不再阐述。
三、Unity工程配置
1、classes.jar 和 AndroidManifest.xml (上面已经提及)
2、google-services.json (上面已经提及)
3、配置Unity的gradle配置!(这个和安卓一样也是应用级的gradle)
PlayerSettings-Build里勾选这个,然后编辑它
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.google.android.gms:play-services-auth:19.2.0'
implementation 'com.google.firebase:firebase-auth:21.0.1'
**DEPS**}
引入firebase和google的依赖。
此时还是会出点问题,缺少了FirebaseAuth.unitypackage包的一些依赖配置文件。需要去下载FirebaseAuth.unitypackage 进行force resolve之后,获取到FirebaseApp.androidlib文件夹,把这个文件夹拷贝到我们的工程Plugins/Android里即可。
(注意:FirebaseAuth.unitypackage的内容 需要删除掉,不过最好是新建一个空工程 并且签名一直 google-services.json要导入后,进行force resolve生成依赖配置文件,再直接拷贝FirebaseApp.androidlib文件夹到我们的项目!)
至于为什么我不直接用FirebaseAuth.unitypackage 而是采取这种特殊的方式,是因为这个包其实包含了很多额外的东西,我只需firebase google身份验证,所以采用这种特别的方式去进行。



