150 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C#
		
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using Firebase.RemoteConfig;
 | 
						|
using Guru;
 | 
						|
using Guru.LitJson;
 | 
						|
using UnityEngine;
 | 
						|
 | 
						|
namespace Guru
 | 
						|
{
 | 
						|
    
 | 
						|
    
 | 
						|
    /// <summary>
 | 
						|
    /// ABTEST 管理器
 | 
						|
    /// </summary>
 | 
						|
    public class ABTestManager : Singleton<ABTestManager>
 | 
						|
    {
 | 
						|
 | 
						|
        private FirebaseRemoteConfig _remoteConfig;
 | 
						|
 | 
						|
        private List<ABParamData> _params;
 | 
						|
 | 
						|
        
 | 
						|
        #region 初始化
 | 
						|
        
 | 
						|
        /// <summary>
 | 
						|
        ///  初始化
 | 
						|
        /// </summary>
 | 
						|
        public static void Init()
 | 
						|
        {
 | 
						|
            try
 | 
						|
            {
 | 
						|
                Instance.Setup();
 | 
						|
            }
 | 
						|
            catch (Exception e)
 | 
						|
            {
 | 
						|
                Debug.LogError(e);
 | 
						|
            }
 | 
						|
            
 | 
						|
        }
 | 
						|
        
 | 
						|
        /// <summary>
 | 
						|
        /// 安装服务
 | 
						|
        /// </summary>
 | 
						|
        private void Setup()
 | 
						|
        {
 | 
						|
            Debug.Log($"[AB] --- <color=#88ff00>ABTest Init</color>");
 | 
						|
            _params = new List<ABParamData>();
 | 
						|
            
 | 
						|
            _remoteConfig = FirebaseRemoteConfig.DefaultInstance;
 | 
						|
            
 | 
						|
            string strValue;
 | 
						|
            foreach (var key in _remoteConfig.Keys)
 | 
						|
            {
 | 
						|
                strValue = _remoteConfig.GetValue(key).StringValue;
 | 
						|
                AddParam(strValue);
 | 
						|
            }
 | 
						|
            
 | 
						|
            // ------- ABTest -----------
 | 
						|
            // Debug.Log($"<color=orange> --- start parse test string --- </color>");
 | 
						|
            // var testStr = @"{""enabled"":true,""value"":2,""id"":""B"",""guru_ab_23100715"":""B""}";
 | 
						|
            // AddParam(testStr);
 | 
						|
            
 | 
						|
            if (_params.Count > 0)
 | 
						|
            {
 | 
						|
                for (int i = 0; i < _params.Count; i++)
 | 
						|
                {
 | 
						|
                    // 上报实验AB属性
 | 
						|
                    GuruAnalytics.SetUserProperty(_params[i].id, _params[i].group);
 | 
						|
#if UNITY_EDITOR
 | 
						|
                    Debug.Log($"[AB] --- Add AB Param <color=cyan>{_params[i].ToString()}</color>");
 | 
						|
#else
 | 
						|
                    Debug.Log($"[AB] --- Add AB Param {_params[i].ToString()}");
 | 
						|
#endif
 | 
						|
                }
 | 
						|
            }
 | 
						|
        
 | 
						|
        }
 | 
						|
        
 | 
						|
        #endregion
 | 
						|
        
 | 
						|
        #region 添加AB参数
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 添加AB参数
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="value"></param>
 | 
						|
        private void AddParam(string value)
 | 
						|
        {
 | 
						|
            if (!string.IsNullOrEmpty(value) && value.Contains("guru_ab_"))
 | 
						|
            {
 | 
						|
                _params.Add(ABParamData.Parse(value)); // 添加参数
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
    
 | 
						|
    [Serializable]
 | 
						|
    internal class ABParamData
 | 
						|
    {
 | 
						|
        private const int PARAM_NAME_LENGTH = 23; // 从开始"ab_" 计算, 往后20个字符
 | 
						|
        
 | 
						|
        public string id;
 | 
						|
        public string group;
 | 
						|
        public string value;
 | 
						|
        
 | 
						|
        public static ABParamData Parse(string value)
 | 
						|
        {
 | 
						|
            Debug.Log($"--- ABParamData.Parse: {value}");
 | 
						|
            var p = new ABParamData();
 | 
						|
            p.value = value;
 | 
						|
            
 | 
						|
            // 发现Guru AB测试标志位
 | 
						|
            var dict = JsonMapper.ToObject<Dictionary<string, object>>(value);
 | 
						|
            if (null != dict)
 | 
						|
            {
 | 
						|
                foreach (var k in dict.Keys)
 | 
						|
                {
 | 
						|
                    if (k.StartsWith("guru_ab"))
 | 
						|
                    {
 | 
						|
                        p.id = GetItemKey(k);
 | 
						|
                        p.group = dict[k].ToString();
 | 
						|
                        // Debug.Log($"[AB] add property {k}: {dict[k]}");
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            
 | 
						|
            return p;
 | 
						|
        }
 | 
						|
 | 
						|
        private static string GetItemKey(string raw)
 | 
						|
        {
 | 
						|
            var h = raw.Replace("guru_", "");
 | 
						|
            var key = h.Substring(0, Mathf.Min(PARAM_NAME_LENGTH, h.Length)); // 最大长度23
 | 
						|
            return key; 
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 输出字符串
 | 
						|
        /// </summary>
 | 
						|
        /// <returns></returns>
 | 
						|
        public override string ToString()
 | 
						|
        {
 | 
						|
            return $"{id} : {group}";
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
} |