一篇文章搞定WKWebView(iOS 8之后最優(yōu)Web解決框架)

iOS8以后核畴,蘋果推出了新框架Webkit含蓉,提供了替換UIWebView的組件WKWebView。其優(yōu)點(diǎn)速度更快项郊,占用內(nèi)存更少馅扣,簡(jiǎn)而言之,WKWebView是App內(nèi)部加載網(wǎng)頁(yè)的最佳選擇着降。

WKNavigationDelegate代理方法

#pragma mark -----WKNavigationDelegate---------
// 頁(yè)面開始加載時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
    NSLog(@"頁(yè)面開始加載時(shí)調(diào)用");
}

// 當(dāng)內(nèi)容開始返回時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {
    NSLog(@"當(dāng)內(nèi)容開始返回時(shí)調(diào)用");
}

// 頁(yè)面加載完成之后調(diào)用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    NSLog(@"頁(yè)面加載完成之后調(diào)用");
}

// 頁(yè)面加載失敗時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation {
    NSLog(@"頁(yè)面加載失敗時(shí)調(diào)用");
}

// 頁(yè)面導(dǎo)航錯(cuò)誤時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(nonnull NSError *)error {
    NSLog(@"頁(yè)面導(dǎo)航錯(cuò)誤時(shí)調(diào)用");
}

//頁(yè)面終結(jié)時(shí)調(diào)用
- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView {
    
    NSLog(@"頁(yè)面終結(jié)時(shí)調(diào)用");
}

// 接收到服務(wù)器跳轉(zhuǎn)請(qǐng)求之后調(diào)用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation {
    
    NSLog(@"接收到服務(wù)器跳轉(zhuǎn)請(qǐng)求之后調(diào)用");
}

// 在收到響應(yīng)后差油,決定是否跳轉(zhuǎn)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
    
    NSLog(@"在收到響應(yīng)后,決定是否跳轉(zhuǎn)");
    decisionHandler(WKNavigationResponsePolicyAllow);
}

// 在發(fā)送請(qǐng)求之前任洞,決定是否跳轉(zhuǎn)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    
    NSLog(@"在發(fā)送請(qǐng)求之前蓄喇,決定是否跳轉(zhuǎn)");
    decisionHandler(WKNavigationActionPolicyAllow);
}

//證書驗(yàn)證處理
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(nonnull void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler {

    NSLog(@"證書驗(yàn)證處理");
    // 判斷服務(wù)器采用的驗(yàn)證方法
    if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
        // 如果沒有錯(cuò)誤的情況下 創(chuàng)建一個(gè)憑證,并使用證書
        if (challenge.previousFailureCount == 0) {
            NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
            completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
        }else {
             //驗(yàn)證失敗交掏,取消本次驗(yàn)證
            completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
        }
    }else {
        completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
        
    }
}

WKUIDelegate代理方法

#pragma mark ----WKUIDelegate協(xié)議----

/**
 *  web界面中有彈出警告框時(shí)調(diào)用
 *
 *  @param webView           實(shí)現(xiàn)該代理的webview
 *  @param message           警告框中的內(nèi)容
 *  @param frame             主窗口
 *  @param completionHandler 警告框消失調(diào)用
 */
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(nonnull WKFrameInfo *)frame completionHandler:(nonnull void (^)(void))completionHandler {
    // js 里面的alert實(shí)現(xiàn)妆偏,如果不實(shí)現(xiàn),網(wǎng)頁(yè)的alert函數(shù)無效
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示"
                                                                             message:message
                                                                      preferredStyle:UIAlertControllerStyleAlert];
    [alertController addAction:[UIAlertAction actionWithTitle:@"確定"
                                                        style:UIAlertActionStyleCancel
                                                      handler:^(UIAlertAction *action) {
                                                          completionHandler();
                                                      }]];
    
    [self presentViewController:alertController animated:YES completion:^{}];
    
}


/**
 web界面中有彈出選擇框

 @param webView 實(shí)現(xiàn)該代理的webview
 @param message 警告框中的內(nèi)容
 @param frame 主窗口
 @param completionHandler 警告框消失調(diào)用 得到選擇結(jié)果
 */
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler {
    //  js 里面的alert實(shí)現(xiàn)盅弛,如果不實(shí)現(xiàn)钱骂,網(wǎng)頁(yè)的alert函數(shù)無效  ,
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示"
                                                                             message:message
                                                                      preferredStyle:UIAlertControllerStyleAlert];
    [alertController addAction:[UIAlertAction actionWithTitle:@"確定"
                                                        style:UIAlertActionStyleDefault
                                                      handler:^(UIAlertAction *action) {
                                                          completionHandler(YES);
                                                      }]];
    [alertController addAction:[UIAlertAction actionWithTitle:@"取消"
                                                        style:UIAlertActionStyleCancel
                                                      handler:^(UIAlertAction *action){
                                                          completionHandler(NO);
                                                      }]];
    
    [self presentViewController:alertController animated:YES completion:^{}];
    
}


/**
 web界面中有彈出輸入框

 @param webView 實(shí)現(xiàn)該代理的webview
 @param prompt 輸入框的提示內(nèi)容
 @param defaultText 默認(rèn)的填寫內(nèi)容
 @param frame 主窗口
 @param completionHandler 警告框消失調(diào)用 得到輸入內(nèi)容
 */
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(nonnull WKFrameInfo *)frame completionHandler:(nonnull void (^)(NSString * _Nullable))completionHandler {
    
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:prompt message:nil preferredStyle:UIAlertControllerStyleAlert];
    
    [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.textColor = [UIColor blackColor];
        textField.text = defaultText;
    }];
    
    [alert addAction:[UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        completionHandler([[alert.textFields lastObject] text]);
    }]];
    
    [self presentViewController:alert animated:YES completion:NULL];
}

添加進(jìn)度條UIProgressView

需要通過KVO監(jiān)聽進(jìn)行實(shí)現(xiàn),初始化頁(yè)面時(shí)添加監(jiān)聽事件

//初始化頁(yè)面時(shí)添加監(jiān)聽事件
[_webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
[_webView addObserver:self forKeyPath:@"loading" options:NSKeyValueObservingOptionNew context:nil];
[_webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:nil];

// 計(jì)算wkWebView進(jìn)度條
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    
    if ([keyPath isEqualToString:@"estimatedProgress"]) {
        NSLog(@"estimatedProgress");
        CGFloat newprogress = [[change objectForKey:NSKeyValueChangeNewKey] doubleValue];
        if (newprogress == 1) {
            self.progressView.hidden = YES;
            [self.progressView setProgress:0 animated:NO];
        }else {
            self.progressView.hidden = NO;
            [self.progressView setProgress:newprogress animated:YES];
        }
    }else if ([keyPath isEqualToString:@"title"]) {
        NSLog(@"title");
        self.title = self.webView.title;
    }else if ([keyPath isEqualToString:@"loading"]) {
        
        NSLog(@"loading");
    }
}

頁(yè)面代碼示例 下載Demo

#import <WebViewController.h>
#import <WebKit/WebKit.h>

@interface WebViewController ()<WKNavigationDelegate, WKUIDelegate>

@property (nonatomic, strong) WKWebView *webView;
@property (strong, nonatomic) UIProgressView *progressView;

@end

@implementation WebViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.requestUrlStr]]];
    // Do any additional setup after loading the view.
}

#pragma mark -----WKNavigationDelegate---------
// 頁(yè)面開始加載時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
    NSLog(@"頁(yè)面開始加載時(shí)調(diào)用");
}
// 當(dāng)內(nèi)容開始返回時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {
    NSLog(@"當(dāng)內(nèi)容開始返回時(shí)調(diào)用");
}
// 頁(yè)面加載完成之后調(diào)用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    NSLog(@"頁(yè)面加載完成之后調(diào)用");
}
// 頁(yè)面加載失敗時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation {
    NSLog(@"頁(yè)面加載失敗時(shí)調(diào)用");
}
// 頁(yè)面導(dǎo)航錯(cuò)誤時(shí)調(diào)用
- (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(nonnull NSError *)error {
    NSLog(@"頁(yè)面導(dǎo)航錯(cuò)誤時(shí)調(diào)用");
}
//頁(yè)面終結(jié)時(shí)調(diào)用
- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView {
    
    NSLog(@"頁(yè)面終結(jié)時(shí)調(diào)用");
}
// 接收到服務(wù)器跳轉(zhuǎn)請(qǐng)求之后調(diào)用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation {
    
    NSLog(@"接收到服務(wù)器跳轉(zhuǎn)請(qǐng)求之后調(diào)用");
}
//證書驗(yàn)證處理 基本上無需添加此代理方法
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(nonnull void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler {

    NSLog(@"證書驗(yàn)證處理");
    // 判斷服務(wù)器采用的驗(yàn)證方法
    if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
        // 如果沒有錯(cuò)誤的情況下 創(chuàng)建一個(gè)憑證挪鹏,并使用證書
        if (challenge.previousFailureCount == 0) {
            NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
            completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
        }else {
             //驗(yàn)證失敗见秽,取消本次驗(yàn)證
            completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
        }
    }else {
        completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
        
    }
}

// 在收到響應(yīng)后,決定是否跳轉(zhuǎn)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
    
    NSLog(@"在收到響應(yīng)后讨盒,決定是否跳轉(zhuǎn)");
    decisionHandler(WKNavigationResponsePolicyAllow);
}
// 在發(fā)送請(qǐng)求之前解取,決定是否跳轉(zhuǎn)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    
    NSLog(@"在發(fā)送請(qǐng)求之前,決定是否跳轉(zhuǎn)");
    decisionHandler(WKNavigationActionPolicyAllow);
}
// 計(jì)算wkWebView進(jìn)度條
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    
    if ([keyPath isEqualToString:@"estimatedProgress"]) {
        NSLog(@"estimatedProgress");
        CGFloat newprogress = [[change objectForKey:NSKeyValueChangeNewKey] doubleValue];
        if (newprogress == 1) {
            self.progressView.hidden = YES;
            [self.progressView setProgress:0 animated:NO];
        }else {
            self.progressView.hidden = NO;
            [self.progressView setProgress:newprogress animated:YES];
        }
    }else if ([keyPath isEqualToString:@"title"]) {
        NSLog(@"title");
        self.title = self.webView.title;
    }else if ([keyPath isEqualToString:@"loading"]) {
        
        NSLog(@"loading");
    }
}

#pragma mark ----WKUIDelegate協(xié)議----

/**
 *  web界面中有彈出警告框時(shí)調(diào)用
 *
 *  @param webView           實(shí)現(xiàn)該代理的webview
 *  @param message           警告框中的內(nèi)容
 *  @param frame             主窗口
 *  @param completionHandler 警告框消失調(diào)用
 */
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(nonnull WKFrameInfo *)frame completionHandler:(nonnull void (^)(void))completionHandler {
    // js 里面的alert實(shí)現(xiàn)返顺,如果不實(shí)現(xiàn)禀苦,網(wǎng)頁(yè)的alert函數(shù)無效
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示"
                                                                             message:message
                                                                      preferredStyle:UIAlertControllerStyleAlert];
    [alertController addAction:[UIAlertAction actionWithTitle:@"確定"
                                                        style:UIAlertActionStyleCancel
                                                      handler:^(UIAlertAction *action) {
                                                          completionHandler();
                                                      }]];
    
    [self presentViewController:alertController animated:YES completion:^{}];
    
}


/**
 web界面中有彈出選擇框

 @param webView 實(shí)現(xiàn)該代理的webview
 @param message 警告框中的內(nèi)容
 @param frame 主窗口
 @param completionHandler 警告框消失調(diào)用 得到選擇結(jié)果
 */
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler {
    //  js 里面的alert實(shí)現(xiàn),如果不實(shí)現(xiàn)遂鹊,網(wǎng)頁(yè)的alert函數(shù)無效  ,
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示"
                                                                             message:message
                                                                      preferredStyle:UIAlertControllerStyleAlert];
    [alertController addAction:[UIAlertAction actionWithTitle:@"確定"
                                                        style:UIAlertActionStyleDefault
                                                      handler:^(UIAlertAction *action) {
                                                          completionHandler(YES);
                                                      }]];
    [alertController addAction:[UIAlertAction actionWithTitle:@"取消"
                                                        style:UIAlertActionStyleCancel
                                                      handler:^(UIAlertAction *action){
                                                          completionHandler(NO);
                                                      }]];
    
    [self presentViewController:alertController animated:YES completion:^{}];
    
}


/**
 web界面中有彈出輸入框

 @param webView 實(shí)現(xiàn)該代理的webview
 @param prompt 輸入框的提示內(nèi)容
 @param defaultText 默認(rèn)的填寫內(nèi)容
 @param frame 主窗口
 @param completionHandler 警告框消失調(diào)用 得到輸入內(nèi)容
 */
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(nonnull WKFrameInfo *)frame completionHandler:(nonnull void (^)(NSString * _Nullable))completionHandler {
    
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:prompt message:nil preferredStyle:UIAlertControllerStyleAlert];
    
    [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.textColor = [UIColor blackColor];
        textField.text = defaultText;
    }];
    
    [alert addAction:[UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        completionHandler([[alert.textFields lastObject] text]);
    }]];
    
    [self presentViewController:alert animated:YES completion:NULL];
}


// 記得取消監(jiān)聽
- (void)dealloc {
    [self.webView removeObserver:self forKeyPath:@"estimatedProgress"];
    [self.webView removeObserver:self forKeyPath:@"loading"];//移除kvo
    [self.webView removeObserver:self forKeyPath:@"title"];
}

/**
 清理緩存
 */
- (void)clearWbCache {
    
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    [[NSURLCache sharedURLCache] setDiskCapacity:0];
    [[NSURLCache sharedURLCache] setMemoryCapacity:0];
}

- (WKWebView *)webView {
    
    if (!_webView) {
        _webView = [[WKWebView alloc] initWithFrame:self.view.frame];
        _webView.navigationDelegate = self;
        _webView.UIDelegate = self;
        [_webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
        [_webView addObserver:self forKeyPath:@"loading" options:NSKeyValueObservingOptionNew context:nil];
        [_webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:nil];
        [self.view insertSubview:_webView belowSubview:self.progressView];
    }
    return _webView;
}

- (UIProgressView *)progressView {
    
    if (!_progressView) {
        
        _progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, 0)];
        self.progressView.tintColor = [UIColor orangeColor];
        self.progressView.trackTintColor = [UIColor clearColor];
        [self.view addSubview:self.progressView];
    }
    return _progressView;
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末振乏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子稿辙,更是在濱河造成了極大的恐慌昆码,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邻储,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡旧噪,警方通過查閱死者的電腦和手機(jī)吨娜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淘钟,“玉大人宦赠,你說我怎么就攤上這事。” “怎么了勾扭?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵毡琉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我妙色,道長(zhǎng)桅滋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任身辨,我火速辦了婚禮丐谋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘煌珊。我一直安慰自己号俐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布定庵。 她就那樣靜靜地躺著吏饿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔬浙。 梳的紋絲不亂的頭發(fā)上找岖,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音敛滋,去河邊找鬼许布。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绎晃,可吹牛的內(nèi)容都是我干的蜜唾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼庶艾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼袁余!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咱揍,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤颖榜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后煤裙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掩完,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年硼砰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了且蓬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡题翰,死狀恐怖恶阴,靈堂內(nèi)的尸體忽然破棺而出诈胜,到底是詐尸還是另有隱情,我是刑警寧澤冯事,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布焦匈,位于F島的核電站,受9級(jí)特大地震影響昵仅,放射性物質(zhì)發(fā)生泄漏缓熟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一岩饼、第九天 我趴在偏房一處隱蔽的房頂上張望荚虚。 院中可真熱鬧,春花似錦籍茧、人聲如沸版述。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渴析。三九已至,卻和暖如春吮龄,著一層夾襖步出監(jiān)牢的瞬間俭茧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工漓帚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留母债,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓尝抖,卻偏偏與公主長(zhǎng)得像毡们,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昧辽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355