項目中碰到一個需求,就是在退出控制器后進行埋點操作塞赂,正常情況我們在controller的delloc中執(zhí)行埋點的網(wǎng)絡(luò)請求就OK了,但是還有一種情況昼蛀,如果用戶殺死程序宴猾,是不會走delloc方法的。這時候需要監(jiān)聽殺死程序的通知叼旋,這里貼下最終代碼仇哆,想看思路的請往后看。
- (void)viewDidLoad {
[super viewDidLoad];
//監(jiān)聽通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:@"UIApplicationWillTerminateNotification" object:nil];
}
//程序被殺死
- (void)applicationWillTerminate:(UIApplication *)application {
//進行埋點操作
[self uploadData];
[NSThread sleepForTimeInterval:5];
NSLog(@"程序被殺死");
}
- 一開始想著直接在監(jiān)聽到殺死App后直接埋點夫植,所以在控制器中加入了如下代碼:
- (void)viewDidLoad {
[super viewDidLoad];
//監(jiān)聽通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:@"UIApplicationWillTerminateNotification" object:nil];
}
//程序被殺死
- (void)applicationWillTerminate:(UIApplication *)application {
//進行埋點操作
[self uploadData];
NSLog(@"程序被殺死");
}
- 本以為這樣就大功告成了讹剔,誰知道埋點沒生效,打斷點發(fā)現(xiàn)殺死程序后網(wǎng)絡(luò)請求并沒有走完详民。了解到系統(tǒng)執(zhí)行完回調(diào)applicationWillTerminate:后延欠,在那一次主線程 runloop 結(jié)束, 系統(tǒng)就會殺死應(yīng)用進程沈跨, 所以后續(xù)的網(wǎng)絡(luò)請求由捎,磁盤操作,異步代碼 等等就都沒執(zhí)行了饿凛。在網(wǎng)上查找資料主要有兩種方法:1.說要把這里的網(wǎng)絡(luò)請求改成在主線程狞玛。2.另外一種方法是阻塞主線程,這里貼下該作者的代碼地址http://www.reibang.com/p/5142ebe74c6d涧窒。
- 看了這兩種方法心肪,覺得第一種方法網(wǎng)絡(luò)請求改主線程太過麻煩,因為我這里的埋點有好幾個纠吴,所以選擇第二種方法蒙畴,但覺得作者的做法也太麻煩了,按照思路,無非就是阻塞主線程膳凝,讓埋點的網(wǎng)絡(luò)請求走完才讓主線程結(jié)束碑隆,這時候我突然靈機一動:我們啟動APP進入歡迎界面一般就需要沉睡幾秒才進入主界面:
[NSThread sleepForTimeInterval:3];
是否可以利用這個方法實現(xiàn)我們的需求?于是我在監(jiān)聽到App被殺死蹬音,進行埋點操作后加入上面的代碼上煤。
- (void)viewDidLoad {
[super viewDidLoad];
//監(jiān)聽通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:@"UIApplicationWillTerminateNotification" object:nil];
}
//程序被殺死
- (void)applicationWillTerminate:(UIApplication *)application {
//進行埋點操作
[self uploadData];
[NSThread sleepForTimeInterval:5];
NSLog(@"程序被殺死");
}
發(fā)現(xiàn)此方法確實可行,而且簡單著淆,但有個缺點就是如果網(wǎng)絡(luò)請求慢的話劫狠,有可能埋點會失敗。大家可以嘗試用NSTimer阻塞永部,然后埋點網(wǎng)絡(luò)請求完后invalidate独泞。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者