iOS - JLRoutes路由跳轉(zhuǎn)

介紹 :

JLRoutes是一個(gè)調(diào)用極少代碼 , 可以很方便的處理不同URL schemes以及解析它們的參數(shù)庄岖,并通過(guò)回調(diào)block來(lái)處理URL對(duì)應(yīng)的操作 , 可以用于處理復(fù)雜跳轉(zhuǎn)邏輯的三方庫(kù).

1.在日常開(kāi)發(fā)中 , push , present 出現(xiàn)在整個(gè)程序的各個(gè)地方 , 如果你想快速理清一個(gè)項(xiàng)目的整體邏輯 , 非常麻煩 . 大多數(shù)情況 , 你得找到代碼目錄 ,根據(jù)層級(jí)結(jié)構(gòu)分出關(guān)系 , 然后找到對(duì)應(yīng)的push位置 , 尋找下一級(jí)頁(yè)面 , 如果本身項(xiàng)目的目錄就非常亂 , 那么如果要了解一個(gè)項(xiàng)目的整體跳轉(zhuǎn)邏輯 , 非常的難.

即便可以將 UIViewController-Swizzled 庫(kù)集成到項(xiàng)目中 ,然后一頁(yè)一頁(yè)點(diǎn)擊查詢 , 但也是比較痛苦的.

如果 , 是把整個(gè)項(xiàng)目的跳轉(zhuǎn)邏輯都給抽取出來(lái) , 單獨(dú)放在一個(gè)類 , 模塊化管理 , 那么思路就會(huì)清晰很多 , 甚至可以用XMind根據(jù)代碼畫出整個(gè)項(xiàng)目的樹(shù)狀圖

2.如果所處公司存在多個(gè)app , app之間互相推薦 , 互相跳轉(zhuǎn)是再正常不過(guò)的需求,就類似于QQ , 微信三方分享跳轉(zhuǎn)等 .如果用Appdelegate原生方法進(jìn)行攔截 , 所做的事至少得是判斷Scheme是否匹配 , 想辦法進(jìn)入需要跳到的界面 , 如果要涉及傳參 , 就更加麻煩.

3. 如果用戶是從PC端識(shí)別二維碼,或者通過(guò)鏈接想要進(jìn)入app指定頁(yè)面

JLRoutes原理:

JLRoutes本質(zhì)可以理解為:保存一個(gè)全局的Map屑墨,key是url副编,value是對(duì)應(yīng)存放block的數(shù)組卤恳,url和block都會(huì)常駐在內(nèi)存中,當(dāng)打開(kāi)一個(gè)URL時(shí)亲族,JLRoutes就可以遍歷 , 這個(gè)全局的map种呐,通過(guò)url來(lái)執(zhí)行對(duì)應(yīng)的block。

個(gè)人理解原理 :

1. routeControllersMap 是全局的單例字典 , 你可以想象成一個(gè)大的盒子 .

2 . 這個(gè)盒子里裝了很多的字典 , 而字典的key值對(duì)應(yīng) 一個(gè)標(biāo)識(shí) , 源碼中稱之為 scheme ,為了不混淆 , 咱們就叫其為JLRoutes對(duì)象標(biāo)識(shí) . 這個(gè)標(biāo)識(shí)對(duì)應(yīng)的value值 為JLRoutes類的對(duì)象 .

3. JLRoutes對(duì)象有很多屬性 , 常用的有兩個(gè) , 一個(gè)是 scheme 也就是是上述所說(shuō)的JLRoutes對(duì)象標(biāo)識(shí) , 也就是說(shuō) , 此value值記錄了自己的key值 . 另外一個(gè)屬性為 routes數(shù)組 , 此數(shù)組中存放了 JLRRouteDefinition 對(duì)象 .

4. JLRRouteDefinition對(duì)象為最終的具體模型 , 也就是說(shuō) 你注冊(cè)的跳轉(zhuǎn)邏輯的所有信息 , 都存在于這個(gè)模型中 ,包括要實(shí)施操作的block代碼塊 , JLRoutes對(duì)象標(biāo)識(shí) , 取url內(nèi)容值的標(biāo)識(shí)


預(yù)熱

首先了解 , 如何通過(guò)設(shè)置app URL Scheme由外部跳轉(zhuǎn)到app ?

首先 , 配置info.plist —>添加URL types字段 , 你會(huì)發(fā)現(xiàn)其為一個(gè)數(shù)組 –>然后咱們?cè)趇tem 0 處在加一個(gè)URL Schemes , 又是一個(gè)數(shù)組 .這里說(shuō)明了一個(gè)問(wèn)題 , 一個(gè)app可以對(duì)應(yīng)多個(gè)scheme —>配置scheme , URL identifier 最好設(shè)置復(fù)雜些 , 保證其唯一性

現(xiàn)在 , 咱們?cè)趕afari中輸入scheme JLRoutesOne://

同個(gè)手機(jī)app應(yīng)用之間的跳轉(zhuǎn)也是如此 , 只需要調(diào)用openUrl方法 , 在另外個(gè)應(yīng)用設(shè)置scheme . 例如 , A應(yīng)用跳轉(zhuǎn)到B應(yīng)用, 那么設(shè)置B應(yīng)用的scheme 為 com.mengyao_block@outlook.com:// , 在A應(yīng)用中調(diào)用[[UIApplication

sharedApplication]openURL:[NSURL URLWithString:@"com.mengyao_block@outlook.com://"]]方法 , 即可跳轉(zhuǎn)到B應(yīng)用 . 那么 , 假如有很多的應(yīng)用都在跳轉(zhuǎn)B應(yīng)用 , 那么如何區(qū)分是由哪個(gè)app跳轉(zhuǎn)過(guò)來(lái) , 跳轉(zhuǎn)過(guò)來(lái)又需要執(zhí)行什么操作呢 ? 可以 設(shè)置多個(gè)scheme , 攔截openUrl方法 , 取出url 進(jìn)行解析 , 判斷 . 比如com.mengyao_block@outlook.com:// scheme代表了執(zhí)行登錄 , com.baidu.www:// scheme代表了執(zhí)行授權(quán) 等等 . 那又將如何判斷是由哪個(gè)應(yīng)用跳轉(zhuǎn)過(guò)來(lái)呢 ? 只需要附帶上參數(shù)即可 , 例如 com.mengyao_block@outlook.com://JinSeJiaYuan 這就代表了是從金色家園app跳轉(zhuǎn)過(guò)來(lái) , 需要執(zhí)行登錄操作 …

那么 , 如果是跳到指定的頁(yè)面呢 ? 首先一種方式是可以攔截openUrl方法 , 然后實(shí)現(xiàn)跳轉(zhuǎn) , 但是此方法跳轉(zhuǎn)如果涉及傳參 , 或者越了多級(jí)跳轉(zhuǎn) , 會(huì)非常的困難 . 還有一種方式, 就是利用JLRoutes


開(kāi)始步驟 :

一 : 為程序配置URL Schemes

平時(shí)咱們所用到的第三方分享跳轉(zhuǎn) , 也是用到了這個(gè)原理 , 通過(guò)解析參數(shù) , 跳轉(zhuǎn)到指定頁(yè)面

一個(gè)app可以對(duì)應(yīng)多個(gè)URL Scheme , 如下圖 info.plist配置 , 在safari中 , 只要輸入 JLRoutesOne:// 或JLRoutesTwo:// 或JLRoutesThree:// 都可以打開(kāi)該app , 而URL identifier 最好是保證其唯一性 , 這里咱們?yōu)閍pp設(shè)置了3個(gè)URL Schemes ,是為了后面手動(dòng)解析URL而做的準(zhǔn)備 .

二 : 注冊(cè)

首先 , 考慮的問(wèn)題有兩個(gè) , 一是什么時(shí)候注冊(cè)跳轉(zhuǎn)邏輯 , 二是 在什么地方注冊(cè)

比如一個(gè)項(xiàng)目的tabbarItem有3個(gè) , 那么這3個(gè)模塊的跳轉(zhuǎn) , 并不是由 一個(gè)navigationController來(lái)完成 , 所以考慮到這點(diǎn) , 我們可以創(chuàng)建一個(gè)分類 , 將跳轉(zhuǎn)邏輯放在其中 , 在初始化tabbarController時(shí) 進(jìn)行注冊(cè)跳轉(zhuǎn)邏輯

注冊(cè)的方式有很多種 :

1. 注冊(cè)全局JLRoutes

[[JLRoutes globalRoutes]addRoute:@"取url內(nèi)容值的標(biāo)識(shí)"handler:^BOOL(NSDictionary * _Nonnull parameters) {

returnYES;//一旦匹配 , 立即返回YES

}];


//此方法對(duì)應(yīng)的JLRoutes對(duì)象標(biāo)識(shí)為 @”JLRoutesGlobalRoutesScheme” , 由下述源碼可知 , 用globalRoutes方式創(chuàng)建的JLRoutes對(duì)象 , 無(wú)論創(chuàng)建多少次 , 始終對(duì)應(yīng)著同一個(gè)實(shí)例 . 也就是說(shuō) , 無(wú)論你調(diào)用上述方法多少次 , 盡管 @”取url內(nèi)容值的標(biāo)識(shí)” 和block塊內(nèi)容不一樣 , 最后都會(huì)執(zhí)行第一次注冊(cè)的內(nèi)容 . 此方法和咱們要實(shí)現(xiàn)的3個(gè)tabbarItem對(duì)應(yīng) 3種跳轉(zhuǎn)要求不合 , 因?yàn)?咱們要求的是 block塊中的navigationController為 3個(gè)不同的實(shí)例對(duì)象.

2. 自定義命名空間注冊(cè)

[[JLRoutes routesForScheme:@“第一模塊的標(biāo)識(shí)”]addRoute:@"取url內(nèi)容值的標(biāo)識(shí)"handler:^BOOL(NSDictionary * _Nonnull parameters){

returnYES;? ?

?}];

//此注冊(cè)方法 , 所得的JLRoutes對(duì)象都是唯一的 ,而這才是咱們真正需要的 , 如下述源碼

//源碼如下 , 注釋不用看 , 為自己分析源碼的筆記———————————————————————————————————————————————————————?

+ (instancetype)globalRoutes{

return [selfroutesForScheme:JLRoutesGlobalRoutesScheme];

}

+ (instancetype)routesForScheme:(NSString*)scheme{//路由對(duì)象

JLRoutes *routesController =nil;

staticdispatch_once_tonceToken;dispatch_once(&onceToken, ^{//全局單例字典

routeControllersMap = [[NSMutableDictionaryalloc] init];? ?

?});

//如果是不存在以scheme為key的字典 , 就創(chuàng)建一個(gè) , 防止重復(fù)創(chuàng)建

if(!routeControllersMap[scheme]) {?

?? ? ? routesController = [[selfalloc] init];

NSLog(@"---------------------%@",routesController);//路由存儲(chǔ)scheme (globel或自定義)

routesController.scheme= scheme;//以scheme作為key值 --對(duì)應(yīng)路由對(duì)象為value

#warning ?- 只要我通過(guò)global命名空間創(chuàng)建了JLRoutes對(duì)象 , routeControllersMap[scheme]就是有值的,一旦有值 , 我第二次創(chuàng)建時(shí) , 無(wú)論以什么命名空間創(chuàng)建 , 都會(huì)被賦上之前第一個(gè)的值 . 從而 ,就算我多次調(diào)用global方法創(chuàng)建對(duì)象 ,JLRoutes對(duì)象始終保持為第一個(gè).這也就是解釋了為什么多次注冊(cè) , 始終只有第一個(gè)注冊(cè)里的block被調(diào)用的原因 . 當(dāng)設(shè)置了優(yōu)先級(jí) , 插入排序使得高優(yōu)先級(jí)位于隊(duì)列前方 , 優(yōu)先被搜索出來(lái),return掉 . 然而也只有一個(gè)注冊(cè)得以實(shí)現(xiàn) . 原本要實(shí)現(xiàn)的是 , 在創(chuàng)建3個(gè)navigationController時(shí) , 分別注冊(cè)四次 , 運(yùn)用3個(gè)不同的navigationController進(jìn)行3個(gè)模塊內(nèi)跳轉(zhuǎn) , 然后始終只有第一個(gè)生成的navigationController生效 , 因?yàn)楹竺鎰?chuàng)建的三次都被內(nèi)部給覆蓋掉.

//新增以scheme為key 對(duì)應(yīng) JLRoutes對(duì)象為鍵值的字典

routeControllersMap[scheme] = routesController;??

? }//將value值賦值給當(dāng)前路由對(duì)象? (注意:? 這里的routeControllersMap 是全局單例 , 當(dāng)我用global創(chuàng)建的對(duì)象反復(fù)addRoutes時(shí),所創(chuàng)建的Routes對(duì)象都會(huì)被賦值最開(kāi)始那個(gè)對(duì)象的值 , 如下)

routesController = routeControllersMap[scheme];

#warning? --- 在全局字典中存儲(chǔ)一份路由的字典 , 由設(shè)置的global或者自定義scheme 為key取JLRoutes對(duì)象

return ?routesController;

}

3.定義優(yōu)先級(jí)

//簡(jiǎn)單來(lái)說(shuō) , 如果不設(shè)置優(yōu)先級(jí) , 所有的注冊(cè)優(yōu)先級(jí)都為 0 . 當(dāng)標(biāo)識(shí)了優(yōu)先級(jí)進(jìn)行注冊(cè)后 , JLRRouteDefinition 對(duì)象(最終模型)在 JLRoutes對(duì)象的routes數(shù)組中 , 將進(jìn)行排序 , 類似于選擇排序 , 當(dāng)通過(guò)route對(duì)象 尋找到其 routes數(shù)組后 , 將會(huì)遍歷整個(gè)routes數(shù)組 , 優(yōu)先級(jí)高的JLRRouteDefinition對(duì)象將會(huì)被最先匹配 , 然后return YES , 停止遍歷 . 咱們暫時(shí)用不上這個(gè)優(yōu)先級(jí) , 就不進(jìn)行過(guò)多講述 . 因?yàn)樵蹅冏?cè)的3個(gè)跳轉(zhuǎn) , 每個(gè)對(duì)應(yīng)的routes數(shù)組中元素僅為1個(gè)

[[JLRoutes globalRoutes] ?addRoute:@"取url內(nèi)容值的標(biāo)識(shí)"priority:1 handler:^BOOL(NSDictionary * _Nonnull parameters) {

//要實(shí)現(xiàn)的操作

returnYES; ??

}];

4 . 定義多個(gè) @”取url內(nèi)容值的標(biāo)識(shí)” , 這個(gè)暫時(shí)還不知道怎么用 , 暫不解釋.

[[JLRoutes globalRoutes] addRoutes:@"數(shù)組" ?handler:^BOOL(NSDictionary * _Nonnull parameters) {

returnYES;?

?? }];

三 : 跳轉(zhuǎn)點(diǎn)擊

// 此處 , 三個(gè)Scheme頭都不一樣 , 但是正如 一種所講 , 這三個(gè)命令我都添加進(jìn)了info.plist , 所以這三種寫法都可以跳轉(zhuǎn)

1.第一個(gè)模塊

?- (void)touch{

NSString*url = @"JLRoutesOne://OneNextViewController";??

? [[UIApplicationsharedApplication] ?openURL:[NSURLURLWithString:url] options:nilcompletionHandler:nil];

}

2.第二個(gè)模塊?

- (void)touch{

NSString*url = @"JLRoutesTwo://TwoNextViewController";??

? [[UIApplicationsharedApplication] openURL:[NSURLURLWithString:url ] options:@{@"name":@"JLRoutesTwo"} completionHandler:nil];

}

3.第三個(gè)模塊

?- (void)touch{

NSString*url = @"JLRoutesThree://ThreeNextViewController";? ?

?[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:url] options:@{@"name":@"JLRoutesThree"} completionHandler:nil];

}

四: 實(shí)現(xiàn)openUrl方法

//手動(dòng)解析URL , Scheme如果從網(wǎng)頁(yè)跳轉(zhuǎn)過(guò)來(lái) , 攔截到的會(huì)變成小寫 , 故, 直接將URL Scheme攔截下來(lái) , 轉(zhuǎn)換小寫進(jìn)行判斷. 經(jīng)過(guò)處理之后 , 交于JLRoutes進(jìn)行解析 , 尋找具體的操作

//這里也解釋了 , 為什么在info.plist文件中 , 要設(shè)定3個(gè)不同的URL Scheme . 當(dāng)在3個(gè)不同模塊中進(jìn)行跳轉(zhuǎn)點(diǎn)擊時(shí) , 這個(gè)方法是必經(jīng)過(guò) , 然后進(jìn)行攔截 , 判斷具體是哪個(gè)模塊后交于JLRoutes解析

- (BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary *)options{

NSString*str = url.absoluteString;

NSArray*arr = [str componentsSeparatedByString:@"://"];

if([[arr.firstObjectlowercaseString] isEqualToString:@"jlroutesone"])?{

return [[JLRoutes routesForScheme:@"JLRoutesOne"] ?routeURL:url];? ? }

else ?if([[arr.firstObjectlowercaseString] isEqualToString:@"jlroutestwo"]){

return[[ ?JLRoutes routesForScheme:@"JLRoutesTwo"]routeURL:url];? ?

?}return[[JLRoutes routesForScheme:@"JLRoutesThree"]routeURL:url];

}// JLRoute 通過(guò)遍歷對(duì)應(yīng)的 JLRoutes對(duì)象的routes數(shù)組 , 進(jìn)行解析 , 并執(zhí)行block中內(nèi)容 , 具體解析 參考源碼

[JLRoutes routesForScheme:@“”] routeURL:url]

五 : 參數(shù)傳遞 , 以及tabbarController 選中問(wèn)題處理

// 1. 參數(shù)傳遞需要進(jìn)行一一對(duì)應(yīng) .

[[

JLRoutes routesForScheme:@"JLRoutesOne"]addRoute:@"/:ViewController/:userID/:pass"handler:^BOOL(NSDictionary * _Nonnull parameters){? ??

? ? Class class = NSClassFromString(parameters[@"ViewController"]);

NSLog(@"-----------userID : %@",parameters[@"userID"]);

NSLog(@"-----------pass? : %@",parameters[@"pass"]);? ??

?[navVc pushViewController:[[class alloc]init] animated:YES];

NSLog(@"-------------------第一模塊");

self.selectedIndex=0;//解決從app外跳轉(zhuǎn)進(jìn)來(lái)的tabbar選中問(wèn)題returnYES;??

? }];}


點(diǎn)擊方法如下

- (void)touch{

NSString*url = @"JLRoutesOne://OneNextViewController/我是userID/我是pwd";//中文傳輸需要進(jìn)行轉(zhuǎn)義

url = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];? ? [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:url] options:nilcompletionHandler:nil];

}

2.處理從網(wǎng)頁(yè)等跳轉(zhuǎn)過(guò)來(lái) , 比如直接跳到第二模塊的第二級(jí)控制器 , 實(shí)際上以及跳轉(zhuǎn)了 ,tabbarItem還選中第一個(gè) . 只需要在block塊中處理一下selectedIndex就行

未解決問(wèn)題 : 1. block塊中 , 像push的下級(jí)傳遞參數(shù)問(wèn)題 . 2. 傳遞參數(shù)為非框架中的類時(shí) , 比如自定義模型

總結(jié): JLRoutes主要作用有兩個(gè) :

1. 用于處理從網(wǎng)頁(yè)跳轉(zhuǎn)至app指定頁(yè)面

2. 多個(gè)應(yīng)用間的互相跳轉(zhuǎn)

然而如果想要實(shí)現(xiàn)全部頁(yè)面之間跳轉(zhuǎn) , 從而取代模態(tài)和push , 不太現(xiàn)實(shí)

最后 , 整體實(shí)現(xiàn)

demo目錄 :

UINavigationController分別包裝了 OneViewController , TwoViewController , ThreeViewController , 然后分別為MYTabbarController的三個(gè)子控制器 .

現(xiàn)在咱們要實(shí)現(xiàn)的是 , 利用JLRoutes 可以從OneViewController跳轉(zhuǎn)到下級(jí)界面OneNextViewController , TwoViewController跳轉(zhuǎn)到下級(jí)頁(yè)面TwoNextViewController , …..

AppDelegate類



MYTabbarController類



注冊(cè)跳轉(zhuǎn)邏輯如下

下述的@”JLRoutesOne”,@”…Two”….均可隨意擬定 , 僅為JLRoutes實(shí)例對(duì)象標(biāo)識(shí) , 不做任何要求 . 后面參數(shù)傳遞也是如此 , 自行擬定

//第一模塊跳轉(zhuǎn)邏輯


//第二模塊跳轉(zhuǎn)邏輯


//第三模塊跳轉(zhuǎn)邏輯


注意 : 下述方法的前面 , 需和info.plist文件中定義的3個(gè)schemes保持一致 . 分別對(duì)應(yīng)著三個(gè)模塊 , 用于appdelegate 中openUrl方法攔截時(shí)區(qū)分模塊

OneViewController類

//第一模塊按鈕點(diǎn)擊事件

- (void)touch{

NSString*url = @"JLRoutesOne://OneNextViewController/我是userID/我是pwd";//中文傳輸需要進(jìn)行轉(zhuǎn)義

url = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];? ? [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:url] options:nilcompletionHandler:nil];}


TwoViewController 類

//第二模塊按鈕點(diǎn)擊

- (void)touch{NSString*url = @"JLRoutesTwo://TwoNextViewController"; ?

?[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:url] options:nilcompletionHandler:nil];}


ThreeViewController類

//第三模塊按鈕點(diǎn)擊

- (void)touch{NSString*url = @"JLRoutesThree://ThreeNextViewController";??

? [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:url] options:@{@"name":@"JLRoutesThree"} completionHandler:nil];

}

最后實(shí)現(xiàn)效果

app內(nèi)頁(yè)面跳轉(zhuǎn)

safari跳轉(zhuǎn)到任意級(jí)界面

這里直接跳到第三個(gè)模塊的二級(jí)界面

能夠?qū)崿F(xiàn)

注:原文--http://blog.csdn.net/qq_22080737/article/details/53188784
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末神年,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子行嗤,更是在濱河造成了極大的恐慌,老刑警劉巖栅屏,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飘千,死亡現(xiàn)場(chǎng)離奇詭異栈雳,居然都是意外死亡护奈,警方通過(guò)查閱死者的電腦和手機(jī)哥纫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門霉旗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蛀骇,“玉大人,你說(shuō)我怎么就攤上這事擅憔⊥疑粒” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵雕欺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我屠列,道長(zhǎng)啦逆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任夏志,我火速辦了婚禮,結(jié)果婚禮上苛让,老公的妹妹穿的比我還像新娘沟蔑。我一直安慰自己狱杰,他們只是感情好瘦材,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布仿畸。 她就那樣靜靜地躺著朗和,像睡著了一般。 火紅的嫁衣襯著肌膚如雪簿晓。 梳的紋絲不亂的頭發(fā)上眶拉,一...
    開(kāi)封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音憔儿,去河邊找鬼忆植。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谒臼,可吹牛的內(nèi)容都是我干的朝刊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屋休,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坞古!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起劫樟,我...
    開(kāi)封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤痪枫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后叠艳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奶陈,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年附较,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吃粒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拒课,死狀恐怖徐勃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情早像,我是刑警寧澤僻肖,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站卢鹦,受9級(jí)特大地震影響臀脏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冀自,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一揉稚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熬粗,春花似錦搀玖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)葛超。三九已至暴氏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間答渔,已是汗流浹背关带。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工沼撕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人务豺。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓磨总,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蚪燕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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