Authored by 周蓉君

更新YHAssemblyAssistant,不公开任何属性,修改数据必须走接口。更新相关测试用例。Review by 阿瑟。

... ... @@ -9,8 +9,9 @@
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
#import "YHNetworkAssistant.h"
#import "YHDevice.h"
#import "YHStatus.h"
#import "YHAnalyItemData.h"
//#import "YHDevice.h"
//#import "YHStatus.h"
//阀值
#define kMaxLocalEventsCount 3000 // 本地持久化event最大条数
... ... @@ -28,11 +29,6 @@ extern NSString * const JsonKeyDataTypeErrors;
@interface YHAssemblyAssistant : NSObject
@property (strong, nonatomic, readonly) YHDevice *device;
@property (strong, nonatomic, readonly) YHStatus *currentStatus;
@property (strong, nonatomic) NSMutableDictionary *immediUploadItemDic; // 用于立即发送策略下(device信息是相同的)
@property (strong, nonatomic) NSFileManager *fileManager; // 属性注入 DI
+ (instancetype)sharedInstance;
- (BOOL)canPersisting;
... ... @@ -43,7 +39,7 @@ extern NSString * const JsonKeyDataTypeErrors;
- (NSDictionary *)getUploadData;
- (void)prepareImmediUploadDic;
- (void)prepareImmediUploadDic:(NSString *)appId sessionId:(NSString *)sessionId;
- (void)updateImmediUploadDic;
... ... @@ -53,4 +49,6 @@ extern NSString * const JsonKeyDataTypeErrors;
- (BOOL)updateLocation:(CLLocation *)location;
- (BOOL)updateNetWorkStatus:(NSString *)status;
@end
... ...
... ... @@ -14,6 +14,8 @@
#import "YHCrashReporter.h"
#import "YHEvent.h"
#import "YHError.h"
#import "YHDevice.h"
#import "YHStatus.h"
#define kPathCaches [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]
#define kPathLogSystem [kPathCaches stringByAppendingPathComponent:@"YHLogSystem"]
... ... @@ -39,13 +41,15 @@ static dispatch_queue_t persisting_queue() {
@property (strong, nonatomic) YHDevice *device;
@property (strong, nonatomic) YHStatus *currentStatus;
@property (strong, nonatomic) NSMutableDictionary *immediUploadItemDic; // 用于立即发送策略下(device信息是相同的)
@property (assign, nonatomic) NSUInteger allEventsCount; // 本地持久化event的条数
@property (strong, nonatomic) NSString *eventFilePath;
@property (strong, nonatomic) NSString *eventFileName;
@property (strong, nonatomic) NSFileManager *fileManager;
- (BOOL)writeEventToFile:(YHEvent *)eventData;
- (BOOL)writeErrorToFile:(YHError *)errorData;
- (void)autoUploadData;
- (void)removeLocalFile;
@end
... ... @@ -127,8 +131,11 @@ static dispatch_queue_t persisting_queue() {
return [NSDictionary dictionaryWithContentsOfFile:self.eventFileName];
}
- (void)prepareImmediUploadDic
{
- (void)prepareImmediUploadDic:(NSString *)appId sessionId:(NSString *)sessionId
{
self.currentStatus.sid = sessionId;
self.device.ak = appId;
// 设置device
[self.immediUploadItemDic setObject:self.device.jsonDictionary forKey:JsonKeyDataTypeDevice];
... ... @@ -144,7 +151,10 @@ static dispatch_queue_t persisting_queue() {
[allStatus replaceObjectAtIndex:0 withObject:self.currentStatus.jsonDictionary];
[self.immediUploadItemDic setObject:allStatus forKey:JsonKeyDataTypeStatus];
} else {
[self prepareImmediUploadDic];
NSException *exception = [NSException exceptionWithName:NSGenericException
reason:@"appId and sessionId do not be initialized. Please use prepareImmediUploadDic:sessionId: first."
userInfo:nil];
[exception raise];
}
}
... ... @@ -194,7 +204,7 @@ static dispatch_queue_t persisting_queue() {
}
} else {
// 不能存储
NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException
NSException *exception = [NSException exceptionWithName:NSMallocException
reason:@"Can't create folder for persisting."
userInfo:nil];
[exception raise];
... ... @@ -284,6 +294,20 @@ static dispatch_queue_t persisting_queue() {
return YES;
}
- (BOOL)updateNetWorkStatus:(NSString *)status
{
if (status == nil || [status length] == 0) {
return NO;
}
if ([status isEqualToString:self.currentStatus.net]) {
return NO;
}
self.currentStatus.net = status;
return YES;
}
#pragma mark - private method
// 将一个事件写入到文件
... ...
... ... @@ -146,39 +146,43 @@
CTRadioAccessTechnologyLTE - 4G (allowed to be called 4G by the ITU as mentioend above)
*/
[[YHNetworkAssistant sharedInstance] addReachabilityChangedHandler:^(AFNetworkReachabilityStatus networkStatus) {
NSString *net = kNetWorkStatusUnknow;
CTTelephonyNetworkInfo *netInfo = [[CTTelephonyNetworkInfo alloc] init];
switch (networkStatus) {
case AFNetworkReachabilityStatusUnknown:
case AFNetworkReachabilityStatusNotReachable:
[YHAssemblyAssistant sharedInstance].currentStatus.net = kNetWorkStatusUnknow;
net = kNetWorkStatusUnknow;
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
{
if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0) {
if ([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) {
[YHAssemblyAssistant sharedInstance].currentStatus.net = kNetWorkStatus2G;
net = kNetWorkStatus2G;
} else if([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA] || [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {
[YHAssemblyAssistant sharedInstance].currentStatus.net = kNetWorkStatus3G;
net = kNetWorkStatus3G;
} else if([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
[YHAssemblyAssistant sharedInstance].currentStatus.net = kNetWorkStatus4G;
net = kNetWorkStatus4G;
} else {
[YHAssemblyAssistant sharedInstance].currentStatus.net = kNetWorkStatusUnknow;
net = kNetWorkStatusUnknow;
}
} else {
[YHAssemblyAssistant sharedInstance].currentStatus.net = kNetWorkStatusUnknow;
net = kNetWorkStatusUnknow;
}
}
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
[YHAssemblyAssistant sharedInstance].currentStatus.net = kNetWorkStatusWIFI;
net = kNetWorkStatusWIFI;
break;
default:
break;
}
[[YHAssemblyAssistant sharedInstance] updateImmediUploadDic];
if ([[YHAssemblyAssistant sharedInstance] updateNetWorkStatus:net]) {
[[YHAssemblyAssistant sharedInstance] updateImmediUploadDic];
}
}];
}
... ... @@ -249,15 +253,12 @@
[self registerCrashReporter];
[self registerAppWillEnterForegroundNotification];
[YHAssemblyAssistant sharedInstance].currentStatus.sid = self.session;
[YHAssemblyAssistant sharedInstance].device.ak = appId;
/*
构建即时发送模式下数据
*/
[[YHAssemblyAssistant sharedInstance] prepareImmediUploadDic];
[[YHAssemblyAssistant sharedInstance] prepareImmediUploadDic:appId sessionId:self.session];
/*
检查发送模式
... ... @@ -387,7 +388,7 @@
{
NSString *errorMsg = nil;
if ([error code] == kCLErrorDenied) {
errorMsg = @"访问被拒绝";
errorMsg = @"定位功能访问被拒绝";
}
if ([error code] == kCLErrorLocationUnknown) {
errorMsg = @"获取位置信息失败";
... ...
... ... @@ -10,11 +10,20 @@
#import <XCTest/XCTest.h>
#import "OCMock.h"
#import "YHAssemblyAssistant.h"
#import "YHDevice.h"
#import "YHStatus.h"
#import "YHEvent.h"
#import "YHError.h"
@interface YHAssemblyAssistant (XCTestCase)
@property (strong, nonatomic) NSString *eventFilePath;
@property (strong, nonatomic) NSString *eventFileName;
@property (strong, nonatomic) NSFileManager *fileManager; // 属性注入 DI
@property (strong, nonatomic, readonly) YHDevice *device;
@property (strong, nonatomic, readonly) YHStatus *currentStatus;
@property (strong, nonatomic, readonly) NSMutableDictionary *immediUploadItemDic;
@end
... ... @@ -134,7 +143,7 @@
- (void)testPrepareImmediUploadDic {
NSLog(@"%@ start", self.name);
[assembly prepareImmediUploadDic];
[assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
NSDictionary *deviceJsonDic = [assembly.immediUploadItemDic objectForKey:JsonKeyDataTypeDevice];
NSMutableArray *statusJsonArray = [assembly.immediUploadItemDic objectForKey:JsonKeyDataTypeStatus];
... ... @@ -147,9 +156,18 @@
NSLog(@"%@ end", self.name);
}
- (void)testUpdateImmediUploadDic {
- (void)testUpdateImmediUploadDicFailed {
NSLog(@"%@ start", self.name);
XCTAssertThrows([assembly updateImmediUploadDic]);
NSLog(@"%@ end", self.name);
}
- (void)testUpdateImmediUploadDicSuccess {
NSLog(@"%@ start", self.name);
[assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
[assembly updateImmediUploadDic];
NSMutableArray *statusJsonArray = [assembly.immediUploadItemDic objectForKey:JsonKeyDataTypeStatus];
... ... @@ -199,6 +217,57 @@
NSLog(@"%@ end", self.name);
}
- (void)testSaveItemDataWithDevice {
NSLog(@"%@ start", self.name);
YHDevice *data = [[YHDevice alloc] init];
id partialMock = OCMPartialMock(assembly);
OCMExpect([partialMock canPersisting]).andReturn(YES);
XCTAssertThrows([assembly saveItemData:data]);
OCMVerifyAll(partialMock);
NSLog(@"%@ end", self.name);
}
- (void)testSaveItemDataWithStatus {
NSLog(@"%@ start", self.name);
YHStatus *data = [[YHStatus alloc] init];
id partialMock = OCMPartialMock(assembly);
OCMExpect([partialMock canPersisting]).andReturn(YES);
XCTAssertThrows([assembly saveItemData:data]);
OCMVerifyAll(partialMock);
NSLog(@"%@ end", self.name);
}
- (void)testSaveItemDataWithEvent {
NSLog(@"%@ start", self.name);
YHEvent *data = [[YHEvent alloc] init];
id partialMock = OCMPartialMock(assembly);
OCMExpect([partialMock canPersisting]).andReturn(YES);
XCTAssertNoThrow([assembly saveItemData:data]);
OCMVerifyAll(partialMock);
NSLog(@"%@ end", self.name);
}
- (void)testSaveItemDataWithError {
NSLog(@"%@ start", self.name);
YHError *data = [[YHError alloc] init];
id partialMock = OCMPartialMock(assembly);
OCMExpect([partialMock canPersisting]).andReturn(YES);
XCTAssertNoThrow([assembly saveItemData:data]);
OCMVerifyAll(partialMock);
NSLog(@"%@ end", self.name);
}
- (void)testUploadImmedilyWithEvent {
NSLog(@"%@ start", self.name);
... ...
... ... @@ -10,6 +10,16 @@
#import <XCTest/XCTest.h>
#import "OCMock.h"
#import "YHAssemblyAssistant.h"
#import "YHDevice.h"
#import "YHStatus.h"
@interface YHAssemblyAssistant (XCTestCase)
@property (strong, nonatomic, readonly) YHDevice *device;
@property (strong, nonatomic, readonly) YHStatus *currentStatus;
@property (strong, nonatomic, readonly) NSMutableDictionary *immediUploadItemDic;
@end
@interface YHAssemblyAssistantTests : XCTestCase {
@private
... ... @@ -112,8 +122,8 @@
- (void)testPrepareImmediUploadDicMethod {
NSLog(@"%@ start", self.name);
[[mock expect] prepareImmediUploadDic];
[mock prepareImmediUploadDic];
[[mock expect] prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
[mock prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
NSLog(@"%@ end", self.name);
}
... ...
... ... @@ -73,7 +73,7 @@
OCMExpect([networkAssistantMock addReachabilityChangedHandler:[OCMArg any]]);
OCMExpect(ClassMethod([crashReporterMock sharedInstance]));
OCMExpect([assemblyAssistantMock prepareImmediUploadDic]);
OCMExpect([assemblyAssistantMock prepareImmediUploadDic:@"appId" sessionId:[OCMArg any]]);
[analytics startWithAppId:@"appId"];
... ...