끝
'FireBase' 카테고리의 다른 글
자주 쓰는 파이어베이스 RTDB 코드 (0) | 2021.10.17 |
---|---|
파이어 베이스 DB 보안 (0) | 2021.10.16 |
파이어 베이스 오류모음 (0) | 2021.10.11 |
끝
자주 쓰는 파이어베이스 RTDB 코드 (0) | 2021.10.17 |
---|---|
파이어 베이스 DB 보안 (0) | 2021.10.16 |
파이어 베이스 오류모음 (0) | 2021.10.11 |
uuid
var auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
var uuid = auth.CurrentUser.UserId;
레퍼런스
public static DatabaseReference DefaultReference
{
get
{
var reference = FirebaseDatabase.DefaultInstance.RootReference;
var auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
var userId = auth.CurrentUser.UserId;
return reference.Child("users").Child(userId);
}
}
저장
json타입
public void Save()
{
LocalReference.SetRawJsonValueAsync(JsonUtility.ToJson(this));
}
저장
리플렉션타입
public void Save()
{
foreach (var field in GetType().GetFields())
{
LocalReference.Child(field.Name).SetValueAsync(field.GetValue(this));
}
}
읽기
public static void Load(System.Action<User> successCallback)
{
LocalReference.GetValueAsync().ContinueWith(task =>
{
if (task.IsFaulted)
{
Debug.LogError("불러오는데 에러 발생");
successCallback.Invoke(null);
return;
// Handle the error...
}
if (task.IsCompleted==false)
{
Debug.LogError("불러오기 실패");
successCallback.Invoke(null);
return;
}
var snapshot = task.Result;
Debug.Log(snapshot.Value);
if (snapshot.Value == null)
{
Debug.LogError("데이터가 없음");
successCallback.Invoke(null);
return;
}
User user = new User(snapshot);
OnChangeUserEvent.Invoke(user);
Debug.Log("불러오기 성공");
// Do something with snapshot...
});
}
void Start()
{
User.Load(loadedUser =>
{
if (loadedUser!=null)
{
user = loadedUser;
}
OnChangeUserNameEvent.Invoke(user.username);
});
}
v2 (null반환을 위해 함수타입으로 바꿨다)
public static SaveData Load(DataSnapshot snapshot)
{
var json = snapshot.GetRawJsonValue();
Debug.Log("json:" + json);
if (json == null)
{
return null;
}
return JsonUtility.FromJson(json, typeof(SaveData)) as SaveData;
}
읽기 이벤트타입
void Start()
{
User.LocalReference.ValueChanged += HandleValueChanged;
}
void HandleValueChanged(object sender, ValueChangedEventArgs args)
{
if (args.DatabaseError != null)
{
Debug.LogError(args.DatabaseError.Message);
return;
}
var snapshot = args.Snapshot;
user = new User(snapshot);
OnChangeUserEvent.Invoke(user);
Debug.Log($"HandleValueChanged: {args.Snapshot.Value}");
// Do something with the data in args.Snapshot
}
읽기 트랜잭션 타입
public static SaveData Load(IEnumerable<DataSnapshot> childrens)
{
var snapshots = Enumerable.ToArray(childrens);
var saves = System.Array.ConvertAll(snapshots, snapshot => Load(snapshot));
return GetLastSave(saves);
}
snapshot To Class v1
public User(DataSnapshot snapshot)
{
foreach (var field in GetType().GetFields())
{
if (snapshot.HasChild(field.Name))
{
field.SetValue(this, snapshot.Child(field.Name).Value);
Debug.Log($"{field.Name}: {snapshot.Child(field.Name).Value}");
}
}
}
snapshot To Class v2
public User(DataSnapshot snapshot)
{
foreach (var item in snapshot.Children)
{
var field = GetType().GetField(item.Key);
if (field == null)
{
Debug.LogError($"{item.Key}가 존재하지 않음");
continue;
}
field.SetValue(this, item.Value);
Debug.Log($"{item.Key}:{item.Value}");
}
}
snapshot To Class v3
서버에 없는값은 null이 아니라 기본값으로 채워진다
public User(DataSnapshot snapshot)
{
var json = snapshot.GetRawJsonValue();
Debug.Log("json:" + json);
if (json == null)
{
return;
}
var snapshotUser = JsonUtility.FromJson(json, GetType());
foreach (var field in GetType().GetFields())
{
field.SetValue(this, field.GetValue(snapshotUser));
}
}
오프라인에서도 동작
조심해야할게 SetRawJsonValueAsync나 SetValueAsync를 날리면
불의의 사고로 데이터가 전부 롤백될수 있다는거다
(유저가 오프라인으로 플레이하던걸 방치하다가 폰을 교환하고 옛날폰을 다시 켠다던지)
이걸 쓰려면 중요정보는 무조건 트랜잭션으로 해야할것이다
FirebaseDatabase.DefaultInstance.SetPersistenceEnabled(true);
User.LocalReference.KeepSynced(true);
파이어베이스 서버시간 (lastOnlineTime)
로드가 먼저면 서버시간 불러오는단에서 추가하고, 아니면 로드쪽에서 갱신하도록 처리함
void Start()
{
SaveData.DefaultReference.ValueChanged += HandleValueChanged;
FirebaseDatabase.DefaultInstance.GetReference(".info/serverTimeOffset").ValueChanged += HandleServerTimeOffsetChanged;
}
void HandleValueChanged(object sender, ValueChangedEventArgs args)
{
if (args.DatabaseError != null)
{
Debug.LogError(args.DatabaseError.Message);
return;
}
var snapshot = args.Snapshot;
lock (saveData)
{
saveData = new SaveData(snapshot);
if (lastOnlineTime!=0)
{
saveData.lastOnlineTime = lastOnlineTime;
}
}
Debug.Log($"HandleValueChanged: {args.Snapshot.Value}");
// Do something with the data in args.Snapshot
}
long lastOnlineTime = 0;
void HandleServerTimeOffsetChanged(object sender, ValueChangedEventArgs args)
{
Debug.Log($"Offset: {args.Snapshot.Value}");
lastOnlineTime= System.DateTime.UtcNow.Ticks + (long)args.Snapshot.Value * 10000;
if (saveData!=null)
{
lock (saveData)
{
saveData.lastOnlineTime = lastOnlineTime;
saveData.Save();
}
}
}
파이어 스토리지 (0) | 2022.04.09 |
---|---|
파이어 베이스 DB 보안 (0) | 2021.10.16 |
파이어 베이스 오류모음 (0) | 2021.10.11 |
참고한곳
https://firebase.google.com/docs/database/security?hl=ko
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Firebase;
using Firebase.Database;
public class FireBaseDataBase : MonoBehaviour
{
DatabaseReference reference ;
public class User
{
public string username;
public string email;
public User(string username, string email)
{
this.username = username;
this.email = email;
}
}
public void WriteNewUser()
{
var auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
WriteNewUser(auth.CurrentUser.UserId, "test", "test@mail");//작동함
WriteNewUser(auth.CurrentUser.UserId, "test2", "test2@mail");//작동함
WriteNewUser("ABC"+(auth.CurrentUser.UserId).Substring("ABC".Length), "test2", "test2@mail");//작동함!!
}
private void WriteNewUser(string userId, string name, string email)
{
User user = new User(name, email);
string json = JsonUtility.ToJson(user);
reference.Child("users").Child(userId).SetRawJsonValueAsync(json);
}
// Start is called before the first frame update
void Start()
{
reference = FirebaseDatabase.DefaultInstance.RootReference;
}
// Update is called once per frame
void Update()
{
}
}
상기와 같은 코드가 있다
이걸 그냥 쑤셔넣게 되면
자기 계정이 아닌데도 마음대로 값을 쓰고 수정해댄다
당연하다 저 계층값이 유저 ID인지 지역별 구분인지 이름인지 컴퓨터는 알수 없기 때문
따라서 저 계층은 uid와 동일할때만 값을 추가할수 있게 해달라고 할 것이다
열어보면 이렇게 되어있을것이다
11월 2일까지만 쓸 수 있댄다.
규칙을 바꿔주자
{
"rules":
{
"users":
{
"$uid":
{
".write": "$uid === auth.uid",
".read": "$uid === auth.uid"
}
}
}
}
uid가 동일해야만 읽고 쓸 수 있게 수정했다
이제 DB에 들어와서 아무나 난동부릴 수 없게됐다 Good
테스트 했던 유저값들은 지워주자
기본적으로 .write 규칙이 미정의된 부분은 쓰기 불가능이니 rules에 대한 룰은 지정 안 해주어도 될것이다
자주 쓰는 파이어베이스 RTDB 코드 (0) | 2021.10.17 |
---|---|
파이어 베이스 오류모음 (0) | 2021.10.11 |
파이어 베이스가 내뱉는 각종 메세지들 처리 (0) | 2021.10.05 |
SignInAnonymouslyAsync encountered an error
추가해라
---------------------------------------------------------------------------------------------
Assets\FirebaseConnectionSDK\IAPManager.cs(213,71): error CS0103: The name 'GooglePlayTangle' does not exist in the current context
Assets\FirebaseConnectionSDK\IAPManager.cs(213,96): error CS0103: The name 'AppleTangle' does not exist in the current context
플랫폼을 안드로이드로 바꾸면 사라진다
------------------------------------------------------------------------------
No GoogleService-Info.plist files found in your project. Building without Firebase configuration will result in an app that will fail to initialize.
plist안 넣어서 그렇다
받아서 넣는다
파이어 베이스 DB 보안 (0) | 2021.10.16 |
---|---|
파이어 베이스가 내뱉는 각종 메세지들 처리 (0) | 2021.10.05 |
파이어 베이스 인증서 다운로드 받는법 (0) | 2021.10.05 |
Please fix your Bundle ID
패키지명이랑 인증서에 등록된 ID랑 달라서 그렇다
프로젝트 세팅에서 바꿔주자
Enable Android Auto-resolution?
안드로이드에서 레졸루션을 자동으로 활성화 하겠냐는 의미이다
보통은 가변 레졸루션을 쓰니까 Enable해주자
파이어 베이스 오류모음 (0) | 2021.10.11 |
---|---|
파이어 베이스 인증서 다운로드 받는법 (0) | 2021.10.05 |
파이어 베이스 인증 (0) | 2021.10.03 |
여기 있다
파이어 베이스가 내뱉는 각종 메세지들 처리 (0) | 2021.10.05 |
---|---|
파이어 베이스 인증 (0) | 2021.10.03 |
파이어베이스 DB 사용법 (0) | 2021.10.03 |