Creator iOS接入穿山甲SDK

首先介绍一下

.m文件与.mm文件有什么区别
.m文件 支持C ,OC
.mm文件 支持C,C++,OC

OC 与 TS 互调,例子有很多,比如官方的例子里面就有
TS 调用OC的时候有个点 初学者可能有点懵

//错误示例
//oc中代码  微信分享图片 
+(void) wxShareImage:(NSString*) filepath : (NSString*) title : (const int) target
{

}
//上述写法在OC中并不报错 但是在TS中我们调用OC代码时就会出现参数错误的问题
//TS代码调用
jsb.reflection.callStaticMethod("AppController","wxShareImage:",filePath,title,target);


//正确示例
+(void) wxShareImage:(NSString*) filepath titleStr : (NSString*) title targetInter : (const int) target
{
    
}
//你可能会想什么是titleStr 字符串 targetInter 整型,其实它的可选字符串可以帮助我们阅读和理解方法,尤其是当方法被调用的时候。
//这两个字段就是代表可选字段,用来帮助我们理解的,OC代码记得写上,并与JS代码配合好就可以了
//TS代码调用
jsb.reflection.callStaticMethod("AppController","wxShareImage:titleStr:targetInter:",filePath,title,target);
//无参示范
jsb.reflection.callStaticMethod("AppController","wxShareImage");
//一个参数示范
jsb.reflection.callStaticMethod("AppController","wxShareImage:","参数1");

下面开始接入穿山甲SDK
然后先根据官方文档配置环境
假设出现库引入了,但是代码不出提示,或者报错,可以点击Finder --> 前往 -->按住options 点击出现的隐藏文件资源库 --> Developer -->xcode
清除掉里面的缓存文件夹,关闭xcode,再次打开,如果还是报错,自行检查了

穿山甲SDK初始化

    //在AppController.mm文件中的didFinishLaunchingWithOptions方法中调用
    //穿山甲SDK初始化
    [BUAdSDKManager setAppID:@"应用ID"];
    [BUAdSDKManager setLoglevel:BUAdSDKLogLevelDebug];
    [BUAdSDKManager setIsPaidApp:NO];

激励视频广告

//TTRewardVideoAd.h头文件
@interface TTRewardVideoAd : UIViewController
{
    
}

+(TTRewardVideoAd*) getInstance;
-(void) ShowRewardVideoAd:(NSString *) adId;


@end

//
//  TTRewardVideoAd.mm
//
//
//  Created by Jaymz on 2020/7/18.
//
#import "TTRewardVideoAd.h"
#import <Foundation/Foundation.h>
#import <BUAdSDK/BUAdSDKManager.h>
#import <BUAdSDK/BUNativeExpressRewardedVideoAd.h>
#import <BUAdSDK/BURewardedVideoModel.h>
#import "CallJS.h" 
//CallJS.h 这个是我自己封装的调用JS的类

@interface TTRewardVideoAd()<BUNativeExpressRewardedVideoAdDelegate>
@property (nonatomic, strong) BUNativeExpressRewardedVideoAd *rewardedVideoAd;
@end

static TTRewardVideoAd* m_instance;
@implementation TTRewardVideoAd

    
-(void)viewDidLoad
{
    [super viewDidLoad];
    m_instance = self;
    NSLog(@"viewDidLoad");
}

+(TTRewardVideoAd*) getInstance
{
    if (m_instance == NULL)
    {
        NSLog(@"获取m_instance失败");
    }
    return m_instance;
}

//拉起视频广告
-(void) ShowRewardVideoAd:(NSString *)slotID
{
    slotID = @"xxxxxx";  //广告ID
    NSLog(@"ShowRewardVideoAd Call !!!");
    BURewardedVideoModel *model = [[BURewardedVideoModel alloc] init];
    model.userId = @"jaymz";
    self.rewardedVideoAd = [[BUNativeExpressRewardedVideoAd alloc] initWithSlotID:slotID rewardedVideoModel:model];
    self.rewardedVideoAd.delegate = self;
    [self.rewardedVideoAd loadAdData];
    NSLog(@"ShowRewardVideoAd over!!");
}

//需要获取到显示在最上面的viewController
- (UIViewController *)theTopviewControler{
    //获取根控制器
    UIViewController *rootVC = [[UIApplication sharedApplication].delegate window].rootViewController;
    
    UIViewController *parent = rootVC;
    //遍历 如果是presentViewController
    while ((parent = rootVC.presentedViewController) != nil ) {
        rootVC = parent;
    }
   
    while ([rootVC isKindOfClass:[UINavigationController class]]) {
        rootVC = [(UINavigationController *)rootVC topViewController];
    }
    return rootVC;
}

-(void) showRewardVideoAd
{
    NSLog(@"展示奖励视频广告");
    if(self.rewardedVideoAd.isAdValid)
    {
       [self.rewardedVideoAd showAdFromRootViewController:[self theTopviewControler]];
    }
}

#pragma mark - BUNativeExpressRewardedVideoAdDelegate
//加载广告的时候,delegate 传的是self,广告事件发生后会自动回调回来,我们只需要重新实现这些方法即可
- (void)nativeExpressRewardedVideoAdDidLoad:
(BUNativeExpressRewardedVideoAd *)rewardedVideoAd {
    NSLog(@"%s",__func__);
    [self showRewardVideoAd]; //记载完毕的回调,在这里做显示
}

- (void)nativeExpressRewardedVideoAd:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd didFailWithError:(NSError *_Nullable)error {
    NSLog(@"%s",__func__);
    NSLog(@"error code : %ld , error message : %@",(long)error.code,error.description);
}

- (void)nativeExpressRewardedVideoAdCallback:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd withType:(BUNativeExpressRewardedVideoAdType)nativeExpressVideoType{
    NSLog(@"%s",__func__);
}

- (void)nativeExpressRewardedVideoAdDidDownLoadVideo:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd {
    NSLog(@"%s",__func__);
}

- (void)nativeExpressRewardedVideoAdViewRenderSuccess:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd {
    NSLog(@"%s",__func__);
}

- (void)nativeExpressRewardedVideoAdViewRenderFail:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd error:(NSError *_Nullable)error {
    NSLog(@"%s",__func__);
    NSLog(@"视频广告渲染错误");
    [CallJS callJsEngineCallBack:@"window.AdMrg.VideoAdFail":@"广告播放错误"];
}

- (void)nativeExpressRewardedVideoAdWillVisible:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd {
    NSLog(@"%s",__func__);
}

- (void)nativeExpressRewardedVideoAdDidVisible:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd {
    NSLog(@"%s",__func__);
}

- (void)nativeExpressRewardedVideoAdWillClose:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd {
    NSLog(@"%s",__func__);
}

- (void)nativeExpressRewardedVideoAdDidClose:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd {
    NSLog(@"%s",__func__);
    NSLog(@"看完广告返回 发放奖励");
    [CallJS callJsEngineCallBack:@"window.AdMrg.VideoAdFinish":@""];
}

- (void)nativeExpressRewardedVideoAdDidClick:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd {
    NSLog(@"%s",__func__);
    NSLog(@"加载激励视频错误");
    [CallJS callJsEngineCallBack:@"window.AdMrg.VideoAdFail":@"广告播放错误"];
}

- (void)nativeExpressRewardedVideoAdDidClickSkip:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd {
    NSLog(@"%s",__func__);
}

- (void)nativeExpressRewardedVideoAdDidPlayFinish:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd didFailWithError:(NSError *_Nullable)error {
    NSLog(@"%s",__func__);
}

- (void)nativeExpressRewardedVideoAdServerRewardDidSucceed:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd verify:(BOOL)verify {
    NSLog(@"%s",__func__);
}

- (void)nativeExpressRewardedVideoAdServerRewardDidFail:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd {
    NSLog(@"%s",__func__);
}

- (void)nativeExpressRewardedVideoAdDidCloseOtherController:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd interactionType:(BUInteractionType)interactionType {
    NSString *str = nil;
    if (interactionType == BUInteractionTypePage) {
        str = @"ladingpage";
    } else if (interactionType == BUInteractionTypeVideoAdDetail) {
        str = @"videoDetail";
    } else {
        str = @"appstoreInApp";
    }
    NSLog(@"%s __ %@",__func__,str);
}

@end

添加上述代码后 还需要在AppController.mm的didFinishLaunchingWithOptions方法中添加
(后续所有广告都要这样操作,这里只写这个典型了)

    //记得在初始化SDK之后,_viewController初始化之后
    UIViewController *rewardVideoAd = [[TTRewardVideoAd alloc] init];
    [_viewController.view addSubview:rewardVideoAd.view];

2.插屏广告

//插屏广告(非信息流形式,采用模版渲染)
//
//  TTExpressInsertAd.h
//  
//
//  Created by Jaymz on 2020/7/18.
//

@interface TTExpressInsertAd : UIViewController
{
    
}

+(TTExpressInsertAd*) getInstance;
-(void) ShowExpressInsertAd:(NSString *) adId;
@end

//
//  TTExpressInsertAd.mm
//
//  Created by Jaymz on 2020/7/23.
//

#import <Foundation/Foundation.h>
#import "TTExpressInsertAd.h"
#import <BUAdSDK/BUNativeExpressInterstitialAd.h>


@interface TTExpressInsertAd()<BUNativeExpresInterstitialAdDelegate>
@property (nonatomic, strong) BUNativeExpressInterstitialAd *interstitialAd;
@end

static TTExpressInsertAd* m_instance;

@implementation TTExpressInsertAd

-(void)viewDidLoad
{
    [super viewDidLoad];
    m_instance = self;
    NSLog(@"viewDidLoad");
}

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
}

+(TTExpressInsertAd*) getInstance
{
    return m_instance;
}

-(void) ShowExpressInsertAd:(NSString *) slotID
{
    slotID = @"945341872";//945341872
    NSLog(@"ShowExpressInsertAd!!");
    //NSValue *sizeValue = [self.sizeDict objectForKey:slotID];
    CGSize size = CGSizeMake(300, 450);
    CGFloat width = CGRectGetWidth([UIScreen mainScreen].bounds)-40;
    CGFloat height = width/size.width*size.height;
    NSLog(@"width : %f  height : %f",width,height);
    //#warning 升级的用户请注意,初始化方法去掉了imgSize参数
    self.interstitialAd = [[BUNativeExpressInterstitialAd alloc] initWithSlotID:slotID adSize:CGSizeMake(width, height)];
    self.interstitialAd.delegate = self;
    [self.interstitialAd loadAdData];
}

- (void)showInterstitial
{
    NSLog(@"showIntersitial call %d",self.interstitialAd.adValid);
    if (self.interstitialAd)
    {
        NSLog(@"展示插屏广告 showInterstitial");
        [self.interstitialAd showAdFromRootViewController:[self theTopviewControler]];
    }
}

- (UIViewController *)theTopviewControler{
    //获取根控制器
    UIViewController *rootVC = [[UIApplication sharedApplication].delegate window].rootViewController;
    
    UIViewController *parent = rootVC;
    //遍历 如果是presentViewController
    while ((parent = rootVC.presentedViewController) != nil ) {
        rootVC = parent;
    }
   
    while ([rootVC isKindOfClass:[UINavigationController class]]) {
        rootVC = [(UINavigationController *)rootVC topViewController];
    }
    return rootVC;
}

#pragma ---BUNativeExpresInterstitialAdDelegate
- (void)nativeExpresInterstitialAdDidLoad:(BUNativeExpressInterstitialAd *)interstitialAd {
    NSLog(@"%s",__func__);
}

- (void)nativeExpresInterstitialAd:(BUNativeExpressInterstitialAd *)interstitialAd didFailWithError:(NSError *)error {
    NSLog(@"%s",__func__);
}

- (void)nativeExpresInterstitialAdRenderSuccess:(BUNativeExpressInterstitialAd *)interstitialAd {
    NSLog(@"%s",__func__);
    [self showInterstitial];
    //这个插屏广告不能放在加载完毕中,加载完毕广告组件adValid = 0,问了官方才知道要在这里加,文档上跟demo里都是在加载回调,坑
}

- (void)nativeExpresInterstitialAdRenderFail:(BUNativeExpressInterstitialAd *)interstitialAd error:(NSError *)error {
    NSLog(@"%s",__func__);
    NSLog(@"error code : %ld , error message : %@",(long)error.code,error.description);
}

- (void)nativeExpresInterstitialAdWillVisible:(BUNativeExpressInterstitialAd *)interstitialAd {
    NSLog(@"%s",__func__);
}

- (void)nativeExpresInterstitialAdDidClick:(BUNativeExpressInterstitialAd *)interstitialAd {
    NSLog(@"%s",__func__);
}

- (void)nativeExpresInterstitialAdWillClose:(BUNativeExpressInterstitialAd *)interstitialAd {
    NSLog(@"%s",__func__);
}

- (void)nativeExpresInterstitialAdDidClose:(BUNativeExpressInterstitialAd *)interstitialAd {
    NSLog(@"%s",__func__);
}

- (void)nativeExpresInterstitialAdDidCloseOtherController:(BUNativeExpressInterstitialAd *)interstitialAd interactionType:(BUInteractionType)interactionType {
    NSString *str = nil;
    if (interactionType == BUInteractionTypePage) {
        str = @"ladingpage";
    } else if (interactionType == BUInteractionTypeVideoAdDetail) {
        str = @"videoDetail";
    } else {
        str = @"appstoreInApp";
    }
    NSLog(@"%s __ %@",__func__,str);
}

@end

3.Banner广告

//
//  TTBannerAd.h
//
//  Created by Jaymz on 2020/7/24.


@interface TTBannerAd : UIViewController
{
    
}

+(TTBannerAd*) getInstance;
-(void) ShowBannerAd:(NSString *) adId;
-(void) HideBannerAd;

@end

//
//  TTBannerAd.mm
//
//  Created by Jaymz on 2020/7/24.
//

#import <Foundation/Foundation.h>
#import "TTBannerAd.h"
#import <BUAdSDK/BUNativeExpressBannerView.h>

@interface TTBannerAd()<BUNativeExpressBannerViewDelegate>
@property (nonatomic, strong) BUNativeExpressBannerView *bannerView;
@end

static TTBannerAd* m_instance;

@implementation TTBannerAd

+(TTBannerAd*) getInstance
{
    return m_instance;
}

-(void) viewDidLoad
{
    [super viewDidLoad];
    m_instance = self;
    NSLog(@"BannerViewDidLoad");
}

-(void) ShowBannerAd:(NSString *)slotID
{
    NSLog(@"展示bannerAd");
    slotID = @"945344475";
    [self.bannerView removeFromSuperview];
    CGSize size = CGSizeMake(600,150);
    CGFloat screenWidth = CGRectGetWidth([UIScreen mainScreen].bounds);
    CGFloat bannerHeigh = screenWidth/size.width*size.height;//banner按缩放比例变化
    BOOL isOpenRotate = NO; //是否轮转 如果开启后30s后会自动再次加载banner,不做限制的话,会出现bannerAd已经被关闭,但是又被加载出来
    CGFloat screenHeight = CGRectGetHeight([UIScreen mainScreen].bounds);//获取到屏幕高度
    #warning 升级的用户请注意,初始化方法去掉了imgSize参数
    if (isOpenRotate)
    {
        self.bannerView = [[BUNativeExpressBannerView alloc] initWithSlotID:slotID rootViewController:self adSize:CGSizeMake(screenWidth, bannerHeigh) IsSupportDeepLink:YES interval:30]; //设置间隔30s?
    } else {
        self.bannerView = [[BUNativeExpressBannerView alloc] initWithSlotID:slotID rootViewController:self adSize:CGSizeMake(screenWidth, bannerHeigh) IsSupportDeepLink:YES];
    }
    self.bannerView.frame = CGRectMake(0, screenHeight - bannerHeigh - 10, screenWidth, bannerHeigh);
    //self.bannerView.frame = CGRectMake(0, 10, screenWidth, bannerHeigh);
    self.bannerView.delegate = self;
    [self.bannerView loadAdData];
}

-(void) showBanner
{
    NSLog(@"加载banner完成,开始展示");
    [self.view addSubview:self.bannerView];
}

-(void) HideBannerAd
{
    NSLog(@"关闭BannerAd");
    [self.bannerView removeFromSuperview]; //字面意思像删除操作
}

- (UIViewController *)theTopviewControler{
    //获取根控制器
    UIViewController *rootVC = [[UIApplication sharedApplication].delegate window].rootViewController;
    
    UIViewController *parent = rootVC;
    //遍历 如果是presentViewController
    while ((parent = rootVC.presentedViewController) != nil ) {
        rootVC = parent;
    }
   
    while ([rootVC isKindOfClass:[UINavigationController class]]) {
        rootVC = [(UINavigationController *)rootVC topViewController];
    }
    return rootVC;
}

#pragma BUNativeExpressBannerViewDelegate
- (void)nativeExpressBannerAdViewDidLoad:(BUNativeExpressBannerView *)bannerAdView {
    NSLog(@"%s",__func__);
    [self showBanner];
}

- (void)nativeExpressBannerAdView:(BUNativeExpressBannerView *)bannerAdView didLoadFailWithError:(NSError *)error {
    NSLog(@"%s",__func__);
    NSLog(@"error code : %ld , error message : %@",(long)error.code,error.description);
}

- (void)nativeExpressBannerAdViewRenderSuccess:(BUNativeExpressBannerView *)bannerAdView {
    NSLog(@"%s",__func__);
}

- (void)nativeExpressBannerAdViewRenderFail:(BUNativeExpressBannerView *)bannerAdView error:(NSError *)error {
    NSLog(@"%s",__func__);
}

- (void)nativeExpressBannerAdViewWillBecomVisible:(BUNativeExpressBannerView *)bannerAdView {
    NSLog(@"%s",__func__);
}

- (void)nativeExpressBannerAdViewDidClick:(BUNativeExpressBannerView *)bannerAdView {
    NSLog(@"%s",__func__);
}

- (void)nativeExpressBannerAdView:(BUNativeExpressBannerView *)bannerAdView dislikeWithReason:(NSArray<BUDislikeWords *> *)filterwords {
    NSLog(@"%s",__func__);
    [UIView animateWithDuration:0.25 animations:^{
        bannerAdView.alpha = 0;
    } completion:^(BOOL finished) {
        [bannerAdView removeFromSuperview];
        self.bannerView = nil;
    }];
}

- (void)nativeExpressBannerAdViewDidCloseOtherController:(BUNativeExpressBannerView *)bannerAdView interactionType:(BUInteractionType)interactionType {
    NSString *str = nil;
    if (interactionType == BUInteractionTypePage) {
        str = @"ladingpage";
    } else if (interactionType == BUInteractionTypeVideoAdDetail) {
        str = @"videoDetail";
    } else {
        str = @"appstoreInApp";
    }
    NSLog(@"%s __ %@",__func__,str);
}

@end

4.开屏广告

//
//  TTSplashAd.h
//
//  Created by Jaymz on 2020/7/24.
//

@interface TTSplashAd : UIViewController
{
    
}

+(TTSplashAd*) getInstance;
-(void) ShowSplashAd:(NSString *) adId;
@end

//
//  TTSplashAd.mm
//
//  Created by Jaymz on 2020/7/24.
//

#import <Foundation/Foundation.h>
#import "TTSplashAd.h"
#import <BUAdSDK/BUSplashAdView.h>

@interface TTSplashAd()<BUSplashAdDelegate>
@property (nonatomic, strong) BUSplashAdView *splashView;
@end

static TTSplashAd* m_instance;

@implementation TTSplashAd

+(TTSplashAd*) getInstance
{
    return m_instance;
}

-(void)viewDidLoad
{
    [super viewDidLoad];
    m_instance = self;
    NSLog(@"viewDidLoad");
}

-(void) ShowSplashAd:(NSString *)adId
{
    NSLog(@"调用开屏广告展示");
    CGRect frame=[UIScreen mainScreen].bounds;
    BUSplashAdView *splashView = [[BUSplashAdView alloc] initWithSlotID:adId frame:frame];
    //yyyyyyyyyy是你在穿山甲后台对应的广告位Id
    splashView.delegate = self;
    UIWindow *keyWindow =[UIApplication sharedApplication].windows.firstObject;
    [splashView loadAdData];
    [keyWindow.rootViewController.view addSubview:splashView];
    splashView.rootViewController = keyWindow.rootViewController;
}

#pragma mark --Splash Delegate
- (void)splashAdDidLoad:(BUSplashAdView *)splashAd {
    NSLog(@"splashAdDidLoad");
    NSLog(@"mediaExt-%@",splashAd.mediaExt);
}

- (void)splashAdDidClose:(BUSplashAdView *)splashAd {
    NSLog(@"splashAdView AdDidClose");
    [splashAd removeFromSuperview];
}

- (void)splashAd:(BUSplashAdView *)splashAd didFailWithError:(NSError *)error {
    NSLog(@"splashAdView load data fail");
    [splashAd removeFromSuperview];
    NSLog(@"error code : %ld , error message : %@",(long)error.code,error.description);
}

- (void)splashAdDidCloseOtherController:(BUSplashAdView *)splashAd interactionType:(BUInteractionType)interactionType {
    NSString *str = @"";
    if (interactionType == BUInteractionTypePage) {
        str = @"ladingpage";
    } else if (interactionType == BUInteractionTypeVideoAdDetail) {
        str = @"videoDetail";
    } else {
        str = @"appstoreInApp";
    }
    //弹窗提示
//    #pragma clang diagnostic push
//    #pragma clang diagnostic ignored"-Wdeprecated-declarations"
//        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:str message:[NSString stringWithFormat:@"%s",__func__] delegate:self cancelButtonTitle:nil otherButtonTitles:@"ok", nil];
//        [alert show];
//    #pragma clang diagnostic pop
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

开屏广告需要在AppController.mm的didFinishLaunchingWithOptions函数中,app->start(); 之前调用

    UIViewController *splashAd = [[TTSplashAd alloc] init];
    [_viewController.view addSubview:splashAd.view];
    [[TTSplashAd getInstance] ShowSplashAd:@"开屏广告ID"]; //展示开屏广告
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335