swift崩潰日志收集與上傳

在做崩潰日志收集與上傳的時候用OC寫了一個demo可以正常工作(OC版本的資料網上很多,這里不贅述),于是想采用現成的demo進行OC與Swift將模塊集成到Swift項目,不過集成完畢后不管如何程序始終不會走異常監聽的回調,因此無法將崩潰信息保存到本地,后來在同事推薦的一篇文章中找到了用Swift寫的崩潰日志收集demo,文章鏈接:http://www.th7.cn/Program/IOS/201701/1086561.shtml ,看完后深受啟發,將代碼封裝了一下,在需要使用的時候直接將下面的代碼復制,在上傳方法中添加服務器地址并導入第三方庫AFNetworking即可使用:

import UIKit
import AFNetworking

class TBUncaughtExceptionHandler: NSObject {
    
    static let shared = TBUncaughtExceptionHandler()
    
    fileprivate override init() {
    }
    
    public func exceptionLogWithData() {
        setDefaultHandler()
        let path = getdataPath()
//        print(path)
        let data = NSData.init(contentsOfFile: path)
        if data != nil {
            //            let crushStr = String.init(data: data! as Data, encoding: String.Encoding.utf8)
            //            print(crushStr!)
            //上傳數據
            sendExceptionLogWithData(data: data! as Data, path: path)
            
        }
        
        //測試數據
//        let arry:NSArray = ["1"]
//        print("%@",arry[5])
        
    }
    
    ///沙盒路徑
    fileprivate func getdataPath() -> String{
        let str = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last!
        let urlPath = str.appending("/Exception.txt")
        return urlPath
    }
    
    ///異?;卣{
    fileprivate func setDefaultHandler() {
        NSSetUncaughtExceptionHandler { (exception) in
            let arr:NSArray = exception.callStackSymbols as NSArray
            let reason:String = exception.reason!
            let name:String = exception.name.rawValue
            let date:NSDate = NSDate()
            let timeFormatter = DateFormatter()
            timeFormatter.dateFormat = "YYYY/MM/dd hh:mm:ss SS"
            let strNowTime = timeFormatter.string(from: date as Date) as String
            let url:String = String.init(format: "========異常錯誤報告========\ntime:%@\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",strNowTime,name,reason,arr.componentsJoined(by: "\n"))
            let documentpath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last!
            let path = documentpath.appending("/Exception.txt")
            do{
                try
                    url.write(toFile: path, atomically: true, encoding: String.Encoding.utf8)
            }catch{}
        }
    }
    
    ///上傳
    fileprivate func sendExceptionLogWithData(data:Data,path:String){
        let manager = AFHTTPSessionManager()
        manager.requestSerializer.timeoutInterval = 5.0
        AFJSONResponseSerializer().acceptableContentTypes = NSSet(object: "text/plain") as? Set<String>
        manager.post("服務器地址", parameters: nil, constructingBodyWith: { (formData) in
            formData.appendPart(withFileData: data, name: "file", fileName: "Exception.txt", mimeType: "txt")
        }, progress: nil, success: { (task, responseObject) in
            let fileManger = FileManager.default
            do {
                try fileManger.removeItem(atPath: path)
            }catch{
                
            }
        }) { (task, error) in
            //上傳失敗
            print(error)
        }
    }
}

使用方法:在AppDelegate中

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        TBUncaughtExceptionHandler.shared.exceptionLogWithData()
        
        return true
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,255評論 4 61
  • 當下屬時,你每天想的是干好工作,同時要讓領導理解你,比如早上遲到能被領導理解,趁著領導不在時能偷個懶。當領導時,你...
    duanxiaomao閱讀 3,087評論 2 4
  • 人的一生,是一場內心感受的旅行! 花了一上午,修了又改,改了又刪,刪了又寫,終于寫了一篇文章,始終沒入自己的眼,卻...
    江西六妖閱讀 399評論 1 3
  • Linux用戶管理 from my wp blog 用戶信息 文件信息存儲用戶 /etc/passwd組 /etc...
    Amrzs閱讀 445評論 0 1
  • 當我輕擊鼠標,將最后一封工作上的郵件在下午4點59分發出后,我默默地數著下班前的最后60秒。在這短暫的空白時間里,...
    西山喬木閱讀 263評論 2 0