Authored by 周蓉君

将网络状态监控和定位服务调用封装到YHAssemblyAssistant中。更新相关测试用例。Review by 阿瑟。

@@ -19,7 +19,7 @@ @@ -19,7 +19,7 @@
19 <key>CFBundleSignature</key> 19 <key>CFBundleSignature</key>
20 <string>????</string> 20 <string>????</string>
21 <key>CFBundleVersion</key> 21 <key>CFBundleVersion</key>
22 - <string>1</string> 22 + <string>1.0.0.20150427</string>
23 <key>LSRequiresIPhoneOS</key> 23 <key>LSRequiresIPhoneOS</key>
24 <true/> 24 <true/>
25 <key>NSLocationAlwaysUsageDescription</key> 25 <key>NSLocationAlwaysUsageDescription</key>
@@ -10,13 +10,18 @@ @@ -10,13 +10,18 @@
10 #import <CoreLocation/CoreLocation.h> 10 #import <CoreLocation/CoreLocation.h>
11 #import "YHNetworkAssistant.h" 11 #import "YHNetworkAssistant.h"
12 #import "YHAnalyItemData.h" 12 #import "YHAnalyItemData.h"
13 -//#import "YHDevice.h"  
14 -//#import "YHStatus.h" 13 +
15 14
16 //阀值 15 //阀值
17 #define kMaxLocalEventsCount 3000 // 本地持久化event最大条数 16 #define kMaxLocalEventsCount 3000 // 本地持久化event最大条数
18 #define kMaxLocalRecoderFileSize (1024 * 300) // 本地持久化文件大小(300KB) 17 #define kMaxLocalRecoderFileSize (1024 * 300) // 本地持久化文件大小(300KB)
19 18
  19 +extern NSString * const kNetWorkStatusUnknow;
  20 +extern NSString * const kNetWorkStatusWIFI;
  21 +extern NSString * const kNetWorkStatus2G;
  22 +extern NSString * const kNetWorkStatus3G;
  23 +extern NSString * const kNetWorkStatus4G;
  24 +
20 extern NSString * const JsonKeyDataTypeDevice; 25 extern NSString * const JsonKeyDataTypeDevice;
21 extern NSString * const JsonKeyDataTypeStatus; 26 extern NSString * const JsonKeyDataTypeStatus;
22 extern NSString * const JsonKeyDataTypeEvents; 27 extern NSString * const JsonKeyDataTypeEvents;
@@ -26,7 +31,7 @@ extern NSString * const JsonKeyDataTypeErrors; @@ -26,7 +31,7 @@ extern NSString * const JsonKeyDataTypeErrors;
26 用于组装数据 31 用于组装数据
27 */ 32 */
28 33
29 -@interface YHAssemblyAssistant : NSObject 34 +@interface YHAssemblyAssistant : NSObject <CLLocationManagerDelegate>
30 35
31 + (instancetype)sharedInstance; 36 + (instancetype)sharedInstance;
32 37
@@ -40,14 +45,8 @@ extern NSString * const JsonKeyDataTypeErrors; @@ -40,14 +45,8 @@ extern NSString * const JsonKeyDataTypeErrors;
40 45
41 - (void)prepareImmediUploadDic:(NSString *)appId sessionId:(NSString *)sessionId; 46 - (void)prepareImmediUploadDic:(NSString *)appId sessionId:(NSString *)sessionId;
42 47
43 -- (void)updateImmediUploadDic;  
44 -  
45 - (void)uploadDiskData; 48 - (void)uploadDiskData;
46 49
47 - (void)uploadImmedilyWithEvent:(YHAnalyItemData *)itemData; 50 - (void)uploadImmedilyWithEvent:(YHAnalyItemData *)itemData;
48 51
49 -- (BOOL)updateLocation:(CLLocation *)location;  
50 -  
51 -- (BOOL)updateNetWorkStatus:(NSString *)status;  
52 -  
53 @end 52 @end
@@ -6,6 +6,9 @@ @@ -6,6 +6,9 @@
6 // Copyright (c) 2015年 YOHO. All rights reserved. 6 // Copyright (c) 2015年 YOHO. All rights reserved.
7 // 7 //
8 8
  9 +#import <CoreTelephony/CTCarrier.h>
  10 +#import <CoreTelephony/CTTelephonyNetworkInfo.h>
  11 +#import "Reachability.h"
9 #import "YHAssemblyAssistant.h" 12 #import "YHAssemblyAssistant.h"
10 //#import "YHErrorFactory.h" 13 //#import "YHErrorFactory.h"
11 //#import "YHEventFactory.h" 14 //#import "YHEventFactory.h"
@@ -21,6 +24,12 @@ @@ -21,6 +24,12 @@
21 #define kPathLogSystem [kPathCaches stringByAppendingPathComponent:@"YHLogSystem"] 24 #define kPathLogSystem [kPathCaches stringByAppendingPathComponent:@"YHLogSystem"]
22 #define kYASApiMethod @"yas_mobile" 25 #define kYASApiMethod @"yas_mobile"
23 26
  27 +NSString * const kNetWorkStatusUnknow = @"0";
  28 +NSString * const kNetWorkStatusWIFI = @"1";
  29 +NSString * const kNetWorkStatus2G = @"2";
  30 +NSString * const kNetWorkStatus3G = @"3";
  31 +NSString * const kNetWorkStatus4G = @"4";
  32 +
24 NSString * const JsonKeyDataTypeDevice = @"device"; 33 NSString * const JsonKeyDataTypeDevice = @"device";
25 NSString * const JsonKeyDataTypeStatus = @"status"; 34 NSString * const JsonKeyDataTypeStatus = @"status";
26 NSString * const JsonKeyDataTypeEvents = @"events"; 35 NSString * const JsonKeyDataTypeEvents = @"events";
@@ -39,18 +48,58 @@ static dispatch_queue_t persisting_queue() { @@ -39,18 +48,58 @@ static dispatch_queue_t persisting_queue() {
39 48
40 @interface YHAssemblyAssistant () 49 @interface YHAssemblyAssistant ()
41 50
  51 +/**
  52 + * 定位服务
  53 + */
  54 +@property (strong, nonatomic) CLLocationManager *locationManager;
  55 +/**
  56 + * 设备信息
  57 + */
42 @property (strong, nonatomic) YHDevice *device; 58 @property (strong, nonatomic) YHDevice *device;
  59 +/**
  60 + * 当前状态信息
  61 + */
43 @property (strong, nonatomic) YHStatus *currentStatus; 62 @property (strong, nonatomic) YHStatus *currentStatus;
44 -@property (strong, nonatomic) NSMutableDictionary *immediUploadItemDic; // 用于立即发送策略下(device信息是相同的)  
45 -@property (assign, nonatomic) NSUInteger allEventsCount; // 本地持久化event的条数 63 +/**
  64 + * 用于立即发送策略下(device信息是相同的)
  65 + */
  66 +@property (strong, nonatomic) NSMutableDictionary *immediUploadItemDic;
  67 +/**
  68 + * 本地持久化event的条数
  69 + */
  70 +@property (assign, nonatomic) NSUInteger allEventsCount;
  71 +/**
  72 + * 日志文件存储路径
  73 + */
46 @property (strong, nonatomic) NSString *eventFilePath; 74 @property (strong, nonatomic) NSString *eventFilePath;
  75 +/**
  76 + * 日志文件名称
  77 + */
47 @property (strong, nonatomic) NSString *eventFileName; 78 @property (strong, nonatomic) NSString *eventFileName;
  79 +/**
  80 + * 文件管理服务
  81 + */
48 @property (strong, nonatomic) NSFileManager *fileManager; 82 @property (strong, nonatomic) NSFileManager *fileManager;
49 83
  84 +
  85 +// 启动定位服务
  86 +- (void)startLocationService;
  87 +// 开启网络状态监测
  88 +- (void)startObserverNetworkReachabilityStatus;
  89 +// 将一个事件写入到文件
50 - (BOOL)writeEventToFile:(YHEvent *)eventData; 90 - (BOOL)writeEventToFile:(YHEvent *)eventData;
  91 +// 将一个错误写入到文件
51 - (BOOL)writeErrorToFile:(YHError *)errorData; 92 - (BOOL)writeErrorToFile:(YHError *)errorData;
  93 +// 当触发预设的条件时,自动上传数据
52 - (void)autoUploadData; 94 - (void)autoUploadData;
  95 +// 删除本地持久化文件
53 - (void)removeLocalFile; 96 - (void)removeLocalFile;
  97 +// 更新网络状态
  98 +- (BOOL)updateNetWorkStatus:(NSString *)status;
  99 +// 更新位置信息
  100 +- (BOOL)updateLocation:(CLLocation *)location;
  101 +// 更新立即上传信息
  102 +- (void)updateImmediUploadDic;
54 103
55 @end 104 @end
56 105
@@ -110,6 +159,18 @@ static dispatch_queue_t persisting_queue() { @@ -110,6 +159,18 @@ static dispatch_queue_t persisting_queue() {
110 return _eventFileName; 159 return _eventFileName;
111 } 160 }
112 161
  162 +- (CLLocationManager *)locationManager
  163 +{
  164 + if (!_locationManager) {
  165 + _locationManager = [[CLLocationManager alloc]init];
  166 + _locationManager.delegate = self;
  167 + _locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 精度越高,越费电,根据需要设定
  168 + _locationManager.distanceFilter = 1000; // 位置移动1000米,发一次更新消息
  169 + }
  170 +
  171 + return _locationManager;
  172 +}
  173 +
113 #pragma mark - public method 174 #pragma mark - public method
114 175
115 - (BOOL)canPersisting 176 - (BOOL)canPersisting
@@ -141,21 +202,10 @@ static dispatch_queue_t persisting_queue() { @@ -141,21 +202,10 @@ static dispatch_queue_t persisting_queue() {
141 202
142 // 设置status 203 // 设置status
143 [self.immediUploadItemDic setObject: [[NSMutableArray alloc]initWithObjects:self.currentStatus.jsonDictionary, nil] forKey:JsonKeyDataTypeStatus]; 204 [self.immediUploadItemDic setObject: [[NSMutableArray alloc]initWithObjects:self.currentStatus.jsonDictionary, nil] forKey:JsonKeyDataTypeStatus];
144 -  
145 -}  
146 -  
147 -- (void)updateImmediUploadDic  
148 -{  
149 - NSMutableArray *allStatus = [self.immediUploadItemDic objectForKey:JsonKeyDataTypeStatus];  
150 - if ([allStatus count]) {  
151 - [allStatus replaceObjectAtIndex:0 withObject:self.currentStatus.jsonDictionary];  
152 - [self.immediUploadItemDic setObject:allStatus forKey:JsonKeyDataTypeStatus];  
153 - } else {  
154 - NSException *exception = [NSException exceptionWithName:NSGenericException  
155 - reason:@"appId and sessionId do not be initialized. Please use prepareImmediUploadDic:sessionId: first."  
156 - userInfo:nil];  
157 - [exception raise];  
158 - } 205 +
  206 + [self startObserverNetworkReachabilityStatus];
  207 +
  208 + [self startLocationService];
159 } 209 }
160 210
161 #pragma mark - 持久化数据 211 #pragma mark - 持久化数据
@@ -266,6 +316,93 @@ static dispatch_queue_t persisting_queue() { @@ -266,6 +316,93 @@ static dispatch_queue_t persisting_queue() {
266 } 316 }
267 } 317 }
268 318
  319 +#pragma mark - private method
  320 +
  321 +// 添加网络监测回调block
  322 +- (void)startObserverNetworkReachabilityStatus
  323 +{
  324 + /**
  325 + CTRadioAccessTechnologyGPRS - 2G
  326 + CTRadioAccessTechnologyEdge - 2G (sometimes called 2.5G)
  327 + CTRadioAccessTechnologyWCDMA - 3G
  328 + CTRadioAccessTechnologyHSDPA - 3G (sometimes called 3.5G)
  329 + CTRadioAccessTechnologyHSUPA - 3G
  330 + CTRadioAccessTechnologyCDMA1x - 2G
  331 + CTRadioAccessTechnologyCDMAEVDORev0 - 3G
  332 + CTRadioAccessTechnologyCDMAEVDORevA - 3G
  333 + CTRadioAccessTechnologyCDMAEVDORevB - 3G
  334 + CTRadioAccessTechnologyeHRPD - 3G (or 3.5 - eHRPD is to allow migration from CDMA EVDO to LTE)
  335 + CTRadioAccessTechnologyLTE - 4G (allowed to be called 4G by the ITU as mentioend above)
  336 + */
  337 + [[YHNetworkAssistant sharedInstance] addReachabilityChangedHandler:^(AFNetworkReachabilityStatus networkStatus) {
  338 + NSString *net = kNetWorkStatusUnknow;
  339 +
  340 + CTTelephonyNetworkInfo *netInfo = [[CTTelephonyNetworkInfo alloc] init];
  341 + switch (networkStatus) {
  342 + case AFNetworkReachabilityStatusUnknown:
  343 + case AFNetworkReachabilityStatusNotReachable:
  344 + net = kNetWorkStatusUnknow;
  345 + break;
  346 +
  347 + case AFNetworkReachabilityStatusReachableViaWWAN:
  348 + {
  349 + if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0) {
  350 + if ([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) {
  351 + net = kNetWorkStatus2G;
  352 + } else if([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA] || [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {
  353 + net = kNetWorkStatus3G;
  354 + } else if([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
  355 + net = kNetWorkStatus4G;
  356 + } else {
  357 + net = kNetWorkStatusUnknow;
  358 + }
  359 + } else {
  360 + net = kNetWorkStatusUnknow;
  361 + }
  362 + }
  363 + break;
  364 + case AFNetworkReachabilityStatusReachableViaWiFi:
  365 + net = kNetWorkStatusWIFI;
  366 + break;
  367 +
  368 + default:
  369 + break;
  370 + }
  371 +
  372 + if ([self updateNetWorkStatus:net]) {
  373 + [self updateImmediUploadDic];
  374 + }
  375 + }];
  376 +}
  377 +
  378 +// 启动定位服务
  379 +- (void)startLocationService
  380 +{
  381 + //判断用户定位服务是否开启
  382 + if ([CLLocationManager locationServicesEnabled]) {
  383 + [self.locationManager startUpdatingLocation];
  384 + } else {
  385 + //不能定位用户的位置
  386 + //1.提醒用户检查当前的网络状况
  387 + //2.提醒用户打开定位开关
  388 + }
  389 +}
  390 +
  391 +// 更新网络状态
  392 +- (BOOL)updateNetWorkStatus:(NSString *)status
  393 +{
  394 + if (status == nil || [status length] == 0) {
  395 + return NO;
  396 + }
  397 +
  398 + if ([status isEqualToString:self.currentStatus.net]) {
  399 + return NO;
  400 + }
  401 +
  402 + self.currentStatus.net = status;
  403 + return YES;
  404 +}
  405 +
269 - (BOOL)updateLocation:(CLLocation *)location 406 - (BOOL)updateLocation:(CLLocation *)location
270 { 407 {
271 if (location == nil || ![location isKindOfClass:[CLLocation class]]) { 408 if (location == nil || ![location isKindOfClass:[CLLocation class]]) {
@@ -294,22 +431,21 @@ static dispatch_queue_t persisting_queue() { @@ -294,22 +431,21 @@ static dispatch_queue_t persisting_queue() {
294 return YES; 431 return YES;
295 } 432 }
296 433
297 -- (BOOL)updateNetWorkStatus:(NSString *)status 434 +// 更新立即上传信息
  435 +- (void)updateImmediUploadDic
298 { 436 {
299 - if (status == nil || [status length] == 0) {  
300 - return NO;  
301 - }  
302 -  
303 - if ([status isEqualToString:self.currentStatus.net]) {  
304 - return NO; 437 + NSMutableArray *allStatus = [self.immediUploadItemDic objectForKey:JsonKeyDataTypeStatus];
  438 + if ([allStatus count]) {
  439 + [allStatus replaceObjectAtIndex:0 withObject:self.currentStatus.jsonDictionary];
  440 + [self.immediUploadItemDic setObject:allStatus forKey:JsonKeyDataTypeStatus];
  441 + } else {
  442 + NSException *exception = [NSException exceptionWithName:NSGenericException
  443 + reason:@"appId and sessionId do not be initialized. Please use prepareImmediUploadDic:sessionId: first."
  444 + userInfo:nil];
  445 + [exception raise];
305 } 446 }
306 -  
307 - self.currentStatus.net = status;  
308 - return YES;  
309 } 447 }
310 448
311 -#pragma mark - private method  
312 -  
313 // 将一个事件写入到文件 449 // 将一个事件写入到文件
314 - (BOOL)writeEventToFile:(YHEvent *)event 450 - (BOOL)writeEventToFile:(YHEvent *)event
315 { 451 {
@@ -452,4 +588,51 @@ static dispatch_queue_t persisting_queue() { @@ -452,4 +588,51 @@ static dispatch_queue_t persisting_queue() {
452 self.allEventsCount = 0; 588 self.allEventsCount = 0;
453 } 589 }
454 590
  591 +#pragma mark - CLLocationManagerDelegate
  592 +
  593 +// 返回定位服务认证状态的委托方法
  594 +- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
  595 +{
  596 + switch (status) {
  597 + case kCLAuthorizationStatusNotDetermined: {
  598 + if ([manager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
  599 + [manager requestAlwaysAuthorization];
  600 + }
  601 + }
  602 + break;
  603 + case kCLAuthorizationStatusRestricted:
  604 + //定位服务无法使用,请开启手机定位服务
  605 + break;
  606 + case kCLAuthorizationStatusDenied:
  607 + //程序定位服务未开启, 您需要去设置界面启用我们App定位服务
  608 + break;
  609 + default:
  610 + break;
  611 + }
  612 +}
  613 +
  614 +//协议中的方法,作用是每当位置发生更新时会调用的委托方法
  615 +- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
  616 +{
  617 + //locations数组里边存放的是CLLocation对象,一个CLLocation对象就代表着一个位置
  618 + CLLocation *newLocation = [locations firstObject];
  619 +
  620 + if ([self updateLocation:newLocation]) {
  621 + [self updateImmediUploadDic];
  622 + }
  623 +}
  624 +
  625 +//当位置获取或更新失败会调用的方法
  626 +- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
  627 +{
  628 + NSString *errorMsg = nil;
  629 + if ([error code] == kCLErrorDenied) {
  630 + errorMsg = @"定位功能访问被拒绝";
  631 + }
  632 + if ([error code] == kCLErrorLocationUnknown) {
  633 + errorMsg = @"获取位置信息失败";
  634 + }
  635 + NSLog(@"%@", errorMsg);
  636 +}
  637 +
455 @end 638 @end
@@ -7,7 +7,6 @@ @@ -7,7 +7,6 @@
7 // 7 //
8 8
9 #import <Foundation/Foundation.h> 9 #import <Foundation/Foundation.h>
10 -#import <CoreLocation/CoreLocation.h>  
11 #import "YHError.h" 10 #import "YHError.h"
12 #import "YHEvent.h" 11 #import "YHEvent.h"
13 12
@@ -23,7 +22,7 @@ typedef enum _YHLogStrategy { @@ -23,7 +22,7 @@ typedef enum _YHLogStrategy {
23 LogStrategyImmedi // 立即发送 22 LogStrategyImmedi // 立即发送
24 } YHLogStrategy; 23 } YHLogStrategy;
25 24
26 -@interface YH_Analytics : NSObject <CLLocationManagerDelegate> 25 +@interface YH_Analytics : NSObject
27 /** 26 /**
28 * 获取统计对象的实例 27 * 获取统计对象的实例
29 */ 28 */
@@ -6,34 +6,20 @@ @@ -6,34 +6,20 @@
6 // Copyright (c) 2015年 YOHO. All rights reserved. 6 // Copyright (c) 2015年 YOHO. All rights reserved.
7 // 7 //
8 8
9 -#import <CoreTelephony/CTCarrier.h>  
10 -#import <CoreTelephony/CTTelephonyNetworkInfo.h>  
11 //#import "YHErrorFactory.h" 9 //#import "YHErrorFactory.h"
12 //#import "YHEventFactory.h" 10 //#import "YHEventFactory.h"
13 //#import "YHDeviceFactory.h" 11 //#import "YHDeviceFactory.h"
14 //#import "YHStatusFactory.h" 12 //#import "YHStatusFactory.h"
15 #import "YH_Analytics.h" 13 #import "YH_Analytics.h"
16 #import "NSString+YHAnalytics.h" 14 #import "NSString+YHAnalytics.h"
17 -#import "Reachability.h"  
18 #import "YHCrashReporter.h" 15 #import "YHCrashReporter.h"
19 #import "YHAssemblyAssistant.h" 16 #import "YHAssemblyAssistant.h"
20 #import "OpenUDID.h" 17 #import "OpenUDID.h"
21 18
22 19
23 -#define kNetWorkStatusUnknow @"0"  
24 -#define kNetWorkStatusWIFI @"1"  
25 -#define kNetWorkStatus2G @"2"  
26 -#define kNetWorkStatus3G @"3"  
27 -#define kNetWorkStatus4G @"4"  
28 -  
29 -  
30 @interface YH_Analytics () 20 @interface YH_Analytics ()
31 21
32 /** 22 /**
33 - * 定位服务  
34 - */  
35 -@property (strong, nonatomic) CLLocationManager *locationManager;  
36 -/**  
37 * 应用ID 23 * 应用ID
38 */ 24 */
39 @property (strong, nonatomic) NSString *appId; 25 @property (strong, nonatomic) NSString *appId;
@@ -68,8 +54,6 @@ @@ -68,8 +54,6 @@
68 54
69 55
70 - (NSString *)timestamp; 56 - (NSString *)timestamp;
71 -- (void)startObserverNetworkReachabilityStatus;  
72 -- (void)startLocationService;  
73 - (void)registerCrashReporter; 57 - (void)registerCrashReporter;
74 - (void)registerAppWillEnterForegroundNotification; 58 - (void)registerAppWillEnterForegroundNotification;
75 - (void)resetSession; 59 - (void)resetSession;
@@ -136,89 +120,8 @@ @@ -136,89 +120,8 @@
136 return _session; 120 return _session;
137 } 121 }
138 122
139 -- (CLLocationManager *)locationManager  
140 -{  
141 - if (!_locationManager) {  
142 - _locationManager = [[CLLocationManager alloc]init];  
143 - _locationManager.delegate = self;  
144 - _locationManager.desiredAccuracy = kCLLocationAccuracyBest;  
145 - _locationManager.distanceFilter = 100;  
146 - }  
147 -  
148 - return _locationManager;  
149 -}  
150 -  
151 #pragma mark - Private Method 123 #pragma mark - Private Method
152 124
153 -// 添加网络监测回调block  
154 -- (void)startObserverNetworkReachabilityStatus  
155 -{  
156 - /**  
157 - CTRadioAccessTechnologyGPRS - 2G  
158 - CTRadioAccessTechnologyEdge - 2G (sometimes called 2.5G)  
159 - CTRadioAccessTechnologyWCDMA - 3G  
160 - CTRadioAccessTechnologyHSDPA - 3G (sometimes called 3.5G)  
161 - CTRadioAccessTechnologyHSUPA - 3G  
162 - CTRadioAccessTechnologyCDMA1x - 2G  
163 - CTRadioAccessTechnologyCDMAEVDORev0 - 3G  
164 - CTRadioAccessTechnologyCDMAEVDORevA - 3G  
165 - CTRadioAccessTechnologyCDMAEVDORevB - 3G  
166 - CTRadioAccessTechnologyeHRPD - 3G (or 3.5 - eHRPD is to allow migration from CDMA EVDO to LTE)  
167 - CTRadioAccessTechnologyLTE - 4G (allowed to be called 4G by the ITU as mentioend above)  
168 - */  
169 - [[YHNetworkAssistant sharedInstance] addReachabilityChangedHandler:^(AFNetworkReachabilityStatus networkStatus) {  
170 - NSString *net = kNetWorkStatusUnknow;  
171 -  
172 - CTTelephonyNetworkInfo *netInfo = [[CTTelephonyNetworkInfo alloc] init];  
173 - switch (networkStatus) {  
174 - case AFNetworkReachabilityStatusUnknown:  
175 - case AFNetworkReachabilityStatusNotReachable:  
176 - net = kNetWorkStatusUnknow;  
177 - break;  
178 -  
179 - case AFNetworkReachabilityStatusReachableViaWWAN:  
180 - {  
181 - if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0) {  
182 - if ([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) {  
183 - net = kNetWorkStatus2G;  
184 - } else if([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA] || [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {  
185 - net = kNetWorkStatus3G;  
186 - } else if([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {  
187 - net = kNetWorkStatus4G;  
188 - } else {  
189 - net = kNetWorkStatusUnknow;  
190 - }  
191 - } else {  
192 - net = kNetWorkStatusUnknow;  
193 - }  
194 - }  
195 - break;  
196 - case AFNetworkReachabilityStatusReachableViaWiFi:  
197 - net = kNetWorkStatusWIFI;  
198 - break;  
199 -  
200 - default:  
201 - break;  
202 - }  
203 -  
204 - if ([[YHAssemblyAssistant sharedInstance] updateNetWorkStatus:net]) {  
205 - [[YHAssemblyAssistant sharedInstance] updateImmediUploadDic];  
206 - }  
207 - }];  
208 -}  
209 -  
210 -// 启动定位服务  
211 -- (void)startLocationService  
212 -{  
213 - if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {  
214 - [self.locationManager requestAlwaysAuthorization];  
215 - }  
216 -  
217 - if ([CLLocationManager locationServicesEnabled]) {  
218 - [self.locationManager startUpdatingLocation];  
219 - }  
220 -}  
221 -  
222 - (void)registerCrashReporter 125 - (void)registerCrashReporter
223 { 126 {
224 [YHCrashReporter sharedInstance]; 127 [YHCrashReporter sharedInstance];
@@ -288,10 +191,6 @@ @@ -288,10 +191,6 @@
288 191
289 [[YHAssemblyAssistant sharedInstance] prepareImmediUploadDic:appId sessionId:self.session]; 192 [[YHAssemblyAssistant sharedInstance] prepareImmediUploadDic:appId sessionId:self.session];
290 193
291 - [self startObserverNetworkReachabilityStatus];  
292 -  
293 - [self startLocationService];  
294 -  
295 [self registerCrashReporter]; 194 [self registerCrashReporter];
296 195
297 [self registerAppWillEnterForegroundNotification]; 196 [self registerAppWillEnterForegroundNotification];
@@ -321,8 +220,6 @@ @@ -321,8 +220,6 @@
321 { 220 {
322 NSLog(@"logEvent %@, %@", eventId, param); 221 NSLog(@"logEvent %@, %@", eventId, param);
323 222
324 - [self startLocationService];  
325 -  
326 self.event = [[YHEvent alloc] init]; 223 self.event = [[YHEvent alloc] init];
327 self.event.op = eventId; 224 self.event.op = eventId;
328 self.event.uid = self.uid ? self.uid : @""; 225 self.event.uid = self.uid ? self.uid : @"";
@@ -384,39 +281,4 @@ @@ -384,39 +281,4 @@
384 // } 281 // }
385 //} 282 //}
386 283
387 -#pragma mark - CLLocationManagerDelegate  
388 -  
389 -- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status  
390 -{  
391 - if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse){  
392 - [manager startUpdatingLocation];  
393 - // ...  
394 - } else {  
395 - if ([manager respondsToSelector:@selector(requestAlwaysAuthorization)]) {  
396 - [manager requestAlwaysAuthorization];  
397 - }  
398 - }  
399 -}  
400 -  
401 -//协议中的方法,作用是每当位置发生更新时会调用的委托方法  
402 -- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation  
403 -{  
404 - if ([[YHAssemblyAssistant sharedInstance] updateLocation:newLocation]) {  
405 - [[YHAssemblyAssistant sharedInstance] updateImmediUploadDic];  
406 - }  
407 -}  
408 -  
409 -//当位置获取或更新失败会调用的方法  
410 -- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error  
411 -{  
412 - NSString *errorMsg = nil;  
413 - if ([error code] == kCLErrorDenied) {  
414 - errorMsg = @"定位功能访问被拒绝";  
415 - }  
416 - if ([error code] == kCLErrorLocationUnknown) {  
417 - errorMsg = @"获取位置信息失败";  
418 - }  
419 - NSLog(@"%@", errorMsg);  
420 -}  
421 -  
422 @end 284 @end
@@ -16,7 +16,7 @@ @@ -16,7 +16,7 @@
16 16
17 - (void)changeAuthorizationStatus:(CLAuthorizationStatus)status; 17 - (void)changeAuthorizationStatus:(CLAuthorizationStatus)status;
18 18
19 -- (void)updateLocation:(CLLocation *)newLocation oldLocation:(CLLocation *)oldLocation; 19 +- (void)updateLocations:(NSArray *)locations;
20 20
21 - (void)failedLocation:(NSError *)error; 21 - (void)failedLocation:(NSError *)error;
22 22
@@ -22,10 +22,10 @@ @@ -22,10 +22,10 @@
22 } 22 }
23 } 23 }
24 24
25 -- (void)updateLocation:(CLLocation *)newLocation oldLocation:(CLLocation *)oldLocation 25 +- (void)updateLocations:(NSArray *)locations
26 { 26 {
27 - if (self.delegate && [self.delegate respondsToSelector:@selector(locationManager:didUpdateToLocation:fromLocation:)]) {  
28 - [self.delegate locationManager:self didUpdateToLocation:newLocation fromLocation:oldLocation]; 27 + if (self.delegate && [self.delegate respondsToSelector:@selector(locationManager:didUpdateLocations:)]) {
  28 + [self.delegate locationManager:self didUpdateLocations:locations];
29 } 29 }
30 } 30 }
31 31
@@ -9,28 +9,36 @@ @@ -9,28 +9,36 @@
9 #import <UIKit/UIKit.h> 9 #import <UIKit/UIKit.h>
10 #import <XCTest/XCTest.h> 10 #import <XCTest/XCTest.h>
11 #import "OCMock.h" 11 #import "OCMock.h"
  12 +#import <CoreLocation/CoreLocation.h>
12 #import "YHAssemblyAssistant.h" 13 #import "YHAssemblyAssistant.h"
13 #import "YHDevice.h" 14 #import "YHDevice.h"
14 #import "YHStatus.h" 15 #import "YHStatus.h"
15 #import "YHEvent.h" 16 #import "YHEvent.h"
16 #import "YHError.h" 17 #import "YHError.h"
  18 +#import "FakeLocationManager.h"
17 19
18 @interface YHAssemblyAssistant (XCTestCase) 20 @interface YHAssemblyAssistant (XCTestCase)
19 21
20 @property (strong, nonatomic) NSString *eventFilePath; 22 @property (strong, nonatomic) NSString *eventFilePath;
21 @property (strong, nonatomic) NSString *eventFileName; 23 @property (strong, nonatomic) NSString *eventFileName;
22 @property (strong, nonatomic) NSFileManager *fileManager; // 属性注入 DI 24 @property (strong, nonatomic) NSFileManager *fileManager; // 属性注入 DI
  25 +@property (strong, nonatomic) CLLocationManager *locationManager;
23 26
24 @property (strong, nonatomic, readonly) YHDevice *device; 27 @property (strong, nonatomic, readonly) YHDevice *device;
25 @property (strong, nonatomic, readonly) YHStatus *currentStatus; 28 @property (strong, nonatomic, readonly) YHStatus *currentStatus;
26 @property (strong, nonatomic, readonly) NSMutableDictionary *immediUploadItemDic; 29 @property (strong, nonatomic, readonly) NSMutableDictionary *immediUploadItemDic;
27 30
  31 +- (BOOL)updateNetWorkStatus:(NSString *)status;
  32 +- (BOOL)updateLocation:(CLLocation *)location;
  33 +- (void)updateImmediUploadDic;
  34 +
28 @end 35 @end
29 36
30 37
31 38
32 @interface YHAssemblyAssistantLogicTests : XCTestCase { 39 @interface YHAssemblyAssistantLogicTests : XCTestCase {
33 YHAssemblyAssistant *assembly; 40 YHAssemblyAssistant *assembly;
  41 + id partialMock;
34 id mock; 42 id mock;
35 } 43 }
36 44
@@ -51,6 +59,8 @@ @@ -51,6 +59,8 @@
51 mock = OCMClassMock([NSFileManager class]); 59 mock = OCMClassMock([NSFileManager class]);
52 OCMStub([mock defaultManager]).andReturn(mock); 60 OCMStub([mock defaultManager]).andReturn(mock);
53 assembly.fileManager = mock; 61 assembly.fileManager = mock;
  62 +
  63 + partialMock = OCMPartialMock(assembly);
54 } 64 }
55 65
56 - (void)tearDown { 66 - (void)tearDown {
@@ -183,7 +193,6 @@ @@ -183,7 +193,6 @@
183 - (void)testSaveItemDataWithInputNil { 193 - (void)testSaveItemDataWithInputNil {
184 NSLog(@"%@ start", self.name); 194 NSLog(@"%@ start", self.name);
185 195
186 - id partialMock = OCMPartialMock(assembly);  
187 [[partialMock reject] canPersisting]; 196 [[partialMock reject] canPersisting];
188 197
189 XCTAssertThrows([assembly saveItemData:nil]); 198 XCTAssertThrows([assembly saveItemData:nil]);
@@ -195,7 +204,6 @@ @@ -195,7 +204,6 @@
195 - (void)testSaveItemDataWithInputInvalid { 204 - (void)testSaveItemDataWithInputInvalid {
196 NSLog(@"%@ start", self.name); 205 NSLog(@"%@ start", self.name);
197 206
198 - id partialMock = OCMPartialMock(assembly);  
199 [[partialMock reject] canPersisting]; 207 [[partialMock reject] canPersisting];
200 208
201 XCTAssertThrows([assembly saveItemData:@"invalid"]); 209 XCTAssertThrows([assembly saveItemData:@"invalid"]);
@@ -208,7 +216,7 @@ @@ -208,7 +216,7 @@
208 NSLog(@"%@ start", self.name); 216 NSLog(@"%@ start", self.name);
209 217
210 YHAnalyItemData *data = [[YHAnalyItemData alloc] init]; 218 YHAnalyItemData *data = [[YHAnalyItemData alloc] init];
211 - id partialMock = OCMPartialMock(assembly); 219 +
212 OCMExpect([partialMock canPersisting]).andReturn(NO); 220 OCMExpect([partialMock canPersisting]).andReturn(NO);
213 221
214 XCTAssertThrows([assembly saveItemData:data]); 222 XCTAssertThrows([assembly saveItemData:data]);
@@ -221,7 +229,7 @@ @@ -221,7 +229,7 @@
221 NSLog(@"%@ start", self.name); 229 NSLog(@"%@ start", self.name);
222 230
223 YHDevice *data = [[YHDevice alloc] init]; 231 YHDevice *data = [[YHDevice alloc] init];
224 - id partialMock = OCMPartialMock(assembly); 232 +
225 OCMExpect([partialMock canPersisting]).andReturn(YES); 233 OCMExpect([partialMock canPersisting]).andReturn(YES);
226 234
227 XCTAssertThrows([assembly saveItemData:data]); 235 XCTAssertThrows([assembly saveItemData:data]);
@@ -234,7 +242,7 @@ @@ -234,7 +242,7 @@
234 NSLog(@"%@ start", self.name); 242 NSLog(@"%@ start", self.name);
235 243
236 YHStatus *data = [[YHStatus alloc] init]; 244 YHStatus *data = [[YHStatus alloc] init];
237 - id partialMock = OCMPartialMock(assembly); 245 +
238 OCMExpect([partialMock canPersisting]).andReturn(YES); 246 OCMExpect([partialMock canPersisting]).andReturn(YES);
239 247
240 XCTAssertThrows([assembly saveItemData:data]); 248 XCTAssertThrows([assembly saveItemData:data]);
@@ -247,7 +255,7 @@ @@ -247,7 +255,7 @@
247 NSLog(@"%@ start", self.name); 255 NSLog(@"%@ start", self.name);
248 256
249 YHEvent *data = [[YHEvent alloc] init]; 257 YHEvent *data = [[YHEvent alloc] init];
250 - id partialMock = OCMPartialMock(assembly); 258 +
251 OCMExpect([partialMock canPersisting]).andReturn(YES); 259 OCMExpect([partialMock canPersisting]).andReturn(YES);
252 260
253 XCTAssertNoThrow([assembly saveItemData:data]); 261 XCTAssertNoThrow([assembly saveItemData:data]);
@@ -260,7 +268,7 @@ @@ -260,7 +268,7 @@
260 NSLog(@"%@ start", self.name); 268 NSLog(@"%@ start", self.name);
261 269
262 YHError *data = [[YHError alloc] init]; 270 YHError *data = [[YHError alloc] init];
263 - id partialMock = OCMPartialMock(assembly); 271 +
264 OCMExpect([partialMock canPersisting]).andReturn(YES); 272 OCMExpect([partialMock canPersisting]).andReturn(YES);
265 273
266 XCTAssertNoThrow([assembly saveItemData:data]); 274 XCTAssertNoThrow([assembly saveItemData:data]);
@@ -337,4 +345,42 @@ @@ -337,4 +345,42 @@
337 345
338 NSLog(@"%@ end", self.name); 346 NSLog(@"%@ end", self.name);
339 } 347 }
  348 +
  349 +#pragma mark - Test Location Sevice
  350 +
  351 +- (void)testLocationUpdateSuccess {
  352 + NSLog(@"%@ start", self.name);
  353 +
  354 + assembly.locationManager = (CLLocationManager *)[FakeLocationManager new];
  355 + assembly.locationManager.delegate = assembly;
  356 + CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:20.0f longitude:120.0f];
  357 +
  358 + [[[partialMock expect] andReturnValue:@YES] updateLocation:newLocation];
  359 + OCMExpect([partialMock updateImmediUploadDic]);
  360 +
  361 + [assembly prepareImmediUploadDic:@"appId" sessionId:@"seesionId"];
  362 + [(FakeLocationManager *)assembly.locationManager updateLocations:@[newLocation]];
  363 +
  364 + OCMVerifyAll(partialMock);
  365 +
  366 + NSLog(@"%@ end", self.name);
  367 +}
  368 +
  369 +- (void)testLocationUpdateFailed {
  370 + NSLog(@"%@ start", self.name);
  371 +
  372 + assembly.locationManager = (CLLocationManager *)[FakeLocationManager new];
  373 + assembly.locationManager.delegate = assembly;
  374 + CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:20.0f longitude:120.0f];
  375 +
  376 + [[[partialMock expect] andReturnValue:@NO] updateLocation:newLocation];
  377 + [[partialMock reject] updateImmediUploadDic];
  378 +
  379 + [assembly prepareImmediUploadDic:@"appId" sessionId:@"seesionId"];
  380 + [(FakeLocationManager *)assembly.locationManager updateLocations:@[newLocation]];
  381 +
  382 + OCMVerifyAll(partialMock);
  383 +
  384 + NSLog(@"%@ end", self.name);
  385 +}
340 @end 386 @end
@@ -128,15 +128,6 @@ @@ -128,15 +128,6 @@
128 NSLog(@"%@ end", self.name); 128 NSLog(@"%@ end", self.name);
129 } 129 }
130 130
131 -- (void)testUpdateImmediUploadDicMethod {  
132 - NSLog(@"%@ start", self.name);  
133 -  
134 - [[mock expect] updateImmediUploadDic];  
135 - [mock updateImmediUploadDic];  
136 -  
137 - NSLog(@"%@ end", self.name);  
138 -}  
139 -  
140 - (void)testUploadDiskDataMethod { 131 - (void)testUploadDiskDataMethod {
141 NSLog(@"%@ start", self.name); 132 NSLog(@"%@ start", self.name);
142 133
@@ -9,19 +9,15 @@ @@ -9,19 +9,15 @@
9 #import <UIKit/UIKit.h> 9 #import <UIKit/UIKit.h>
10 #import <XCTest/XCTest.h> 10 #import <XCTest/XCTest.h>
11 #import "OCMock.h" 11 #import "OCMock.h"
12 -#import <CoreLocation/CoreLocation.h>  
13 #import "YHCrashReporter.h" 12 #import "YHCrashReporter.h"
14 #import "YHAssemblyAssistant.h" 13 #import "YHAssemblyAssistant.h"
15 #import "YH_Analytics.h" 14 #import "YH_Analytics.h"
16 #import "YHEvent.h" 15 #import "YHEvent.h"
17 16
18 -#import "FakeLocationManager.h"  
19 -  
20 @interface YH_Analytics (XCTestCase) 17 @interface YH_Analytics (XCTestCase)
21 18
22 @property (assign, nonatomic) YHLogStrategy logStrategy; 19 @property (assign, nonatomic) YHLogStrategy logStrategy;
23 @property (assign, nonatomic) NSTimeInterval currentInterval; 20 @property (assign, nonatomic) NSTimeInterval currentInterval;
24 -@property (strong, nonatomic) CLLocationManager *locationManager;  
25 21
26 @end 22 @end
27 23
@@ -29,7 +25,6 @@ @@ -29,7 +25,6 @@
29 @private 25 @private
30 id assemblyAssistantMock; 26 id assemblyAssistantMock;
31 id crashReporterMock; 27 id crashReporterMock;
32 - id networkAssistantMock;  
33 YH_Analytics *analytics; 28 YH_Analytics *analytics;
34 } 29 }
35 30
@@ -52,9 +47,6 @@ @@ -52,9 +47,6 @@
52 crashReporterMock = OCMClassMock([YHCrashReporter class]); 47 crashReporterMock = OCMClassMock([YHCrashReporter class]);
53 OCMStub([crashReporterMock sharedInstance]).andReturn(crashReporterMock); 48 OCMStub([crashReporterMock sharedInstance]).andReturn(crashReporterMock);
54 49
55 - networkAssistantMock = OCMClassMock([YHNetworkAssistant class]);  
56 - OCMStub([networkAssistantMock sharedInstance]).andReturn(networkAssistantMock);  
57 -  
58 analytics = [[YH_Analytics alloc] init]; 50 analytics = [[YH_Analytics alloc] init];
59 } 51 }
60 52
@@ -62,7 +54,6 @@ @@ -62,7 +54,6 @@
62 // Put teardown code here. This method is called after the invocation of each test method in the class. 54 // Put teardown code here. This method is called after the invocation of each test method in the class.
63 assemblyAssistantMock = nil; 55 assemblyAssistantMock = nil;
64 crashReporterMock = nil; 56 crashReporterMock = nil;
65 - networkAssistantMock = nil;  
66 analytics = nil; 57 analytics = nil;
67 58
68 [super tearDown]; 59 [super tearDown];
@@ -83,13 +74,11 @@ @@ -83,13 +74,11 @@
83 - (void)testStartWithAppIdMethod { 74 - (void)testStartWithAppIdMethod {
84 NSLog(@"%@ start", self.name); 75 NSLog(@"%@ start", self.name);
85 76
86 - OCMExpect([networkAssistantMock addReachabilityChangedHandler:[OCMArg any]]);  
87 OCMExpect(ClassMethod([crashReporterMock sharedInstance])); 77 OCMExpect(ClassMethod([crashReporterMock sharedInstance]));
88 OCMExpect([assemblyAssistantMock prepareImmediUploadDic:@"appId" sessionId:[OCMArg any]]); 78 OCMExpect([assemblyAssistantMock prepareImmediUploadDic:@"appId" sessionId:[OCMArg any]]);
89 79
90 [analytics startWithAppId:@"appId"]; 80 [analytics startWithAppId:@"appId"];
91 81
92 - OCMVerifyAll(networkAssistantMock);  
93 OCMVerify(ClassMethod([crashReporterMock sharedInstance])); 82 OCMVerify(ClassMethod([crashReporterMock sharedInstance]));
94 OCMVerifyAll(assemblyAssistantMock); 83 OCMVerifyAll(assemblyAssistantMock);
95 84
@@ -287,41 +276,4 @@ @@ -287,41 +276,4 @@
287 NSLog(@"%@ end", self.name); 276 NSLog(@"%@ end", self.name);
288 } 277 }
289 278
290 -#pragma mark - Test Location Sevice  
291 -  
292 -- (void)testLocationUpdateSuccess {  
293 - NSLog(@"%@ start", self.name);  
294 -  
295 - analytics.locationManager = [[FakeLocationManager alloc] init];  
296 - analytics.locationManager.delegate = analytics;  
297 - CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:20.0f longitude:120.0f];  
298 -  
299 - [[[assemblyAssistantMock expect] andReturnValue:@YES] updateLocation:newLocation];  
300 - OCMExpect([assemblyAssistantMock updateImmediUploadDic]);  
301 -  
302 - [analytics startWithAppId:@"appId"];  
303 - [(FakeLocationManager *)analytics.locationManager updateLocation:newLocation oldLocation:nil];  
304 -  
305 - OCMVerifyAll(assemblyAssistantMock);  
306 -  
307 - NSLog(@"%@ end", self.name);  
308 -}  
309 -  
310 -- (void)testLocationUpdateFailed {  
311 - NSLog(@"%@ start", self.name);  
312 -  
313 - analytics.locationManager = [[FakeLocationManager alloc] init];  
314 - analytics.locationManager.delegate = analytics;  
315 - CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:20.0f longitude:120.0f];  
316 -  
317 - [[[assemblyAssistantMock expect] andReturnValue:@NO] updateLocation:newLocation];  
318 - [[assemblyAssistantMock reject] updateImmediUploadDic];  
319 -  
320 - [analytics startWithAppId:@"appId"];  
321 - [(FakeLocationManager *)analytics.locationManager updateLocation:newLocation oldLocation:nil];  
322 -  
323 - OCMVerifyAll(assemblyAssistantMock);  
324 -  
325 - NSLog(@"%@ end", self.name);  
326 -}  
327 @end 279 @end