亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS應用進入后臺后計時器和位置更新停止問題的解決辦法

2020-07-26 02:54:34
字體:
來源:轉載
供稿:網友

由于iOS系統為“偽后臺”運行模式,當按下HOME鍵時,如程序不做任何操作,應用會有5秒的執行緩沖時間,隨機程序被掛起,所有任務終端,包括計時器和位置更新等操作,但程序打開后臺模式開關后,部分任務可以再后臺執行,如音頻,定位,藍牙,下載,VOIP,即便如此,程序的后臺運行最多可以延長594秒(大概是10分鐘)。不幸的是,程序在聲明后臺模式后很有可能在app上架時被拒?;诖耍已芯砍隽瞬挥蒙昝骱笈_模式就能讓計時器和定位在app進入前臺時繼續運行的方法。

  實現原理如下:

  利用iOS的通知機制,在程序進入后臺和再次回到前臺時發送通知,并記錄進入后臺的當前時間和再次回到前臺的當前時間,算出兩者的時間間隔,在程序任何需要的地方添加通知監聽者,在監聽方法中執行代碼塊,代碼塊內參數為通知對象和計算出的時間間隔。以計時器為例,程序再進入后臺后,計時器停止運行,此時運用上述方法,在程序再次回到前臺時執行代碼塊中內容,將程序進入后臺時計時器的當前時間間隔加上代碼塊的時間間隔參數就能使計時器準確無誤地計時。廢話不多說,上代碼:

在AppDelegate.m實現文件中:

- (void)applicationDidEnterBackground:(UIApplication *)application {  // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.  // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.  [[NSNotificationCenter defaultCenter]postNotificationName:UIApplicationDidEnterBackgroundNotification object:nil];}- (void)applicationWillEnterForeground:(UIApplication *)application {  // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.  [[NSNotificationCenter defaultCenter]postNotificationName:UIApplicationWillEnterForegroundNotification object:nil];}

代碼說明:程序進入后臺后,利用系統通知機制通知程序進入后臺和再次回到前臺,監聽對象為所有對象。

之后定義一個處理程序進入后臺的類YTHandlerEnterBackground

//// YTHandlerEnterBackground.h// 分時租賃//// Created by 柯其譜 on 17/2/24.// Copyright © 2017年 柯其譜. All rights reserved.//#import <Foundation/Foundation.h>#import <UIKit/UIKit.h>/** 進入后臺block typedef */typedef void(^YTHandlerEnterBackgroundBlock)(NSNotification * _Nonnull note, NSTimeInterval stayBackgroundTime);/** 處理進入后臺并計算留在后臺時間間隔類 */@interface YTHandlerEnterBackground : NSObject/** 添加觀察者并處理后臺 */+ (void)addObserverUsingBlock:(nullable YTHandlerEnterBackgroundBlock)block;/** 移除后臺觀察者 */+ (void)removeNotificationObserver:(nullable id)observer;@end

在YTHandlerEnterBackground.m實現文件中:

//// YTHandlerEnterBackground.m// 分時租賃//// Created by 柯其譜 on 17/2/24.// Copyright © 2017年 柯其譜. All rights reserved.//#import "YTHandlerEnterBackground.h"@implementation YTHandlerEnterBackground+ (void)addObserverUsingBlock:(YTHandlerEnterBackgroundBlock)block {  __block CFAbsoluteTime enterBackgroundTime;  [[NSNotificationCenter defaultCenter]addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {    if (![note.object isKindOfClass:[UIApplication class]]) {      enterBackgroundTime = CFAbsoluteTimeGetCurrent();    }  }];  __block CFAbsoluteTime enterForegroundTime;  [[NSNotificationCenter defaultCenter]addObserverForName:UIApplicationWillEnterForegroundNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {    if (![note.object isKindOfClass:[UIApplication class]]) {      enterForegroundTime = CFAbsoluteTimeGetCurrent();      CFAbsoluteTime timeInterval = enterForegroundTime-enterBackgroundTime;      block? block(note, timeInterval): nil;    }  }];}+ (void)removeNotificationObserver:(id)observer {  if (!observer) {    return;  }  [[NSNotificationCenter defaultCenter]removeObserver:observer name:UIApplicationDidEnterBackgroundNotification object:nil];  [[NSNotificationCenter defaultCenter]removeObserver:observer name:UIApplicationWillEnterForegroundNotification object:nil];}@end

該類實現了用來添加通知監聽者并處理后臺和移除通知監聽者的方法,需要注意的是,在addObserverUsingBlock方法中,必須有if (![note.object isKindOfClass:[UIApplication class]])的判斷,否則addObserverForName方法中的代碼塊會執行多次,此代碼執行了兩次。addObserverUsingBlock方法是在viewWillAppear方法中調用添加通知監聽者,在viewWillDisappear方法中調用移除通知監聽者。

例如,在使用了計時器NSTimer控制器中:

- (void)viewWillAppear:(BOOL)animated {  [super viewWillAppear:animated];  [YTHandlerEnterBackground addObserverUsingBlock:^(NSNotification * _Nonnull note, NSTimeInterval stayBackgroundTime) {    self.rentTimerInterval = self.rentTimerInterval-stayBackgroundTime;  }];}- (void)viewWillDisappear:(BOOL)animated {  [super viewWillDisappear:animated];  [self.timer invalidate];  [YTHandlerEnterBackground removeNotificationObserver:self];}

我定義了一個倒計時5分鐘的計時器對象timer屬性,并定義了一個計時器當前倒計時時間間隔rentTimerInterval屬性,在添加通知監聽者代碼塊中,rentTimerInterval等于進入后臺時的倒計時時間間隔減去程序停留在后臺的時間間隔,當計時器再次回到前臺時,計時器此時的時間間隔是持續的。雖然計時器并未在后臺持續運行,但是使用了此方法,同樣實現了計時器的正確即時。

同樣的,當程序存在位置更新功能時,當程序進入后臺,位置服務對象會自動停止更新,此時的作法依然是調用上述兩個處理進入后臺的方法,使得程序進入后臺后,再次開始定位:

在需要位置更新的類中:

- (void)viewWillAppear:(BOOL)animated {  [super viewWillAppear:animated];  self.locService.delegate = self;  [self.locService startUserLocationService];  //進入后臺再進入前臺重新開始定位  [YTHandlerEnterBackground addObserverUsingBlock:^(NSNotification * _Nonnull note, NSTimeInterval stayBackgroundTime) {    [self.locService startUserLocationService];  }];}- (void)viewWillDisappear:(BOOL)animated {  [super viewWillDisappear:animated];  //停止定位  self.locService.delegate = nil;  [self.locService stopUserLocationService];  //移除后臺監聽  [YTHandlerEnterBackground removeNotificationObserver:self];}

此處使用的是百度地圖SDK

利用這種方法,像是計時器和位置更新等需要在后臺運行的任務都可以實現相應的需求,只是麻煩的是,在任何需要的類中都要調用這兩種方法,你可以根據自己的需求,在程序進入后臺和再次回到前臺時添加別的參數(通知對象參數是必須的),例如保存進入后臺前的操作等等?;蚴嵌x不同的添加通知監聽者的方法以實現不同的需求。

以上所述是小編給大家介紹的iOS應用進入后臺后計時器和位置更新停止問題的解決辦法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97视频国产在线| 亚洲第一av网站| 欧美激情一级精品国产| 日日狠狠久久偷偷四色综合免费| 国产日韩在线视频| 国产免费成人av| 久久久久久久电影一区| 欧美国产精品日韩| 亚洲图片制服诱惑| 国产精品一区二区电影| 国产网站欧美日韩免费精品在线观看| 亚洲天堂免费在线| 日韩中文字幕网站| 成人精品视频99在线观看免费| 91国偷自产一区二区三区的观看方式| 国产丝袜精品第一页| 在线观看欧美日韩国产| 成人欧美在线观看| 成人免费网站在线看| 日韩高清电影免费观看完整| 亚洲曰本av电影| 欧美黑人国产人伦爽爽爽| 亚洲无线码在线一区观看| 欧美精品久久一区二区| 成人激情视频在线观看| 成人h视频在线观看播放| 日韩欧美国产黄色| 国产精品手机播放| 亚洲福利视频网站| 精品久久久久久久中文字幕| 日韩精品视频免费专区在线播放| 国内成人精品一区| 亚洲成年网站在线观看| 97在线视频国产| 久久人人97超碰精品888| 国产在线一区二区三区| 久久男人av资源网站| 亚洲少妇中文在线| 亚洲第一页在线| 亚洲精品中文字幕有码专区| 91精品国产九九九久久久亚洲| 45www国产精品网站| 精品国产一区二区三区久久狼黑人| 在线a欧美视频| 精品欧美aⅴ在线网站| 国产成人精品久久二区二区| 欧美日韩一区二区三区| 国产精品流白浆视频| 精品国产成人在线| 欧美高清在线视频观看不卡| 亚洲一区二区免费| 日韩在线不卡视频| 在线视频一区二区| 亚洲欧美成人在线| 4k岛国日韩精品**专区| 日韩中文字幕在线精品| 日韩精品免费在线视频观看| 欧美成人剧情片在线观看| 国产精品久久久久国产a级| 91精品国产高清自在线看超| 亚洲黄色片网站| 美女999久久久精品视频| 日韩av网站导航| 久久天堂电影网| 久久久国产一区| 日韩av在线免费| 日韩欧美一区二区三区久久| 丁香五六月婷婷久久激情| 亚洲精品免费一区二区三区| 久久在精品线影院精品国产| 国产九九精品视频| 在线播放日韩精品| 中文字幕亚洲欧美在线| 国产精品久久久久久久久| 国内精品400部情侣激情| 欧美亚洲视频在线看网址| 91九色蝌蚪国产| 色婷婷av一区二区三区久久| 亚洲美女动态图120秒| 亚洲成**性毛茸茸| 国产精品福利在线观看网址| 日韩视频永久免费观看| 国产精品一区二区久久久| 日韩精品在线视频美女| 国产精品都在这里| 精品亚洲精品福利线在观看| 国产91精品视频在线观看| 国产久一一精品| 欧美又大粗又爽又黄大片视频| 亚洲精品一二区| 97热在线精品视频在线观看| 亚洲激情视频网| 亚洲第一二三四五区| 91精品久久久久久久久久久| 欧美日韩在线视频一区| 97视频在线免费观看| 精品久久久久久电影| 国产一级揄自揄精品视频| 这里只有视频精品| 中文字幕亚洲综合久久筱田步美| 欧美高清在线视频观看不卡| 国产成人精品网站| 久久最新资源网| 国产成人精品在线播放| 亚洲国产女人aaa毛片在线| 亚洲人成毛片在线播放| 欧美贵妇videos办公室| 中文亚洲视频在线| 亚洲欧美日韩区| 欧美做爰性生交视频| 欧美剧在线观看| 欧美日韩第一页| 久久久免费精品视频| 97欧美精品一区二区三区| 日韩欧美在线中文字幕| 欧美极品第一页| www.久久撸.com| 国产视频精品xxxx| 精品视频在线观看日韩| 96pao国产成视频永久免费| 亚洲欧美日韩另类| 亚洲香蕉伊综合在人在线视看| 久久在精品线影院精品国产| 96精品久久久久中文字幕| 欧美黑人巨大xxx极品| 亚洲精品aⅴ中文字幕乱码| 国产一区二区三区三区在线观看| 成人字幕网zmw| 亚洲精品综合精品自拍| 欧美电影免费在线观看| 青草热久免费精品视频| 国产在线观看不卡| 亚洲欧洲日产国产网站| 亚洲aa在线观看| 国产精品网站入口| 欧美小视频在线| 亚洲一区二区三区成人在线视频精品| 精品国产乱码久久久久酒店| 欧美自拍视频在线| 8050国产精品久久久久久| 亚洲久久久久久久久久| 久久久免费观看视频| 免费97视频在线精品国自产拍| 国产欧美一区二区三区久久| 综合久久五月天| 久久久国产成人精品| 日韩中文字幕av| 精品欧美国产一区二区三区| 色噜噜狠狠狠综合曰曰曰| 欧美激情国产精品| 午夜欧美大片免费观看| 国产视频在线一区二区| 久久久精品一区二区三区| 成人免费观看a| 国产97在线视频| 日韩av手机在线观看| 亚洲美女自拍视频| 日韩在线观看成人| 在线观看精品国产视频| 亚洲free性xxxx护士白浆| 久久久精品日本| 在线播放国产一区中文字幕剧情欧美| 国内精品久久久久| 久久视频精品在线|