[轉(zhuǎn)載]iOS 后臺(tái)任務(wù)設(shè)計(jì)指導(dǎo)

原文地址:http://dxjia.cn/2016/05/26/ios-background-executions/?utm_source=tuicool&utm_medium=referral

上一篇 文章里介紹了 iOS APP 的狀態(tài)切換,其中一個(gè)狀態(tài)是 Background逾一, 也就是后臺(tái)首妖,在這個(gè)狀態(tài)伤塌,程序只被允許執(zhí)行非常有限的一點(diǎn)點(diǎn)時(shí)間,然后就會(huì)隨時(shí)被掛起画舌,不再執(zhí)行任何代碼辕近,但顯然是有應(yīng)用場景需要不斷地在后臺(tái)執(zhí)行一些任務(wù),比如 音樂播放 APP主慰, 健康記步軟件等。本文就來介紹 iOS 所提供的實(shí)現(xiàn)這些場景的技術(shù)鲫售。

后臺(tái)任務(wù)分類

首先 Apple 官方為我們界定了 **3
** 類后臺(tái)執(zhí)行任務(wù)的場景:

  • Background Tasks:APP 在前臺(tái)時(shí)啟動(dòng)某項(xiàng)任務(wù)共螺,然后在未結(jié)束之前突然 切換到了后臺(tái),那么 APP 可以在切換回調(diào)里使用某些 API 來繼續(xù)向系統(tǒng)請求一些時(shí)間來繼續(xù)完成這個(gè)任務(wù)情竹;完成之后通知系統(tǒng)藐不,之后系統(tǒng)會(huì)將 APP 掛起;
  • Downloading:在后臺(tái)啟動(dòng)從網(wǎng)絡(luò)下載文件的任務(wù) – 對(duì)于文件下載秦效,iOS 有專門的機(jī)制雏蛮;
  • Specific Backgournd Tasks:應(yīng)用需要在后臺(tái)一直執(zhí)行代碼;

這三種類型的后臺(tái)任務(wù)阱州,在實(shí)現(xiàn)時(shí)各有不同挑秉,下面來一一介紹。

Background Tasks

Apple 文檔建議苔货,如果要啟動(dòng)一個(gè)后臺(tái)任務(wù)(異步任務(wù))犀概,可以使用 API beginBackgroundTaskWithExpirationHandler來指定,即使啟動(dòng)任務(wù)的時(shí)候夜惭,程序是處在前臺(tái)的姻灶,也沒有關(guān)系,當(dāng)位于前臺(tái)時(shí)诈茧,該方法請求得到的時(shí)間是DBL_MAX
产喉,也就是 double 數(shù)據(jù)類型最大值,你可以認(rèn)為是無限大,當(dāng)任務(wù)執(zhí)行過程中 APP 被切換到后臺(tái)時(shí)曾沈,任務(wù)還沒有完成尘颓,這個(gè)時(shí)間又會(huì)自動(dòng)調(diào)整為一個(gè)時(shí)間片段(具體多少我沒找到文檔說明,都是說可以通過backgroundTimeRemaining屬性得到)晦譬。需要注意的是, 這個(gè)方法是成對(duì)使用的互广,對(duì)于一個(gè)固定 task 敛腌,每次調(diào)用 beginBackgroundTaskWithExpirationHandler,都會(huì)產(chǎn)生一個(gè) token 值(UIBackgroundTaskIdentifier實(shí)際是個(gè)整型)惫皱,必須在任務(wù)執(zhí)行結(jié)束時(shí)像樊,調(diào)用 endBackgroundTask并傳遞這個(gè) token,來結(jié)束后臺(tái)任務(wù)旅敷。另外生棍,作為最佳實(shí)踐,都應(yīng)該傳遞一個(gè) 超時(shí) handler媳谁,以防申請到的時(shí)間片段內(nèi)涂滴,還是沒能完成任務(wù)的話,做最后的清理和標(biāo)注工作晴音!如果不傳的話柔纵,那么結(jié)果就是 iOS 直接 kill 掉你的APP,閃退咯锤躁,因?yàn)樗X得我們騙了它嘛搁料,哈哈。系羞。郭计。下面是一段在進(jìn)入后臺(tái)時(shí)啟動(dòng)異步任務(wù)的例子;

// 在某處定義一個(gè) token 變量
UIBackgroundTaskIdentifier _bgTaskToken;

// 進(jìn)入后臺(tái) 委派方法回調(diào) 
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    _bgTaskToken = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
        // 時(shí)間到了椒振,任務(wù)還沒完成昭伸,只能清理
        ...
        // 取消后臺(tái)任務(wù)
        [application endBackgroundTask:_bgTaskToken];
        _bgTaskToken = UIBackgroundTaskInvalid;
    }];
 
    // 異步啟動(dòng)任務(wù),這樣不會(huì)阻塞 本委派方法回調(diào)
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 巴拉巴拉杠人,做自己的任務(wù)
        ...
        
        // 任務(wù)在時(shí)間限制內(nèi)結(jié)束啦勋乾,取消后臺(tái)任務(wù) 
        [application endBackgroundTask:_bgTaskToken];
        _bgTaskToken = UIBackgroundTaskInvalid;
    });
}

Background Downloading

這類后臺(tái)任務(wù),必須使用 iOS 指定的機(jī)制才可以嗡善,那就是 NSURLSession辑莫。使用 NSURLSession 建立的下載任務(wù),會(huì)被系統(tǒng)直接在另外一個(gè)獨(dú)立的系統(tǒng)進(jìn)程里進(jìn)行管理罩引,不會(huì)因 APP 進(jìn)入后臺(tái)或掛起等而受到影響各吨,iOS 會(huì)統(tǒng)一管理所有的下載任務(wù)。并且,即使你的 APP 已經(jīng)掛掉啦揭蜒,下載任務(wù)還是會(huì)繼續(xù)横浑,等到下載完成啦,系統(tǒng)會(huì)喚起你的 APP 進(jìn)程屉更,并通知你徙融,但如果是用戶主動(dòng)殺掉的你的進(jìn)程,那么系統(tǒng)會(huì)自動(dòng)取消下載任務(wù)瑰谜。具體使用方法:

  • 1, 使用 NSURLSessionConfiguration類的 backgroundSessionConfigurationWithIdentifier方法創(chuàng)建一個(gè) NSURLSessionConfiguration 對(duì)象欺冀,參數(shù)為一個(gè)字串,作為一個(gè) token 萨脑,完成時(shí)會(huì)用到隐轩,不能為空或 nil;
  • 2, 設(shè)置上一步創(chuàng)建出的對(duì)象的 sessionSendsLaunchEvents屬性為 YES渤早;
  • 3, 如果開啟下載任務(wù)時(shí)职车,是位于前臺(tái)的,將 discretionary屬性也設(shè)置為 YES鹊杖;
  • 4, 設(shè)置你需要的其他屬性值悴灵;
  • 5,使用配置好的 NSURLSessionConfiguration對(duì)象骂蓖,作為參數(shù)称勋,創(chuàng)建 NSURLSession實(shí)例對(duì)象;
  • 6涯竟,使用 NSURLSession開始下載task赡鲜,這個(gè)這里不細(xì)講啦,需要看 《URL Session Programming Guide》;

如果在下載完成之前庐船,你的APP已經(jīng)掛起或者死掉啦银酬,那么當(dāng)系統(tǒng)完成下載之后,系統(tǒng)會(huì)喚醒你的 APP筐钟,并回調(diào) 你的 app 委托方法 application:handleEventsForBackgroundURLSession:completionHandler:揩瞪,在這其中,參數(shù)會(huì)傳進(jìn)來一個(gè) token篓冲,這個(gè)就是你第一步里 傳入的 字符串李破,使用這個(gè) 字符串,再重新創(chuàng)建一個(gè) NSURLSessionConfiguration壹将,并進(jìn)行與開始任務(wù)之前一樣的配置嗤攻,那么就可以使用這些對(duì)象來獲取已經(jīng)完成的任務(wù)的詳細(xì)情況了。

Background Long-Running Tasks

在 iOS 里只有特定的一些應(yīng)用類型才會(huì)被允許可以在后臺(tái)一直運(yùn)行诽俯,APP 必須顯式的聲明一些特定權(quán)限妇菱,才可以在后臺(tái)進(jìn)行長時(shí)間運(yùn)行而不被掛起。一些應(yīng)用類型有 6 種:

  • 需要在后臺(tái)播放音頻 – 如 Music Player;
  • 需要在后臺(tái)錄音闯团;
  • 在后臺(tái)時(shí)也需要不斷通知用戶位置變動(dòng)的辛臊,比如導(dǎo)航;
  • 支持 VoIP 電話的 – 如 skype 網(wǎng)絡(luò)電話房交;
  • 需要在后臺(tái)有規(guī)律的下載和處理網(wǎng)絡(luò)內(nèi)容的彻舰;
  • 在后臺(tái)有規(guī)律的從其他外設(shè)(第三方配件)獲取并更新數(shù)據(jù)的;

要實(shí)現(xiàn)這些類型服務(wù)的 APP候味,需要進(jìn)行專門的聲明淹遵,這樣系統(tǒng)才會(huì)采取相應(yīng)的操作。
先來看看怎么聲明负溪。

聲明后臺(tái)服務(wù)類型

通過 XCode 的 project setting 里就可以配置類型,選擇之后會(huì)自動(dòng) 在你 工程的 Info.plist 文件里 增加 UIBackgroundModes鍵值對(duì)济炎;一個(gè) APP 可以同時(shí)聲明多種支持的后臺(tái)長期任務(wù)類型川抡,在 XCode 里勾選上即可;下表給出了所有 在 XCode 可選的 類型 及 具體含義须尚;

Xcode background mode UIBackgroundModes 值 描述
Audio and AirPlay audio 應(yīng)用可以在后臺(tái)播放或錄制音頻崖堤,包括 Apple 自家的 AirPlay 流媒體音視頻;對(duì)于錄制耐床,需要在APP 第一次運(yùn)行時(shí)密幔,用戶授予權(quán)限才可進(jìn)行。
Location updates location APP 不斷更新 GPS 位置信息撩轰,并通知給用戶胯甩,即使 APP 處于后臺(tái)
Voice over IP voip APP 提供通過網(wǎng)絡(luò)連接來打電話的功能
Newsstand downloads newsstand-content 雜志應(yīng)用,可以在后臺(tái)下載雜志并處理
External accessory communication external-accessory 一些外設(shè)控制 APP堪嫂, 比如一些控制 第三方 MFI 配件的應(yīng)用偎箫,聲明這種 類型,可以讓APP 在后臺(tái)不斷的與 外設(shè)進(jìn)行溝通
Uses Bluetooth LE accessories bluetooth-central iPhone 作為藍(lán)牙中心設(shè)備使用皆串,也就是做為 server淹办;需要在后臺(tái)不斷更新藍(lán)牙狀態(tài)的
Acts as a Bluetooth LE accessory bluetooth-peripheral iPhone 作為藍(lán)牙外圍設(shè)備使用,也就是做 client恶复,需要在后臺(tái)不斷的訪問其他藍(lán)牙設(shè)備獲取數(shù)據(jù)的
Background fetch fetch APP 需要在后臺(tái)不斷地 頻繁有規(guī)律的從網(wǎng)絡(luò)獲取數(shù)據(jù)
Remote notifications remote-notification APP 先在后臺(tái)關(guān)注某個(gè) push 推送怜森,但這個(gè) push 推送到達(dá)的時(shí)候,及時(shí)在后臺(tái)開始對(duì)應(yīng)的下載任務(wù)谤牡,以盡可能減少用戶直接點(diǎn)開 通知 后 查看內(nèi)容的等待時(shí)間

Playing and Recording Background Audio

一些典型的應(yīng)用例子:

  • 音樂播放軟件
  • 錄音APP
  • 支持 AirPlay 音視頻播放的APP
  • 網(wǎng)絡(luò)通話軟件

當(dāng)你在 Info.plist 里聲明了 UIBackgroundModes為 audio的時(shí)候副硅,在后臺(tái)進(jìn)行 audio 的相關(guān)操作時(shí),系統(tǒng) audio API 會(huì)自動(dòng)阻止系統(tǒng)將你的 APP 進(jìn)程掛起翅萤,所以不需要 APP 自己再進(jìn)行其他額外的處理想许,只需要處理自己的軟件邏輯即可。
【Note】:手機(jī)上是有可能會(huì)有多個(gè) APP 同時(shí)擁有后臺(tái) audio 操作權(quán)限的,這時(shí)候系統(tǒng)會(huì)根據(jù) 每個(gè) APP 開始操作音頻時(shí)的 audio session 配置來決定如何進(jìn)行操作流纹,而且你應(yīng)該非常小心的處理一些中斷事件糜烹,如來電,其他系統(tǒng)提示音等漱凝,這些都有相關(guān)的 API 和機(jī)制疮蹦,可以參考 《Audio Session Programming Guide》

Tracking the User’s Location

有三種方式來實(shí)現(xiàn) 位置的訪問:

  • The significant-change location service(這也是官方推薦的方式)
  • Foreground-only location services
  • Background location services

前兩種都不需要在 Info.plist 里聲明 UIBackgroundModes,只有最后一種需要茸炒。
The significant-change location service愕乎,字面理解,就是只有位置有變化時(shí)才會(huì)發(fā)出通知壁公,有人說這個(gè)時(shí)機(jī)是依據(jù)基站感论,切換了基站時(shí),就會(huì)發(fā)出一次通知紊册,所以頻率會(huì)受基站的密度影響比肄,所以市區(qū)更新頻率會(huì)比郊區(qū)高。但好處是這個(gè)服務(wù)不管你的 APP 是在前臺(tái)還是后臺(tái)囊陡,不管是否已經(jīng)被掛起芳绩,或已經(jīng)死掉了,他都會(huì)喚醒你的進(jìn)程進(jìn)行相應(yīng)處理撞反,所以應(yīng)該是最省電的妥色。
后兩種都是標(biāo)準(zhǔn)的定位服務(wù),只不過一個(gè)只能工作在前臺(tái)遏片,而一個(gè)可以在后臺(tái)工作嘹害;【Note】:官方對(duì)于使用后臺(tái)定位服務(wù)的 APP 審核是非常嚴(yán)格的,所以使用時(shí)一定要小心吮便,并提供足夠的說明和解釋吼拥。
至于如何實(shí)現(xiàn)一個(gè)定位 APP ,請看 《Location and Maps Programming Guide 》

Implementing a VoIP App

iOS8之前:
網(wǎng)絡(luò)通話軟件线衫,skype 就是其中一個(gè)凿可。這樣的軟件使用 internet 連接來進(jìn)行語音通話,為了提供健全的電話功能授账,這類軟件必須一直保持一個(gè)長期的網(wǎng)絡(luò)連接枯跑,以便監(jiān)聽到來電。實(shí)現(xiàn)類似的功能白热,APP 自己并非一直在后臺(tái)不被掛起敛助,而是交由系統(tǒng)監(jiān)聽 網(wǎng)絡(luò)連接,有數(shù)據(jù)進(jìn)來時(shí)屋确,系統(tǒng)會(huì)喚醒 APP纳击,并將 socket 轉(zhuǎn)交給 APP 進(jìn)行處理续扔;大致步驟:
在 Info.plist 里進(jìn)行UIBackgroundModes配置;

  • 配置一個(gè) socket 連接用于 VoIP焕数;
  • 在進(jìn)入后臺(tái)時(shí)纱昧,調(diào)用 setKeepAliveTimeout:handler:
  • 方法傳遞一個(gè)回調(diào),用來處理事件堡赔;
  • 配置要使用到的 audio session识脆;

【Note】:貌似對(duì)于 VoIP 的實(shí)現(xiàn), iOS 8 有變化善已,改為使用 remote notification 的方式來做啦灼捂,誰說 iOS 沒有碎片化的啊,有换团!具體實(shí)現(xiàn)請參考 Tips for Developing a VoIP App 簡單說就是服務(wù)器發(fā)個(gè)特殊的通知,系統(tǒng)喚醒a(bǔ)pp來處理,連socket都不用保留了.

Downloading Newsstand Content in the Background

雜志應(yīng)用悉稠,居然還有專門的處理。但我看介紹艘包,跟前面講解的 后臺(tái)下載文件沒啥區(qū)別暗拿汀!辑甜!另外好像也是用 通知推送 觸發(fā)啊。About Newsstand Kit Framework

Communicating with an External Accessory

外設(shè)設(shè)備有很多袍冷,比如一些心率監(jiān)控器磷醋,會(huì)在必要的時(shí)候向手機(jī)推送數(shù)據(jù)。聲明了UIBackgroundModes為 external-accessory 后胡诗,系統(tǒng)就不會(huì)主動(dòng)關(guān)閉 APP 與 外設(shè)之間的連接邓线,而是替 APP 監(jiān)視這個(gè)連接,但有數(shù)據(jù)過來時(shí)煌恢,會(huì)喚醒 APP 進(jìn)行處理骇陈,每次喚醒 APP 只有 10 S鐘時(shí)間進(jìn)行數(shù)據(jù)處理,所以應(yīng)當(dāng)越快越好瑰抵,萬不得已你雌,如果10S不夠,需要使用 beginBackgroundTaskWithExpirationHandler:方法再申請一段時(shí)間進(jìn)行處理二汛;
【Note】:Apple 要求此類應(yīng)用 需要提供一個(gè) 開啟 和 關(guān)閉 連接的界面供用戶使用婿崭;

Communicating with a Bluetooth Accessory

類似上一節(jié)的 配件,如果心率監(jiān)控器跟 手機(jī)之間使用的連接方式是藍(lán)牙肴颊,那么就一模一樣啦氓栈,連 喚醒的時(shí)間限制都一樣,都是 10 S
P鲎拧J谑荨醋界!略啦。提完。形纺。

Fetching Small Amounts of Content Opportunistically

有人依靠這種手段來實(shí)現(xiàn)后臺(tái)永存,但現(xiàn)在不好使啦氯葬,除非你是真的每次都在下載東西挡篓,而且每次時(shí)間都很短。用戶的流量啊帚称。因?yàn)槁暶髁诉@個(gè) mode 之后官研,并不保證 系統(tǒng)一定會(huì)給你分配時(shí)間來執(zhí)行后臺(tái)任務(wù),因?yàn)樗约河幸惶走壿嫶扯茫绻憬?jīng)常性喚醒戏羽,但卻每次都耗時(shí)很久,又沒有做從網(wǎng)絡(luò)下載東西的操作楼吃,那么以后你被分配給喚醒的幾率就會(huì)越來越小始花。另外還有審核!:⑽?嵯!
正常情況下躬窜,聲明了這個(gè)類型之后浇垦,系統(tǒng)在你的 APP 進(jìn)入后臺(tái)后,會(huì)間隔性的給機(jī)會(huì)將你的 APP 喚醒荣挨,并回調(diào)你的 委托方法 application:performFetchWithCompletionHandler:男韧,你需要在這個(gè)回調(diào)里檢查是否有新內(nèi)容可用,如果有默垄,就開啟后臺(tái)下載此虑,推薦使用 NSURLSession來建立,下載完成后口锭,你必須調(diào)用這個(gè)方法出入 的 completionHandler并傳入一個(gè) 整型值 來表示 你的處理是否正常朦前,UI是否已經(jīng)更新,讓系統(tǒng)來決定更新 snapshot等鹃操;

Using Push Notifications to Initiate a Download

這個(gè)方式况既,是你的應(yīng)用中包含通知功能時(shí),你在服務(wù)端推送的通知內(nèi)容里加入 鍵值對(duì) content-available= 1组民,那么 手機(jī)收到這個(gè)通知后棒仍,會(huì)自動(dòng)啟動(dòng) APP 到后臺(tái),或 喚醒(依舊保持后臺(tái)執(zhí)行)臭胜,并回調(diào) 委托方法 application:didReceiveRemoteNotification:fetchCompletionHandler:莫其,在這個(gè)方法里進(jìn)行內(nèi)容下載癞尚。
【Note】:需要服務(wù)端推送配合

哪些情況系統(tǒng)會(huì)喚醒掛起進(jìn)程

當(dāng)一些特定事件發(fā)生時(shí),系統(tǒng)會(huì)喚醒已經(jīng)被掛起的進(jìn)程乱陡,轉(zhuǎn)換到后臺(tái)運(yùn)行狀態(tài)浇揩,這些事件針對(duì)不同類型的APP 有所不同:

location apps

  • 系統(tǒng)產(chǎn)生了符合 APP 配置的定位要求的位置更新;
  • 設(shè)備進(jìn)入或離開了一個(gè)網(wǎng)絡(luò)注冊的區(qū)域憨颠,你可以理解為基站胳徽;

audio apps

  • audio framework 需要 app 處理數(shù)據(jù)的時(shí)候–任何 播放、錄制爽彤;

Bluetooth apps

  • 當(dāng)手機(jī)扮演中心設(shè)備時(shí)养盗,收到了其他藍(lán)牙設(shè)備發(fā)來的數(shù)據(jù);
  • 當(dāng)手機(jī)扮演外圍設(shè)備時(shí)适篙,收到了藍(lán)牙服務(wù)端發(fā)來的數(shù)據(jù)往核;

background download apps

  • 本應(yīng)用的一個(gè)包含 content-available= 1的推送通知到達(dá)了手機(jī);
    background fetch 類型嚷节,系統(tǒng)給予了 APP 喚醒的機(jī)會(huì)聂儒;
  • 使用 NSURLSession進(jìn)行后臺(tái)下載的APP,在下載過程完成或出現(xiàn)問題時(shí)硫痰,系統(tǒng)會(huì)主動(dòng)喚醒對(duì)應(yīng) APP衩婚;
  • 雜志應(yīng)用,下載完成時(shí)喚醒 APP效斑;

【Note】:絕大多數(shù)情況下非春,系統(tǒng)不會(huì)重啟被用戶手動(dòng)強(qiáng)制關(guān)閉的 APP,但在 iOS 8 之后鳍悠, location apps 是個(gè)例外税娜。其他的所有被用戶手動(dòng)強(qiáng)制關(guān)閉的APP 都不會(huì)被系統(tǒng)主動(dòng)喚起坐搔,直到 用戶再次 主動(dòng)啟動(dòng)這個(gè) APP藏研,或者手機(jī)重啟并在用戶輸入了解鎖密碼之后才會(huì)恢復(fù)機(jī)制。

做一個(gè)盡責(zé)的后臺(tái)APP

  • Apple 教育我們概行,如果你要實(shí)現(xiàn)一個(gè)后臺(tái) APP蠢挡,應(yīng)該做一個(gè)有責(zé)任的APP,不要亂搞凳忙,哈哈业踏。
  • 不要在后臺(tái)調(diào)用任何 OpenGL ES 接口,在進(jìn)入后臺(tái)之前也要保證這些調(diào)用都已結(jié)束涧卵,否則你的 APP 將直接被 kill勤家;
  • 取消所有 Bonjour相關(guān)的操作,還不清楚這個(gè)是啥東西柳恐,不過 Apple 說即使你不取消伐脖,它在把你掛起之前也會(huì)都給你取消热幔;
  • 如果有網(wǎng)絡(luò)操作,做好容錯(cuò)處理讼庇;
  • 保存 APP 狀態(tài)绎巨,進(jìn)入后臺(tái)前持久化一些數(shù)據(jù),以便恢復(fù)蠕啄;
  • 盡可能多的釋放內(nèi)存场勤,尤其是強(qiáng)引用;
  • 停止使用共享的系統(tǒng)資源歼跟,比如 電話本和媳,日歷等,進(jìn)入后臺(tái)前嘹承,release他們窗价;
  • 不要在后臺(tái)進(jìn)行 UI 的更新操作;
  • 做好對(duì)外設(shè)配件的 連接 和斷開 事件的響應(yīng)叹卷;這個(gè)是 外設(shè)編程的機(jī)制啦撼港,需要 參考 External Accessory Programming Topics
  • 關(guān)閉彈出窗口和彈出菜單等骤竹;
  • 移除窗口上的一些敏感信息帝牡;
  • 在后臺(tái)的執(zhí)行盡可能小的任務(wù);

最后蒙揣, Apple 建議能不后臺(tái)就不后臺(tái)靶溜,那當(dāng)然。懒震。罩息。

Reference

[1] App Programming Guide for iOS - Background Execution

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市个扰,隨后出現(xiàn)的幾起案子瓷炮,更是在濱河造成了極大的恐慌,老刑警劉巖递宅,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娘香,死亡現(xiàn)場離奇詭異,居然都是意外死亡办龄,警方通過查閱死者的電腦和手機(jī)烘绽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俐填,“玉大人安接,你說我怎么就攤上這事∮⑷冢” “怎么了盏檐?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵呀打,是天一觀的道長。 經(jīng)常有香客問我糯笙,道長贬丛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任给涕,我火速辦了婚禮豺憔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘够庙。我一直安慰自己恭应,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布耘眨。 她就那樣靜靜地躺著昼榛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剔难。 梳的紋絲不亂的頭發(fā)上胆屿,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音偶宫,去河邊找鬼非迹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纯趋,可吹牛的內(nèi)容都是我干的憎兽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吵冒,長吁一口氣:“原來是場噩夢啊……” “哼纯命!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痹栖,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤亿汞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后结耀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體留夜,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匙铡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年图甜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳖眼。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黑毅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钦讳,到底是詐尸還是另有隱情矿瘦,我是刑警寧澤枕面,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站缚去,受9級(jí)特大地震影響潮秘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜易结,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一枕荞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搞动,春花似錦躏精、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箩溃,卻和暖如春瞭吃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涣旨。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工虱而, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人开泽。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓牡拇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親穆律。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惠呼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 文檔app在后臺(tái)時(shí)會(huì)被暫停,暫停的apps會(huì)提高電池的使用壽命峦耘,并且會(huì)讓系統(tǒng)將重要的系統(tǒng)資源投入到引起用戶注意的前...
    zziazm閱讀 4,610評(píng)論 0 5
  • 蘋果官網(wǎng)地址 Background Execution (后臺(tái)執(zhí)行)當(dāng)用于沒有-啟動(dòng)應(yīng)用剔蹋,系統(tǒng)移到后臺(tái)狀態(tài)。對(duì)于很...
    helinyu閱讀 7,726評(píng)論 0 9
  • 自從古老的iOS4以來,當(dāng)用戶點(diǎn)擊home建的時(shí)候,你可以使你的APP們在內(nèi)存中處于suspended(掛起)狀態(tài)...
    木易林1閱讀 3,135評(píng)論 1 4
  • 跟蹤用戶的位置 這里有幾種方式在后臺(tái)跟蹤用戶的位置辅髓,其中大部分都不會(huì)要求你的應(yīng)用在后臺(tái)繼續(xù)運(yùn)行泣崩。 位置重大改變(s...
    raingu24閱讀 644評(píng)論 0 0
  • 如果在你面前擺上半杯水,你認(rèn)為這杯水是半空洛口,還是半滿? 習(xí)慣負(fù)面思考的人會(huì)說:“真糟糕矫付,只有半杯水了〉谘妫”習(xí)慣正面思...
    未__央閱讀 751評(píng)論 0 0