iOS利用系統工具獲取DeviceLog不是一件很方便的事,有時候我們執行的一些狀態不一定顯示在螢幕上,但是我們需要得到這一刻的一些資料。比如我們現在的產品人員要測試統計,比如按下某個按鈕傳送統計事件,整個介面上能夠看到的也只是網路的菊花轉了一圈,不能實質的看到統計的內容,並且在後臺查詢統計也不太容易,以及後臺會有一定的延時等等原因,所以我做了一個工具,專門用於產品人員去測試一些客戶端傳送的某種型別的日誌。
該工具的主要原理很簡單,使用Socket搭了一個簡易的HTTPServer,客戶端可以使用二維碼掃描獲取伺服器資訊,然後儲存起來,以後在需要的時候,給這個給這個HTTPServer傳送HTTP請求就可以了,每次HTTPServer根據客戶端所傳的引數(內容/字型顏色/字型大小)去將客戶端所傳的內容展示在頁面上就可以了。
應用主介面如圖所示
主介面還是比較簡單的,二維碼的資訊主要是儲存當前伺服器的訪問地址,字型大小就是正文的預設字型大小,關閉則表示關閉伺服器。
我們開啟LogServer之後,就代表啟動了HTTPServer,這時候如果我們通過瀏覽器進行一次HTTP請求,我們會把請求的內容列印到我們的HTTPServer上。假設我們請求如下
http://127.0.0.1:10304/?parameter=STTestLogServer&color=ff0000
我們就可以看到我們的LogServer中列印出來了一行字,為紅色的STTestLogServer, 如圖所示:
PS. 伺服器預設埠號為10304, parameter就是我們要列印的內容,color則表示顏色,如果傳入了font=16的話,則表示字型大小為16
工具的使用很簡單,只需要客戶端傳送HTTP請求就可以了,對於客戶端,我這邊也封裝好了一些邏輯,可以直接使用。有關二維碼的掃描部分,是使用系統自帶的AVFoundation,目前只支援iOS7以上,我直接貼下載地址了,就不貼上到這裡了,當然這個二維碼只是工具,方便客戶端記住服務端的資訊,使用其他方式也可以,可以點此處下載STQRCode。同時,我也封裝了幾個方法,用於更方便的將日誌列印粗來,網路庫大家可以任意替換,目前伺服器支援GET/POST請求(暫不支援mutilpart)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
void STDLogRemoteWithDebugString(NSString *string) { STDLogRemoteWithString(string, @"000000"); } void STDLogRemoteWithNoticeString(NSString *string) { STDLogRemoteWithString(string, @"199DD6"); } void STDLogRemoteWithWarningString(NSString *string) { STDLogRemoteWithString(string, @"FF7300"); } void STDLogRemoteWithErrorString(NSString *string) { STDLogRemoteWithString(string, @"FF0000"); } void STDLogRemoteWithString(NSString *string, NSString *colorString) { if (string.length == 0) { return; } static STHTTPNetwork *_logNetwork; NSString *remoteURL = [[NSUserDefaults standardUserDefaults] valueForKey:STLogRemoteCacheKey]; if (remoteURL) { if (!_logNetwork) { _logNetwork = [[STHTTPNetwork alloc] initWithHost:remoteURL path:nil]; } } else { _logNetwork = nil; } if (colorString.length == 0) { colorString = @"000000"; } _logNetwork.timeoutInterval = 2; _logNetwork.maxConcurrentRequestCount = 1; NSDictionary *parameters = @{@"parameter":string, @"color":colorString}; [_logNetwork sendAsynchronousRequestWithMethod:nil HTTPMethod:@"POST" parameters:parameters handler:^(STNetworkOperation *operation, id response, NSError *error) { }]; } |
掃描二維碼部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
- (BOOL)canBecomeFirstResponder { return YES; } - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { if (motion == UIEventSubtypeMotionShake) { STQRCodeScanViewController *viewController = STQRCodeScanViewController.new; viewController.continueWhenScaned = YES; if (viewController) { viewController.scanCompletionHandler = ^(STQRCodeScanViewController *vc, NSString *result, NSError *error) { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSURL *requestURL = [NSURL URLWithString:result]; if (requestURL.path.length > 0 && [requestURL.path rangeOfString:@"stkit"].location != NSNotFound) { NSString *title = nil; if ([requestURL.path rangeOfString:@"close"].location != NSNotFound) { // 斷開連線 requestURL = nil; title = @"已斷開測試統計連結"; } else { title = @"已連線到測試統計伺服器"; } UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:nil delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil, nil]; [alertView show]; if (requestURL) { [userDefaults setValue:result forKey:STLogRemoteCacheKey]; } else { [userDefaults setValue:nil forKey:STLogRemoteCacheKey]; } [userDefaults synchronize]; [vc dismissAnimated:YES]; } }; [self.window.rootViewController presentViewController:viewController animated:YES completion:NULL]; } } } |
我習慣把一些測試功能加到window的搖一搖上,這樣方便。最後執行結果如下:
這個工具只是提供一種功能,程式碼寫的也比較粗糙,只為拋磚引玉。有興趣的可以私我,大家一起完善Server端。 STLogServer下載地址
PS.該Server是使用Java寫的,所以需要Java虛擬機器來支援程式的執行,大家需要自行安裝JRE。 JRE官方下載地址