Commit 642258fa authored by 井庆林's avatar 井庆林

灰度策略

parent 0fac0e39
......@@ -326,12 +326,6 @@ NSString *const MockCityId = @"beijing";
}
- (void)testSimulativePageViewEvent {
[NSThread sleepForTimeInterval:0.2];
[Phobos.sharedClient simulativePV:nil businessId:nil referer:nil];
[self paramUnNilCheck];
}
- (void)paramUnNilCheck {
[NSThread sleepForTimeInterval:0.2];
NSArray *array = [Phobos normalPhobosDataForServerAPI];
......
......@@ -8,17 +8,11 @@
#import <Foundation/Foundation.h>
#import "PhobosPVProtocol.h"
#import "PhobosConfig.h"
#import <CoreLocation/CLLocation.h>
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM (NSInteger, PhobosSigningType) {
PhobosSigningTypeUndefined = 0,
PhobosSigningTypeAppStore,
PhobosSigningTypeRelease,
PhobosSigningTypeDebug
};
@interface Phobos : NSObject
/**
......@@ -31,7 +25,7 @@ typedef NS_ENUM (NSInteger, PhobosSigningType) {
*
* @since 0.0.1
*/
+ (Phobos *)clientWithAppName:(NSString *)appName channelId:(NSString *)channelId;
+ (void)clientWithAppName:(NSString *)appName channelId:(NSString *)channelId;
+ (instancetype) alloc __attribute__((deprecated));
- (instancetype) init __attribute__((deprecated));
......@@ -41,6 +35,9 @@ typedef NS_ENUM (NSInteger, PhobosSigningType) {
@property (class, readonly, strong) Phobos *sharedClient;
/** 用于Phobos库从old更新到new使用,在全量之后删除相关逻辑 */
@property (nonatomic, assign) BOOL isGray;
// Phobos在处理业务端传递来的参数时会检查是否某个value为空,如果为空会调用这个block以通知业务层,业务层可以上报这个异常,以助解决问题
@property(nonatomic, copy) void (^captureNullExpection) (NSString *eventId, NSDictionary *info);
......@@ -151,17 +148,6 @@ typedef NS_ENUM (NSInteger, PhobosSigningType) {
+ (void)track:(NSString *)eventName attributes:(NSDictionary *)attributes sendNow:(BOOL)sendNow currentAPI:(NSString *)currentAPI;
+ (void)track:(NSString *)eventName currentAPI:(NSString *)currentAPI;
/**
* @author 翟国钧, 16-02-03 16:02:30
*
* @brief H5调用的埋点方法
*
* @param jsonString h5传过来的参数
*
* @since 0.0.1
*/
+ (void)trackJsEvent:(NSString *)jsonString;
/**
* @brief PV事件开始。当controller viewWillAppear时调用
*/
......@@ -171,19 +157,6 @@ typedef NS_ENUM (NSInteger, PhobosSigningType) {
*/
- (void)onPVEnd:(UIResponder<PhobosPVProtocol> *)page;
/**
* @author 翟国钧, 16-03-08 11:03:45
*
* @brief 有些事件需要模拟pv事件,统一用该方法处理,in out 时间相同.点击一次即触发
*
* @param pageName 控件所在VC的pageName
* @param bid 业务id
* @param referer 上个月面的pagename
*
* @since 5.9.1
*/
- (void)simulativePV:(NSString *)pageName businessId:(NSString *)bid referer:(NSString *)referer;
@end
@interface Phobos (UtilTest)
......
......@@ -7,9 +7,9 @@
//
#import "Phobos.h"
#import "OldPhobos.h"
#import <AdSupport/AdSupport.h>
#import "PhobosUtil.h"
#import "PhobosConfig.h"
#import "UIResponder+PhobosPV.h"
#import "PhobosUtil.h"
#import "PhobosCustomVisibleController.h"
......@@ -33,6 +33,8 @@ static NSString *sdkVersion = @"1.3.1";
//@property (nonatomic, weak) dispatch_semaphore_t normalSemaphore;// 保障普通埋点数据安全
@property (nonatomic, assign) NSInteger normalCount;// 记录普通埋点数量
@property (nonatomic, strong) OldPhobos *oldPhobos;
@end
@implementation Phobos
......@@ -45,6 +47,8 @@ static dispatch_queue_t _normalQueue;
+ (Phobos *)clientWithAppName:(NSString *)appName channelId:(NSString *)channelId{
Phobos.sharedClient.appName = appName;
Phobos.sharedClient.channelId = channelId;
Phobos.sharedClient.oldPhobos = [OldPhobos clientWithAppName:appName channelId:channelId];
[OldPhobos setSharedClient:Phobos.sharedClient.oldPhobos];
return Phobos.sharedClient;
}
......@@ -81,7 +85,6 @@ static dispatch_queue_t _normalQueue;
[self setupNotification];
[self handleSessionStart];
[self synchronizePhobosKey];
}
return self;
}
......@@ -102,23 +105,6 @@ static dispatch_queue_t _normalQueue;
return _sharedClient;
}
- (void)setAppName:(NSString *)appName channelId:(NSString *)channelId {
self.appName = appName;
self.channelId = channelId;
}
/**
* disk下的PhobosHaveOpenApp只要存在,就把他取出来放到document下(注:当不支持7.6.16版本的时候,干掉这个方法)
*/
- (void)synchronizePhobosKey {
if ([GMCache fetchObjectAtDiskWithkey:PhobosHaveOpenApp]) {
NSString *prefePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
prefePath = [NSString stringWithFormat:@"%@/com.tumblr.TMDiskCache.WMCacheShared/%@",prefePath ,PhobosHaveOpenApp];
NSURL *fileUrl = [NSURL fileURLWithPathComponents:@[prefePath]];
BOOL written = [NSKeyedArchiver archiveRootObject:PhobosHaveOpenApp toFile:[fileUrl path]];
}
}
- (void)dealloc{
if (self) {
[[NSNotificationCenter defaultCenter] removeObserver:self];
......@@ -142,6 +128,57 @@ static dispatch_queue_t _normalQueue;
[_userType setObject:[userType objectForKey:newKey] forKey:newKey];
}
}
_oldPhobos.userType = userType;
}
- (void)setServerAPI:(NSString *)serverAPI {
_serverAPI = serverAPI;
_oldPhobos.serverAPI = serverAPI;
}
- (void)setUserId:(NSString *)userId {
_userId = userId;
_oldPhobos.userId = userId;
}
- (void)setNetStatus:(NSString *)netStatus {
_netStatus = netStatus;
_oldPhobos.netStatus = netStatus;
}
- (void)setNetworkStatus:(NSString *)networkStatus {
_networkStatus = networkStatus;
_oldPhobos.networkStatus = networkStatus;
}
- (void)setCookie:(NSString *)cookie {
_cookie = cookie;
_oldPhobos.cookie = cookie;
}
- (void)setGps:(CLLocation *)gps {
_gps = gps;
_oldPhobos.gps = gps;
}
- (void)setGetTopController:(UIViewController * _Nonnull (^)(void))getTopController {
_getTopController = getTopController;
_oldPhobos.getTopController = getTopController;
}
- (void)setCurrentCityId:(NSString *)currentCityId {
_currentCityId = currentCityId;
_oldPhobos.currentCityId = currentCityId;
}
- (void)setGreyType:(NSString *)greyType {
_greyType = greyType;
_oldPhobos.greyType = greyType;
}
- (void)setCaptureNullExpection:(void (^)(NSString * _Nonnull, NSDictionary * _Nonnull))captureNullExpection {
_captureNullExpection = captureNullExpection;
_oldPhobos.captureNullExpection = captureNullExpection;
}
/**
......@@ -161,14 +198,6 @@ static dispatch_queue_t _normalQueue;
@"build_model": [UIDevice deviceVersion],
};
[Phobos track:@"device_opened" attributes:dict sendNow:YES];
/** 第一次打开APP埋点 **/
// 当不再支持7.6.15版本时,只保留
if (![GMCache fetchObjectAtDocumentPathWithkey:PhobosHaveOpenApp]) {
[Phobos track:@"device_activated" attributes:@{} sendNow:YES];
[Phobos track:@"device_activated" attributes:@{} sendNow:NO];
[GMCache storeObjectAtDocumentPathWithkey:PhobosHaveOpenApp object:PhobosHaveOpenApp];
}
}
- (UIViewController *)visibleController {
......@@ -295,6 +324,10 @@ static dispatch_queue_t _normalQueue;
#pragma mark - PV
- (void)onPVStart:(UIResponder<PhobosPVProtocol> *)page {
if (!_isGray) {
[_oldPhobos onPVStart:page];
return;
}
// 必须在此处调用一下referer,因为onControllerStart
[page initReferer];
[page initReferrerIdIfNil];
......@@ -303,6 +336,10 @@ static dispatch_queue_t _normalQueue;
}
- (void)onPVEnd:(UIResponder<PhobosPVProtocol> *)page {
if (!_isGray) {
[_oldPhobos onPVEnd:page];
return;
}
if (![PhobosUtil isNonEmpty:page.pageName] || !page.needLogPV) {
return;
}
......@@ -329,24 +366,6 @@ static dispatch_queue_t _normalQueue;
}
}
- (void)simulativePV:(NSString *)pageName businessId:(NSString *)bid referer:(NSString *)referer{
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
@try {
// fake(模拟)的事件,所以in与out一样,就是这么规定的
[dict setObject:[PhobosUtil currentTime] forKey:@"in"];
[dict setObject:[PhobosUtil currentTime] forKey:@"out"];
[dict setObject:pageName?:@"" forKey:@"page_name"];
[dict setObject:bid?:@"" forKey:@"business_id"];
[dict setObject:referer?:@"" forKey:@"referrer"];
[dict setObject:@(1) forKey:@"fake"];
[Phobos track:@"page_view" attributes:dict];
}
@catch (NSException *exception) {
phobosLog(exception);
}
}
/**
* @brief 将埋点时间封装成词典数据
*
......@@ -417,51 +436,51 @@ static dispatch_queue_t _normalQueue;
});
}
#pragma mark - track event handler
+ (void)trackJsEvent:(NSString *)jsonString{
@try {
NSData *data = [jsonString dataUsingEncoding:NSUnicodeStringEncoding];
NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
id pa = dict[@"params"];
NSDictionary *json;
if ([pa isKindOfClass:[NSString class]]) {
NSError *jsonError;
NSData *objectData = [pa dataUsingEncoding:NSUTF8StringEncoding];
json = [NSJSONSerialization JSONObjectWithData:objectData
options:NSJSONReadingMutableContainers
error:&jsonError];
[Phobos track:dict[@"type"] attributes:json];
}else{
[Phobos track:dict[@"type"]];
}
}
@catch (NSException *exception) {
phobosLog(exception);
}
}
+ (void)track:(NSString *)eventName{
if (!Phobos.sharedClient.isGray) {
[OldPhobos track:eventName];
return;
}
[self track:eventName attributes:@{} sendNow:NO currentAPI:_sharedClient.serverAPI];
}
+ (void)track:(NSString *)eventName attributes:(NSDictionary *)attributes{
if (!Phobos.sharedClient.isGray) {
[Phobos track:eventName attributes:attributes];
return;
}
[self track:eventName attributes:attributes sendNow:NO currentAPI:_sharedClient.serverAPI];
}
+ (void)track:(NSString *)eventName attributes:(NSDictionary *)attributes sendNow:(BOOL)sendNow{
if (!Phobos.sharedClient.isGray) {
[OldPhobos track:eventName attributes:attributes sendNow:sendNow];
return;
}
[self track:eventName attributes:attributes sendNow:sendNow currentAPI:_sharedClient.serverAPI];
}
+ (void)track:(NSString *)eventName currentAPI:(NSString *)currentAPI {
if (!Phobos.sharedClient.isGray) {
[OldPhobos track:eventName currentAPI:currentAPI];
return;
}
[self track:eventName attributes:@{} sendNow:NO currentAPI:currentAPI];
}
+ (void)track:(NSString *)eventName attributes:(NSDictionary *)attributes currentAPI:(NSString *)currentAPI {
if (!Phobos.sharedClient.isGray) {
[OldPhobos track:eventName attributes:attributes sendNow:sendNow currentAPI:currentAPI];
return;
}
[self track:eventName attributes:attributes sendNow:NO currentAPI:currentAPI];
}
+ (void)track:(NSString *)eventName attributes:(NSDictionary *)attributes sendNow:(BOOL)sendNow currentAPI:(NSString *)currentAPI {
if (!Phobos.sharedClient.isGray) {
[OldPhobos track:eventName attributes:attributes sendNow:sendNow currentAPI:currentAPI];
return;
}
NSDictionary *dataDict = [_sharedClient prepareDictionaryForEvent:eventName attributes:attributes];
@try {
NSData *JSON = [PhobosUtil encodeJSON:dataDict];
......
......@@ -9,18 +9,28 @@
#ifndef PhobosConfig_h
#define PhobosConfig_h
typedef NS_ENUM (NSInteger, PhobosSigningType) {
PhobosSigningTypeUndefined = 0,
PhobosSigningTypeAppStore,
PhobosSigningTypeRelease,
PhobosSigningTypeDebug
};
#ifdef DEBUG
#define phobosLog(...) NSLog(@"[Phobos] %@",__VA_ARGS__)
#else
#define phobosLog(...)
#endif
#define PhobosHaveOpenApp @"PhobosHaveOpenApp" //是否打开过APP
#define PhobosBeginTime @"PhobosBeginTime" //记录APP打开|从后台启动时的时间戳
#define PhobosEndTime @"PhobosEndTime" //记录APP退出|退到后台时的时间戳
#define PhobosNormalCacheKey @"PhobosNormalCacheKey" //存放持久化埋点数据的key
#define PhobosImmediatelyCacheKey @"PhobosImmediatelyCacheKey" //存放持久化实时埋点数据的key
#define PhobosCacheKey @"PhobosCacheKey" //old 存放持久化埋点数据的key
#define PhobosTempCacheKey @"PhobosTempCacheKey" //old 临时存放待发送埋点数据的key
#define PhobosShardCount 50 //收集数据分段发送的个数
#endif /* PhobosConfig_h */
//
// Phobos.h
// GengmeiDoctor
// Data Statistic Client For Mars
// Created by Thierry on 16/1/26.
// Copyright © 2016年 wanmeizhensuo. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "PhobosPVProtocol.h"
#import <CoreLocation/CLLocation.h>
#import "PhobosConfig.h"
NS_ASSUME_NONNULL_BEGIN
@interface OldPhobos : NSObject
/**
* @brief 开启Phobos统计,默认以BATCH方式发送log.
*
* @param appName 通常由数据端与客户端一起确认的区分不同app的名字
* @param channelId 发布渠道
*
* @return Phobos实例
*
* @since 0.0.1
*/
+ (OldPhobos *)clientWithAppName:(NSString *)appName channelId:(NSString *)channelId;
+ (instancetype)sharedClient;
+ (void)setSharedClient:(OldPhobos *)client;
#pragma mark - SDK配置
// Phobos在处理业务端传递来的参数时会检查是否某个value为空,如果为空会调用这个block以通知业务层,业务层可以上报这个异常,以助解决问题
@property(nonatomic, copy) void (^captureNullExpection) (NSString *eventId, NSDictionary *info);
/**
网络状态 wifi=1, mobile=0, 不连通=-1
*/
@property (nonatomic, copy) NSString *netStatus;
/**
//没有网络连接
public static final String NETWORN_NONE = "none";
//wifi连接
public static final String NETWORN_WIFI = "wifi";
//手机网络数据连接类型
public static final String NETWORN_2G = "2G";
public static final String NETWORN_3G = "3G";
public static final String NETWORN_4G = "4G";
public static final String NETWORN_MOBILE = "other";
*/
@property (nonatomic, copy) NSString *networkStatus;
/**
* @brief 设置是否打印sdk的log信息,默认不开启
*
* @since 0.0.1
*/
@property (assign, nonatomic) BOOL logEnabled;
/**
* @brief 设置当前登录用户的ID,如果没有默认为@""
*
*
* @since 0.0.2
*/
@property (strong, nonatomic) NSString *userId;
/*!
* @author zhaiguojun, 16-05-31
*
* @brief 用户当前的城市id
*
*
* @since 0.2.7
*/
@property (strong, nonatomic) NSString *currentCityId;
@property (strong, nonatomic) CLLocation *gps;
/**
* 记录用户类型
*/
@property (strong, nonatomic) NSMutableDictionary *userType;
/**
数据接收的服务器API
*/
@property (copy, nonatomic) NSString *serverAPI;
/**
当前APP请求接口的 APIHOST(GMServerDomains.apiHost 主要用于flutter AppDelegate 中初始化需要传值
*/
@property (nonatomic, copy) NSString *apiHost;
/**
当前APP请求接口的 cookie(主要用于flutter) 获取到cookie 的时候穿过来 或者cookie 有变化的时候传过来
*/
@property (nonatomic, copy) NSString *cookie;
/**
灰度组, since 7.7.65
*/
@property (nonatomic, copy) NSString *greyType;
/**
包的类型:APPSTORE、RELEASE、DEBUG
*/
@property (nonatomic, assign) PhobosSigningType signingType;
/**
从主项目获取当前显示的controller
*/
@property (nonatomic, copy) UIViewController * (^getTopController) (void);
#pragma mark - 事件采集
/**
* @brief 自定义事件,数量统计.
*
* @param eventId 事件Id
* @attributes 参数
* @sendNow 是否实时发送,默认为NO
*
* @since 0.0.1
*/
+ (void)track:(NSString *)eventId attributes:(NSDictionary *)attributes;
+ (void)track:(NSString *)eventId attributes:(NSDictionary *)attributes sendNow:(BOOL)sendNow;
+ (void)track:(NSString *)eventId;
/**
* @brief 自定义事件,数量统计 7730 精准曝光.
*
* @param eventId 事件Id
* @attributes 参数
* @sendNow 是否实时发送,默认为NO
* @currentAPI 当前传过来的API
* @
*/
+ (void)track:(NSString *)eventId attributes:(NSDictionary *)attributes currentAPI:(NSString *)currentAPI;
+ (void)track:(NSString *)eventId attributes:(NSDictionary *)attributes sendNow:(BOOL)sendNow currentAPI:(NSString *)currentAPI;
+ (void)track:(NSString *)eventId currentAPI:(NSString *)currentAPI;
/**
* @author 翟国钧, 16-02-03 16:02:30
*
* @brief H5调用的埋点方法
*
* @param jsonString h5传过来的参数
*
* @since 0.0.1
*/
+ (void)trackJsEvent:(NSString *)jsonString;
/**
* @brief PV事件开始。当controller viewWillAppear时调用
*/
- (void)onPVStart:(UIResponder<PhobosPVProtocol> *)page;
/**
* @brief PV事件结束。当controller viewWillDisAppear时调用
*/
- (void)onPVEnd:(UIResponder<PhobosPVProtocol> *)page;
/**
* @author 翟国钧, 16-03-08 11:03:45
*
* @brief 有些事件需要模拟pv事件,统一用该方法处理,in out 时间相同.点击一次即触发
*
* @param pageName 控件所在VC的pageName
* @param bid 业务id
* @param referer 上个月面的pagename
*
* @since 5.9.1
*/
- (void)simulativePV:(NSString *)pageName businessId:(NSString *)bid referer:(NSString *)referer;
@end
NS_ASSUME_NONNULL_END
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment