MetricKit框架詳細(xì)解析(十) —— 基于MetricKit的App中的電源監(jiān)控亡资,性能和診斷(一)

版本記錄

版本號(hào) 時(shí)間
V1.0 2021.05.17 星期一

前言

MetricKit由iOS13系統(tǒng)進(jìn)引入澜共,用來(lái)匯總和分析有關(guān)異常和崩潰診斷以及電源和性能指標(biāo)的每個(gè)設(shè)備的報(bào)告。下面我們就一起來(lái)看下這個(gè)框架锥腻。感興趣的可以看下面幾篇文章嗦董。
1. MetricKit框架詳細(xì)解析(一) —— 基本概覽(一)
2. MetricKit框架詳細(xì)解析(二) —— Improving Your App's Performance(一)
3. MetricKit框架詳細(xì)解析(三) —— Reducing Your App's Memory Use(一)
4. MetricKit框架詳細(xì)解析(四) —— Gathering Information About Memory Use(一)
5. MetricKit框架詳細(xì)解析(五) —— Making Changes to Reduce Memory Use(一)
6. MetricKit框架詳細(xì)解析(六) —— Preventing Memory-Use Regressions & Responding to Low-Memory Warnings(一)
7. MetricKit框架詳細(xì)解析(七) —— Reducing Your App's Launch Time(一)
8. MetricKit框架詳細(xì)解析(八) —— Reducing Disk Writes(一)
9. MetricKit框架詳細(xì)解析(九) —— Improving App Responsiveness(一)

開(kāi)始

首先看下主要內(nèi)容:

了解如何使用MetricKit在iOS應(yīng)用中監(jiān)視電源,性能和診斷瘦黑。內(nèi)容來(lái)自翻譯京革。

接著看下寫(xiě)作環(huán)境:

Swift 5, iOS 14, Xcode 12

下面就是正文了。

長(zhǎng)期以來(lái)幸斥,與Web應(yīng)用程序不同匹摇,iOS應(yīng)用程序被認(rèn)為過(guò)于小巧輕便,不必?fù)?dān)心監(jiān)視其性能睡毒。但是来惧,在現(xiàn)代,iOS應(yīng)用程序變得越來(lái)越大演顾,越來(lái)越復(fù)雜供搀,并且在幕后的工作比以往任何時(shí)候都要多∮缇樱現(xiàn)在,能夠遠(yuǎn)程監(jiān)視您的應(yīng)用程序在許多不同設(shè)備上的運(yùn)行方式至關(guān)重要葛虐。

某些iOS監(jiān)視工具已經(jīng)使用很長(zhǎng)時(shí)間了胎源。例如,您可以查詢(xún)?cè)O(shè)備以查看正在運(yùn)行的操作系統(tǒng)屿脐,或者是否正在使用Wi-Fi或蜂窩網(wǎng)絡(luò)連接涕蚤。另一種常見(jiàn)的做法是使用第三方分析工具(例如FirebaseNew Relic)來(lái)幫助捕獲用戶的真實(shí)感受。

但是的诵,還有更多的診斷信息可以為iOS開(kāi)發(fā)人員提供幫助万栅!蘋(píng)果公司聽(tīng)了,并在iOS 13中推出了MetricKit西疤。使用此工具可以更輕松地從設(shè)備檢索診斷數(shù)據(jù)烦粒,并將其用于iOS的遠(yuǎn)程監(jiān)視。在本教程中代赁,您將通過(guò)使用Xcode模擬接收診斷來(lái)探索MetricKit API扰她。

您可以通過(guò)以下方式做到這一點(diǎn):

  • MetricKit添加到入門(mén)應(yīng)用程序。
  • 將示例數(shù)據(jù)加載到Xcode中芭碍。
  • 使用MetricKit查看應(yīng)用使用統(tǒng)計(jì)信息徒役。

Looking Inside MetricKit

使用MetricKit,您可以從OS接收有關(guān)物理設(shè)備的診斷數(shù)據(jù)窖壕。它以JSON格式發(fā)送包含最近24小時(shí)數(shù)據(jù)的報(bào)告忧勿。例如,如果您要將這些數(shù)據(jù)中繼到您自己的服務(wù)器上艇拍,這將很有幫助狐蜕。然后宠纯,您可以可視化和分析該數(shù)據(jù)卸夕,并使用它們來(lái)提高應(yīng)用程序的性能。

1. New APIs in iOS 14

MetricKitiOS 13起就存在婆瓜,但在iOS 14中獲得了一些重大改進(jìn)快集。

首先,它引入了一個(gè)全新的有效負(fù)載(payload)廉白,稱(chēng)為MXDiagnosticPayload个初。以前,您僅收到MXMetricPayload猴蹂。新的MXDiagnosticPayload提供了更多信息院溺,例如崩潰和異常。這是蘋(píng)果公司不斷探索擴(kuò)展框架方法的一個(gè)很好的例子磅轻。

此外珍逸,蘋(píng)果推出了全新的性能指標(biāo)MXAppExitMetric逐虚。該對(duì)象表示應(yīng)用程序在前臺(tái)和后臺(tái)進(jìn)行的退出的類(lèi)型。此信息可以幫助您發(fā)現(xiàn)用戶為何離開(kāi)您的應(yīng)用程序以及處于何種狀態(tài)谆膳。


詳細(xì)了解

在本教程中叭爱,您將使用Shopping Trolley,這是一個(gè)顯示不同類(lèi)型水果的簡(jiǎn)單購(gòu)物清單的應(yīng)用程序 —— 因?yàn)槭澜顼@然需要更多的水果清單應(yīng)用程序漱病。

注意:開(kāi)始之前买雾,您應(yīng)該知道MetricKit僅可在真實(shí)的iOS設(shè)備上使用,并且與模擬器不兼容杨帽。因此漓穿,您需要插入真實(shí)的設(shè)備才能端到端運(yùn)行此功能。

首先打開(kāi)ShoppingListTableViewController.swift注盈。 將此代碼添加到文件頂部器净。

import MetricKit

現(xiàn)在,您可以訪問(wèn)MetricKit框架当凡。

接下來(lái)山害,將此代碼添加到viewDidLoad()中:

let metricManager = MXMetricManager.shared
metricManager.add(self)

這將訪問(wèn)框架提供的MetricManager。 然后將自身ShoppingShopTableTableViewController添加為metricManager的訂閱者沿量,這使它能夠偵聽(tīng)來(lái)自OS的度量有效負(fù)載浪慌。

接下來(lái),您只需要在ShoppingListTableViewController.swift的底部添加最后一段代碼即可朴则。

extension ShoppingListTableViewController: MXMetricManagerSubscriber {
  func didReceive(_ payloads: [MXMetricPayload]) {
    guard let firstPayload = payloads.first else { return }
    print(firstPayload.dictionaryRepresentation())
  }

  func didReceive(_ payloads: [MXDiagnosticPayload]) {
    guard let firstPayload = payloads.first else { return }
    print(firstPayload.dictionaryRepresentation())
  }
}

這是view controller上的擴(kuò)展权纤,符合MXMetricManagerSubscriber,其中包含兩個(gè)可以從MetricKit接收有效負(fù)載(payloads)的方法乌妒。在這種情況下汹想,接收有效負(fù)載時(shí),只需將其打印到控制臺(tái)即可撤蚊。但是古掏,在生產(chǎn)版本中,這是記錄指標(biāo)的好地方侦啸,例如對(duì)服務(wù)器進(jìn)行API調(diào)用槽唾。

恭喜你!您已經(jīng)集成了MetricKit光涂。

1. Understanding MetricKit APIs

該框架的接口非常簡(jiǎn)單明了庞萍,您可以看到Apple在開(kāi)發(fā)過(guò)程中投入了多少想法。該框架包括:

  • 具有訂戶協(xié)議的管理器類(lèi)忘闻。
  • 每種指標(biāo)和診斷類(lèi)別的類(lèi)钝计。
  • 報(bào)告數(shù)據(jù)的有效載荷(Payload)類(lèi)。
  • 測(cè)量單位的類(lèi),例如蜂窩信號(hào)強(qiáng)度條私恬。這真太了不起了交播!
  • 用于表示直方圖之類(lèi)的累積數(shù)據(jù)的類(lèi)。他們又做了艱苦的工作践付!

2. Understanding MXMetricManager

MXMetricManagerMetricKit框架的心臟秦士。這是共享對(duì)象,用于管理您的訂閱以接收設(shè)備上的每日指標(biāo)永高。

MetricKit在首次調(diào)用shared之后開(kāi)始為您的應(yīng)用程序累積報(bào)告隧土。要開(kāi)始接收度量標(biāo)準(zhǔn)報(bào)告,請(qǐng)首先使用符合MXMetricManagerSubscriber協(xié)議的類(lèi)調(diào)用add(_ :)命爬。

然后曹傀,系統(tǒng)最多每天發(fā)送一次這些報(bào)告。每個(gè)報(bào)告均包含過(guò)去24小時(shí)內(nèi)的指標(biāo)以及以前未提交的報(bào)告饲宛。

Manager還具有remove(_ :)皆愉,可讓您隨時(shí)刪除訂閱者。

3. Implementing MXSignpostMetric

使用MetricKit框架的一個(gè)巨大好處是艇抠,您現(xiàn)在可以將自己的指標(biāo)合并到Apple提供的“out of the box”的指標(biāo)中幕庐。 這非常強(qiáng)大,因?yàn)樗馕吨梢韵虬l(fā)送到服務(wù)器的報(bào)告中添加自定義指標(biāo)家淤,從而使您可以進(jìn)一步挖掘异剥。

首先添加一個(gè)自定義指標(biāo)以在用戶加載ShoppingListTableViewController時(shí)進(jìn)行記錄。 在現(xiàn)有fruit的正下方直接添加fruitsLogHandle絮重。

let fruitsLogHandle = MXMetricManager.makeLogHandle(category: "Fruits")

這將創(chuàng)建一個(gè)類(lèi)似于bucket的句柄冤寿,用于保存您的自定義指標(biāo)。

將此代碼添加到viewDidLoad()的末尾青伤。

mxSignpost(
  .event,
  log: fruitsLogHandle,
  name: "Loading Fruits TableViewController")

當(dāng)視圖控制器為用戶完成加載后督怜,mxSignpost將在fruits bucket中記錄一個(gè)自定義指標(biāo)。 這是一個(gè)簡(jiǎn)單的示例狠角,您真的可以進(jìn)一步擴(kuò)展它号杠。 例如,如果您的應(yīng)用程序具有視頻播放器擎厢,則記錄流開(kāi)始和結(jié)束的時(shí)間可能會(huì)很有用究流。

4. Implementing MXMetricPayload

您可以從MetricKit接收兩個(gè)不同的有效負(fù)載(payloads)辣吃。 從MXMetricPayload開(kāi)始 —— 這是一個(gè)封裝每日指標(biāo)報(bào)告的對(duì)象动遭。 切記:要觸發(fā)MetricKit每日?qǐng)?bào)告,您必須插入真實(shí)設(shè)備神得! 如果您沒(méi)有設(shè)備厘惦,則仍然可以通讀本教程,因?yàn)樘峁┝耸纠?code>JSON有效負(fù)載。

在設(shè)備上構(gòu)建并運(yùn)行宵蕉。

導(dǎo)航回Xcode酝静,然后選擇Debug ? Simulate MetricKit Payloads

這會(huì)觸發(fā)一個(gè)示例每日?qǐng)?bào)告羡玛,其形狀與您將自然收到的報(bào)告的形狀相同别智。 您應(yīng)該在控制臺(tái)上看到兩個(gè)有效載荷。

 AnyHashable("cellularConditionMetrics"): {
    cellConditionTime =     {
        histogramNumBuckets = 3;
        histogramValue =         {
            0 =             {
                bucketCount = 20;
                bucketEnd = "1 bars";
                bucketStart = "1 bars";
            };
            1 =             {
                bucketCount = 30;
                bucketEnd = "2 bars";
                bucketStart = "2 bars";
            };
            2 =             {
                bucketCount = 50;
                bucketEnd = "3 bars";
                bucketStart = "3 bars";
            };
        };
    };

上面的代碼示例復(fù)制了完整的有效載荷的一小段代碼稼稿,顯示了cellConditionMetrics薄榛。 有效負(fù)載的這一方面提供了有關(guān)您的用戶在使用您的應(yīng)用程序的最后24小時(shí)內(nèi)經(jīng)歷的蜂窩狀態(tài)的豐富數(shù)據(jù)。 通過(guò)告訴您它們?cè)谝粰谌眉撸瑑蓹诨蛉龣谏系姆?wù)次數(shù)敞恋,還可以進(jìn)一步深入研究。 您可以使用bucketCount創(chuàng)建直方圖谋右。 想象一下硬猫,了解用戶在某些信號(hào)條上花費(fèi)的平均時(shí)間有多么大的幫助!

5. Understanding MXDiagnosticPayload

MXDiagnosticPayload封裝設(shè)備提供的診斷數(shù)據(jù)改执,例如:

  • Performance:崩潰報(bào)告和異常
  • Responsiveness:應(yīng)用程序掛起率
  • Disk Access:磁盤(pán)讀寫(xiě)

檢查此有效負(fù)載的樣本啸蜜。

[AnyHashable("crashDiagnostics"): <__NSArrayM 0x283764390>(
{
    callStackTree =     {
        callStackPerThread = 1;
        callStacks =         (
                        {
                callStackRootFrames =                 (
                                        {
                        address = 74565;
                        binaryName = testBinaryName;
                        binaryUUID = "BE6FD323-B011-4E67-925B-A60362A1ADFA";
                        offsetIntoBinaryTextSegment = 123;
                        sampleCount = 20;
                    }
                );
                threadAttributed = 1;
            }
        );
    };
    diagnosticMetaData =     {
        appBuildVersion = 1;
        appVersion = "1.0";
        deviceType = "iPhone13,3";
        exceptionCode = 0;
        exceptionType = 1;
        osVersion = "iPhone OS 14.4 (18D52)";
        platformArchitecture = arm64e;
        regionFormat = GB;
        signal = 11;
        terminationReason = "Namespace SIGNAL, Code 0xb";
        virtualMemoryRegionInfo = "0 is not in any region.  Bytes before following region: 4000000000 REGION TYPE                      START - END             [ VSIZE] PRT/MAX SHRMOD  REGION DETAIL UNUSED SPACE AT START ---> __TEXT                 0000000000000000-0000000000000000 [   32K] r-x/r-x SM=COW  ...pp/Test";
    };
    version = "1.0.0";
}

上面的代碼示例復(fù)制了完整負(fù)載的一小段,顯示了crashDiagnostics辈挂。 這捕獲了用戶經(jīng)歷的崩潰盔性。 它包括diagnosticMetaData以及有用的詳細(xì)信息,例如操作系統(tǒng)和應(yīng)用程序版本呢岗。

由于這是崩潰冕香,因此有效負(fù)載還具有callStackTree,接下來(lái)將對(duì)其進(jìn)行探討后豫。

6. Understanding MXCallStackTree

您對(duì)MetricKit的探索越多悉尾,就越能了解它如何為Apple自己的工具(例如Xcode Organizer)提供動(dòng)力。 將應(yīng)用發(fā)布給用戶后挫酿,即使您不導(dǎo)入框架构眯,您仍然可以在Organizer中查看由MetricKit生成的報(bào)告。

如您所見(jiàn)早龟,此應(yīng)用程序是實(shí)時(shí)運(yùn)行的惫霸,具有可在Xcode中進(jìn)行探索的真實(shí)數(shù)據(jù)。這是因?yàn)?code>Apple免費(fèi)提供大多數(shù)指標(biāo)數(shù)據(jù)葱弟。但是壹店,導(dǎo)入MetricKit框架意味著您可以進(jìn)一步利用此數(shù)據(jù)并將其與您自己的指標(biāo)鏈接。如果您的服務(wù)器支持自定義可視化效果芝加,那么這也意味著您具有更大的顯示靈活性硅卢。

MXCallStackTree是一個(gè)很好的數(shù)據(jù)示例,可以通過(guò)MetricKit更好地利用數(shù)據(jù)。您不僅可以獲得有關(guān)崩潰和異常之類(lèi)的報(bào)告将塑,而且還可以獲得JSON中提供的StackTrace脉顿。通過(guò)將崩潰鏈接到實(shí)際的堆棧跟蹤信息,這對(duì)于進(jìn)一步操作非常有用点寥,因此您可以修復(fù)那些討厭的錯(cuò)誤艾疟。

7. Understanding MXAppExitMetric

MXAppExitMetriciOS 14中提供的全新對(duì)象,代表用戶如何離開(kāi)您的應(yīng)用程序敢辩。退出類(lèi)型包括:

  • Foreground exit
  • Background exit

用戶可以出于多種原因退出應(yīng)用程序汉柒。關(guān)閉應(yīng)用程序可能是一個(gè)故意的決定责鳍,但有時(shí)操作系統(tǒng)會(huì)終止應(yīng)用程序 —— 最糟糕的是碾褂,由于內(nèi)存不足或發(fā)生異常。

在每個(gè)類(lèi)別中历葛,您可以得到以下數(shù)目的診斷信息:

  • Normal App Exits - 正常應(yīng)用退出:該應(yīng)用從前臺(tái)或后臺(tái)正常退出乓诽。
  • Abnormal App Exits - 應(yīng)用程序異常退出:應(yīng)用程序從前臺(tái)或后臺(tái)異常退出咒程。
  • Memory Resource Limit - 內(nèi)存資源限制:由于使用過(guò)多內(nèi)存,系統(tǒng)從前臺(tái)或后臺(tái)終止了該應(yīng)用程序剥纷。
  • Bad Access / Exception - 錯(cuò)誤的訪問(wèn)權(quán)限/異常:系統(tǒng)從前臺(tái)或后臺(tái)終止了該應(yīng)用程序确买,以嘗試進(jìn)行無(wú)效的內(nèi)存訪問(wèn)抹剩。

請(qǐng)記浊弧:每個(gè)類(lèi)別通常是一個(gè)屬性拓瞪,然后具有與直方圖結(jié)構(gòu)化數(shù)據(jù)的關(guān)系。此外呻拌,它還鏈接到其他類(lèi)缔御,例如MXStackTree浙芙,這意味著您可以將某些應(yīng)用程序退出鏈接回實(shí)際的崩潰皇耗。

那有多強(qiáng)大南窗?功能強(qiáng)大!


Viewing in Organizer

Apple免費(fèi)提供一定級(jí)別的數(shù)據(jù)郎楼,以在Organizer中可視化万伤。這是將來(lái)自App Store Connect的數(shù)據(jù)直接集成到Xcode中的項(xiàng)目的一部分。

您無(wú)法訪問(wèn)OrganizerMetricKit提供的所有內(nèi)容呜袁,但可以期望找到:

  • Crashes
  • Disk Writes
  • Energy Usage
  • Battery Usage
  • Hang Rate
  • Launch Time
  • Memory
  • Scrolling

Apple已在此處匯總了最常用的數(shù)據(jù)敌买,希望它們會(huì)繼續(xù)添加到此列表中。

1. Generating Graphs & Reports

上面描述的每個(gè)部分已經(jīng)呈現(xiàn)為各種圖表阶界。 通常虹钮,數(shù)據(jù)可視化為直方圖以及JSON負(fù)載。 您將看到如何使用和顯示MetricKit數(shù)據(jù)荐操,從而產(chǎn)生巨大的效果芜抒。

上方顯示了Scrolling指標(biāo)的直方圖。 它代表用戶的滾動(dòng)連接時(shí)間托启,從本質(zhì)上講宅倒,這是用戶滾動(dòng)視圖所需的時(shí)間。 在此應(yīng)用程序中屯耸,您可以看到滾動(dòng)拖曳的大量減少拐迁,但隨后突然增加。 當(dāng)然疗绣,這是您要探索的東西线召,并弄清楚這些版本之間的變化。

這是來(lái)自App Store中實(shí)時(shí)應(yīng)用的另一個(gè)示例多矮。 此特定圖顯示Battery Usage情況缓淹,特別是用戶在應(yīng)用程序中處于活動(dòng)狀態(tài)時(shí)的電池使用情況。

細(xì)節(jié)水平真是太神奇了塔逃! 您可以在應(yīng)用程序的每個(gè)部分(網(wǎng)絡(luò)讯壶,顯示等)查看受影響最大的電池使用情況。 在此示例中湾盗,該應(yīng)用平均每天消耗用戶電池的8.29%伏蚊。 目前尚不清楚基準(zhǔn)會(huì)是什么,但這使您能夠探索并確定在何處進(jìn)行改進(jìn)格粪。

MetricKit是監(jiān)視iOS實(shí)時(shí)應(yīng)用程序的重要一步躏吊。 為了有效使用氛改,它確實(shí)需要考慮一些對(duì)您的用戶重要的事情。 例如比伏,如果您的應(yīng)用程序包含大量執(zhí)行滾動(dòng)的內(nèi)容(例如新聞閱讀應(yīng)用程序)胜卤,則您可能需要關(guān)注滾動(dòng)指標(biāo)。

確定了重要內(nèi)容后凳怨,就可以決定如何使用該數(shù)據(jù)以及如何顯示它們瑰艘。 例如是鬼,您可能有一個(gè)小的Vapor Swift API肤舞,它可以使用數(shù)據(jù)并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中,而前端的小dashboard會(huì)將其轉(zhuǎn)換為直方圖均蜜。 集成MetricKit本身是最簡(jiǎn)單的部分李剖!

有關(guān)將VaporMetricKit結(jié)合使用的深入視頻課程,請(qǐng)查看Swift Vapor API for monitoring for iOS囤耳。

想了解更多篙顺? WWDC上有一個(gè)精彩視頻 —— What’s New in MetricKit

后記

本篇主要講述了基于MetricKit的App中的電源監(jiān)控充择,性能和診斷德玫,感興趣的給個(gè)贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市椎麦,隨后出現(xiàn)的幾起案子宰僧,更是在濱河造成了極大的恐慌,老刑警劉巖观挎,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琴儿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嘁捷,警方通過(guò)查閱死者的電腦和手機(jī)造成,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雄嚣,“玉大人晒屎,你說(shuō)我怎么就攤上這事』荷” “怎么了鼓鲁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)仔沿。 經(jīng)常有香客問(wèn)我坐桩,道長(zhǎng),這世上最難降的妖魔是什么封锉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任绵跷,我火速辦了婚禮膘螟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碾局。我一直安慰自己荆残,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布净当。 她就那樣靜靜地躺著内斯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪像啼。 梳的紋絲不亂的頭發(fā)上俘闯,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音忽冻,去河邊找鬼真朗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛僧诚,可吹牛的內(nèi)容都是我干的遮婶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼湖笨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼旗扑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起慈省,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤臀防,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后辫呻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體清钥,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年放闺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祟昭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怖侦,死狀恐怖篡悟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情匾寝,我是刑警寧澤搬葬,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站艳悔,受9級(jí)特大地震影響急凰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猜年,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一抡锈、第九天 我趴在偏房一處隱蔽的房頂上張望疾忍。 院中可真熱鬧,春花似錦床三、人聲如沸一罩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)聂渊。三九已至,卻和暖如春四瘫,著一層夾襖步出監(jiān)牢的瞬間汉嗽,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工莲组, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诊胞,地道東北人暖夭。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓锹杈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親迈着。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竭望,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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