IAPHelper集成文檔

當(dāng)前版本功能支持的功能

  • 內(nèi)購(gòu)商品列表請(qǐng)求-基于Block回調(diào)風(fēng)格返回商品請(qǐng)求結(jié)果
  • 內(nèi)購(gòu)商品預(yù)加載- 應(yīng)用啟動(dòng)后自動(dòng)向蘋(píng)果內(nèi)購(gòu)服務(wù)器請(qǐng)求內(nèi)購(gòu)商品列表
  • 支持自動(dòng)訂閱
  • 支持非消耗型內(nèi)購(gòu)商品購(gòu)買 如移除廣告脂信,功能解鎖等
  • 支持本地內(nèi)購(gòu)訂單持久化
  • 支持本地會(huì)員有效期查詢
  • 支持已購(gòu)商品恢復(fù)購(gòu)買
  • 支持不同權(quán)益檔次會(huì)員蛉幸,不同檔次權(quán)益有效期互不干擾
    (如需實(shí)現(xiàn)高級(jí)會(huì)員過(guò)期后才生效普通會(huì)員,可根據(jù)各檔次會(huì)員有效期自行重新疊加計(jì)算有效期)

當(dāng)前版本暫不支持的功能

  • 新用戶折扣優(yōu)惠購(gòu)買
  • 老用戶折扣優(yōu)惠購(gòu)買

集成步驟及模塊初始化

1.將IAHelper工程拖入到想要集成內(nèi)購(gòu)模塊的 Workspace 中


image.png

2.將 IAPHelper.framework 添加到項(xiàng)目工程中

image.png
  1. 在需要用到 IAPHeper 模塊的地方跌造,導(dǎo)入 IAPHelper 模塊
#import <IAPHelper/IAPHelper.h>

4.在工程的AppDelegate的初始化方法中 設(shè)置程序支持的內(nèi)購(gòu)項(xiàng)目鼻由。
注意:無(wú)論內(nèi)購(gòu)項(xiàng)是否在售賣狀態(tài)省骂,只要曾經(jīng)有用戶購(gòu)買過(guò)惊橱,均需添加止吐,因?yàn)槠鋵?huì)決定用戶的相關(guān)權(quán)益有效期計(jì)算

+(void)initialize{
    //NOTE: 商品信息錄入必須在內(nèi)購(gòu)模塊啟動(dòng)前
    //自動(dòng)訂閱組
    IARenewalProductInfo * autoWeekProductInfo = [[IARenewalProductInfo alloc] initWithProductId:Group_First_Auto_Renew_First_Level periodType:ProductPeriodPerWeek probabtionPeriodType:ProductProbationPeriodTypeNone groupId:kVIPGroupId isAutoRenewType:YES];
    
    IARenewalProductInfo * autoMonthProductInfo = [[IARenewalProductInfo alloc] initWithProductId:Group_First_Auto_Renew_Second_Level periodType:ProductPeriodPerMonth probabtionPeriodType:ProductProbationPeriodTypeNone groupId:kVIPGroupId isAutoRenewType:YES];
    
    IARenewalProductInfo * autoYearProductInfo = [[IARenewalProductInfo alloc] initWithProductId:Group_First_Auto_Renew_Third_Level periodType:ProductPeriodPerYear probabtionPeriodType:ProductProbationPeriodTypeNone groupId:kVIPGroupId isAutoRenewType:YES];
    
    //訂閱組A
    IARenewalProductInfo * monthProductInfoA = [[IARenewalProductInfo alloc] initWithProductId:Program_A_First_Level_Original periodType:ProductPeriodPerMonth probabtionPeriodType:ProductProbationPeriodTypeNone groupId:kVIPGroupId isAutoRenewType:NO];
    
    IARenewalProductInfo * yearProductInfoA = [[IARenewalProductInfo alloc] initWithProductId:Program_A_Second_Level_Original periodType:ProductPeriodPerYear probabtionPeriodType:ProductProbationPeriodTypeNone groupId:kVIPGroupId isAutoRenewType:NO];
    
    IARenewalProductInfo * foreverProductInfoA = [[IARenewalProductInfo alloc] initWithProductId:Program_A_Third_Level_Original periodType:ProductPeriodForever probabtionPeriodType:ProductProbationPeriodTypeNone groupId:kVIPGroupId isAutoRenewType:NO];
    
    //訂閱組B
    IARenewalProductInfo * monthProductInfoB = [[IARenewalProductInfo alloc] initWithProductId:Program_B_First_Level_Original periodType:ProductPeriodPerMonth probabtionPeriodType:ProductProbationPeriodTypeNone groupId:kSVIPGroupId isAutoRenewType:NO];
    
    IARenewalProductInfo * yearProductInfoB = [[IARenewalProductInfo alloc] initWithProductId:Program_B_Second_Level_Original periodType:ProductPeriodPerYear probabtionPeriodType:ProductProbationPeriodTypeNone groupId:kSVIPGroupId isAutoRenewType:NO];
    
    IARenewalProductInfo * foreverProductInfoB= [[IARenewalProductInfo alloc] initWithProductId:Program_B_Third_Level_Original periodType:ProductPeriodForever probabtionPeriodType:ProductProbationPeriodTypeNone groupId:kSVIPGroupId isAutoRenewType:NO];
    
    //配置會(huì)員權(quán)益等計(jì)時(shí)型商品內(nèi)購(gòu)項(xiàng)宝踪。錄入黃金月度會(huì)員,黃金年度會(huì)員碍扔,周會(huì)員瘩燥,永久會(huì)員等
    [[IAPaymentCommon shareInstance] configRenewalProductInfosFromDeveloper:@[
        autoWeekProductInfo,autoMonthProductInfo,autoYearProductInfo,
        monthProductInfoA,yearProductInfoA,foreverProductInfoA,
        monthProductInfoB,yearProductInfoB,foreverProductInfoB
    ]];
    
    //配置普通非消耗型內(nèi)購(gòu)項(xiàng)。例如:移除廣告內(nèi)購(gòu)不同,解鎖關(guān)卡內(nèi)購(gòu)
//    IABaseProductInfo * removeAdsProduct = [[IABaseProductInfo alloc] initWithProductId:@"removeAds"];
//    IABaseProductInfo * unlockMoreFuncProduct = [[IABaseProductInfo alloc] initWithProductId:@"unlockMoreFuncs"];
//    [[IAPaymentCommon shareInstance] configNormalProductInfosFromDeveloper:@[removeAdsProduct,unlockMoreFuncProduct]];
}
  1. 在應(yīng)用啟動(dòng)時(shí)厉膀,調(diào)用 IAPaymentCommon 的 load 方法來(lái)完成內(nèi)購(gòu)模塊加載
    注意:需要傳入的參數(shù)為該Apple開(kāi)發(fā)者賬號(hào)下的共享密鑰,該密鑰將影響本地購(gòu)買憑據(jù)驗(yàn)證二拐,進(jìn)而影響相關(guān)權(quán)益有效期計(jì)算
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    //內(nèi)購(gòu)?fù)ㄓ媚K加載
    [[IAPaymentCommon shareInstance] load:IAPSecretKey];
    
//    未正常完成的交易
//    NSArray * unfinishedTransactions = [[IAPaymentCommon shareInstance] getUnFinishedPaymentTransactions];
//    if (unfinishedTransactions.count) {
//
//    }
    
    return YES;
}

商品請(qǐng)求服鹅、購(gòu)買、恢復(fù)購(gòu)買

商品請(qǐng)求

商品請(qǐng)求是后臺(tái)靜默執(zhí)行的百新,不包含UI顯示(系統(tǒng)彈出的除外),故為了交互友好企软,請(qǐng)?jiān)诰唧w業(yè)務(wù)中添加相關(guān)等待提示框,狀態(tài)提示框UI顯示

[[IAPaymentCommon shareInstance] requestAllPreloadProductsWithCompletion:^(NSArray<IABaseProductInfo *> * _Nullable productArray, IAProductRequestStatus status, NSError * _Nullable error) {
        if (!error && productArray) {
            self.allProductInfos = [NSMutableArray arrayWithArray:productArray];
        }
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.refreshControl endRefreshing];
            [self.indicatorView stopAnimating];
            self.indicatorView.hidden = YES;
            [self.tableView reloadData];
        });
    }];

另一種商品請(qǐng)求方式吟孙,可精確請(qǐng)求指定商品列表

[[IAPaymentCommon shareInstance] requestMultipleProductIds:[IAPaymentCommon shareInstance].allProductIds complateHandler:^(NSArray<IABaseProductInfo *> * _Nullable productArray, IAProductRequestStatus status, NSError * _Nullable error) {
        //code here to refresh UI
    }];

商品購(gòu)買

商品購(gòu)買是后臺(tái)靜默執(zhí)行的澜倦,不包含UI顯示(系統(tǒng)彈出的除外),故為了交互友好,請(qǐng)?jiān)诰唧w業(yè)務(wù)中添加相關(guān)等待提示框杰妓,狀態(tài)提示框UI顯示

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.label.text = NSLocalizedString(@"購(gòu)買中...", @"HUD loading title");
    
    IABaseProductInfo * productInfo = self.allProductInfos[indexPath.row];
    [[IAPaymentCommon shareInstance] purchaseProductByProductId:productInfo.productId purchasing:^(NSString * _Nonnull productId, IAPurchasingState purchasingState, SKPaymentTransaction * _Nonnull transaction) {
        
        dispatch_async(dispatch_get_main_queue(), ^{
            if (purchasingState == IAPurchasingStateOrderGenerating) {
                hud.label.text = @"正在生成支付訂單藻治,請(qǐng)稍后...";
            }
            else{
                hud.label.text = @"訂單已生成,正在獲取訂單信息...";
            }
        });
        
    } purchaseComplete:^(NSString * _Nonnull productId, SKPaymentTransaction * _Nullable paymentTransaction, BOOL isSuccess, NSError * _Nullable error) {
        
        dispatch_async(dispatch_get_main_queue(), ^{
            
            [hud hideAnimated:YES];
            
            NSString * message = isSuccess ? @"購(gòu)買成功巷挥!" : @"購(gòu)買失斪选!";
            
            MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];

            // Set the custom view mode to show any view.
            hud.mode = MBProgressHUDModeCustomView;
            // Set an image view with a checkmark.
            UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
            hud.customView = [[UIImageView alloc] initWithImage:image];
            // Looks a bit nicer if we make it square.
            hud.square = YES;
            // Optional label text.
            hud.label.text = message;

            [hud hideAnimated:YES afterDelay:2.f];
            
            if (isSuccess) {
                [self updateExpireDateInfo];
            }
        });
    } purchaseCancelled:^(NSString * _Nonnull productId, NSError * _Nullable error) {
        
        [hud hideAnimated:YES];
        
        NSString * message = @"購(gòu)買已取消";
        
        MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];

        // Set the custom view mode to show any view.
        hud.mode = MBProgressHUDModeCustomView;
        // Set an image view with a checkmark.
        UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
        hud.customView = [[UIImageView alloc] initWithImage:image];
        // Looks a bit nicer if we make it square.
        hud.square = YES;
        // Optional label text.
        hud.label.text = message;

        [hud hideAnimated:YES afterDelay:2.f];
    }];
恢復(fù)購(gòu)買

商品恢復(fù)購(gòu)買是后臺(tái)靜默執(zhí)行的倍宾,不包含UI顯示(系統(tǒng)彈出的除外),故為了交互友好雏节,請(qǐng)?jiān)诰唧w業(yè)務(wù)中添加相關(guān)等待提示框,狀態(tài)提示框UI顯示

恢復(fù)購(gòu)買提供有兩個(gè) api 來(lái)實(shí)現(xiàn)高职,分別是

調(diào)用蘋(píng)果提供的恢復(fù)內(nèi)購(gòu)Api實(shí)現(xiàn)

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.label.text = NSLocalizedString(@"恢復(fù)購(gòu)買中钩乍,請(qǐng)稍后...", @"HUD loading title");
    
    [[IAPaymentCommon shareInstance] restorePurchaseWithComplete:^(NSArray * _Nonnull productIds, BOOL isSuccess, NSError * _Nullable error) {
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [hud hideAnimated:YES];
        });
        [self onRestoreComplete:productIds restoreState:isSuccess error:error];
    }];

調(diào)用蘋(píng)果提供的刷新購(gòu)買憑據(jù)Api實(shí)現(xiàn)

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.label.text = NSLocalizedString(@"恢復(fù)購(gòu)買中,請(qǐng)稍后...", @"HUD loading title");
    
    [[IAPaymentCommon shareInstance] refreshReceiptWithComplete:^(NSArray * _Nullable productIds, BOOL isSuccess, NSError * _Nullable error) {
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [hud hideAnimated:YES];
        });
        [self onRestoreComplete:productIds restoreState:isSuccess error:error];
    }];
//恢復(fù)購(gòu)買完成
- (void)onRestoreComplete:(NSArray *)productIds restoreState:(BOOL)isSuccess error:(NSError *)error{
    
    dispatch_async(dispatch_get_main_queue(), ^{
        
        NSString * message = isSuccess ? @"恢復(fù)購(gòu)買成功怔锌!" : @"恢復(fù)購(gòu)買失斄却狻变过!";
        
        MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];

        // Set the custom view mode to show any view.
        hud.mode = MBProgressHUDModeCustomView;
        // Set an image view with a checkmark.
        UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
        hud.customView = [[UIImageView alloc] initWithImage:image];
        // Looks a bit nicer if we make it square.
        hud.square = YES;
        // Optional label text.
        hud.label.text = message;

        [hud hideAnimated:YES afterDelay:2.f];
        
        if (isSuccess) {
            [self updateExpireDateInfo];
        }
    });
}

目前并未發(fā)現(xiàn)兩種方式有質(zhì)的區(qū)別

刷新會(huì)員有效期

刷新普通會(huì)員有效期

//更新VIP有效期
- (void)updateVIPExpireInfo{
    
    //普通vip
    ProductGroupInfo * vipProductGroupInfo =  [[IAPaymentCommon shareInstance] getProductGroupWithGroupId:kVIPGroupId];
    
    NSTimeInterval timeInterval = vipProductGroupInfo.expireDateMs;
    NSDate * expireDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyy-MM-dd";
    NSString * expireDateString = [formatter stringFromDate:expireDate];
    
    NSDate * relativetime = [[IATimeManager defaultManager] getRelativetime];//獲取當(dāng)前時(shí)間
    NSTimeInterval relativeTimeinterval = [relativetime timeIntervalSince1970];
    
    self.vipExpireDateLabel.textColor = [UIColor systemBlueColor];
    //當(dāng)前是否有已購(gòu)買且在有效期內(nèi)的自動(dòng)訂閱內(nèi)購(gòu)項(xiàng)
    if (vipProductGroupInfo.hasActiveAutoRenewOrder) {
        self.vipExpireDateLabel.text = @"VIP到期時(shí)間:自動(dòng)續(xù)訂中";
    }else{
        if (relativeTimeinterval > timeInterval) {
            self.vipExpireDateLabel.textColor = [UIColor systemRedColor];
            self.vipExpireDateLabel.text = [NSString stringWithFormat:@"VIP會(huì)員已于%@過(guò)期",expireDateString];
            if (timeInterval == 0) {
                self.vipExpireDateLabel.text = @"未開(kāi)通";
            }
        }
        else{
            if (timeInterval >= LONG_MAX) {
                self.vipExpireDateLabel.textColor = [UIColor systemPinkColor];
                self.vipExpireDateLabel.text = @"VIP到期時(shí)間:永不過(guò)期";
            }else{
                self.vipExpireDateLabel.text = [NSString stringWithFormat:@"VIP會(huì)員到期時(shí)間:%@",expireDateString];
            }
        }
    }
}

刷新超級(jí)會(huì)員有效期(沒(méi)有可不處理)

//更新SVIP有效期
- (void)updatesSVIPExpireInfo{
    
    //超級(jí)vip
    ProductGroupInfo * svipProductGroupInfo =  [[IAPaymentCommon shareInstance] getProductGroupWithGroupId:kSVIPGroupId];
    
    NSTimeInterval timeInterval = svipProductGroupInfo.expireDateMs;
    NSDate * expireDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyy-MM-dd";
    NSString * expireDateString = [formatter stringFromDate:expireDate];
    
    NSDate * relativetime = [[IATimeManager defaultManager] getRelativetime];//獲取當(dāng)前時(shí)間
    NSTimeInterval relativeTimeinterval = [relativetime timeIntervalSince1970];
    
    self.svipExpireDateLabel.textColor = [UIColor systemBlueColor];
    //當(dāng)前是否有已購(gòu)買且在有效期內(nèi)的自動(dòng)訂閱內(nèi)購(gòu)項(xiàng)
    if (svipProductGroupInfo.hasActiveAutoRenewOrder) {
        self.svipExpireDateLabel.text = @"SVIP到期時(shí)間:自動(dòng)續(xù)訂中";
    }else{
        if (relativeTimeinterval > timeInterval) {
            self.svipExpireDateLabel.textColor = [UIColor systemRedColor];
            self.svipExpireDateLabel.text = [NSString stringWithFormat:@"SVIP會(huì)員已于%@過(guò)期",expireDateString];
            if (timeInterval == 0) {
                self.svipExpireDateLabel.text = @"未開(kāi)通";
            }
        }
        else{
            if (timeInterval >= LONG_MAX) {
                self.svipExpireDateLabel.textColor = [UIColor systemPinkColor];
                self.svipExpireDateLabel.text = @"SVIP到期時(shí)間:永不過(guò)期";
            }else{
                self.svipExpireDateLabel.text = [NSString stringWithFormat:@"SVIP會(huì)員到期時(shí)間:%@",expireDateString];
            }
        }
    }
}
憑據(jù)驗(yàn)證成功通知

因?yàn)楸緝?nèi)購(gòu)模塊中權(quán)益有效期計(jì)算是基于本地購(gòu)買憑據(jù)驗(yàn)證得來(lái)的,所以最真實(shí)的有效期信息應(yīng)該來(lái)源于憑據(jù)驗(yàn)證涝涤,故建議在需要展示vip或記錄vip有效期信息的地方注冊(cè)本地憑據(jù)驗(yàn)證成功的通知媚狰, 并于業(yè)務(wù)中刷新權(quán)益有效期信息

//已購(gòu)訂單憑據(jù)驗(yàn)證完成通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onReceiptValidCompleteNotification:) name:kReceiptValidCompleteNotification object:nil];
/* 內(nèi)購(gòu)商品憑據(jù)本地校驗(yàn)完成通知 */
- (void)onReceiptValidCompleteNotification:(NSNotification *)notification{
    [self updateExpireDateInfo];;
}
商品請(qǐng)求成功通知
//商品請(qǐng)求完成通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onProductsRequestCompleteNotification:) name:kProductInfosRequestSucceedNotification object:nil];
來(lái)自AppStore商品購(gòu)買通知
//來(lái)自AppStore商品購(gòu)買通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppStorePaymentNotification:) name:kPaymentFromAppStoreShouldHandleNotification object:nil];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市阔拳,隨后出現(xiàn)的幾起案子崭孤,更是在濱河造成了極大的恐慌,老刑警劉巖糊肠,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辨宠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡罪针,警方通過(guò)查閱死者的電腦和手機(jī)彭羹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)黄伊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)泪酱,“玉大人,你說(shuō)我怎么就攤上這事还最∧狗В” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵拓轻,是天一觀的道長(zhǎng)斯撮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)扶叉,這世上最難降的妖魔是什么勿锅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮枣氧,結(jié)果婚禮上溢十,老公的妹妹穿的比我還像新娘。我一直安慰自己达吞,他們只是感情好张弛,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著酪劫,像睡著了一般吞鸭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上覆糟,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天刻剥,我揣著相機(jī)與錄音,去河邊找鬼滩字。 笑死造虏,一個(gè)胖子當(dāng)著我的面吹牛盯滚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酗电,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼魄藕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了撵术?” 一聲冷哼從身側(cè)響起背率,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嫩与,沒(méi)想到半個(gè)月后寝姿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡划滋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年饵筑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片处坪。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡根资,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出同窘,到底是詐尸還是另有隱情玄帕,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布想邦,位于F島的核電站裤纹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏丧没。R本人自食惡果不足惜鹰椒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呕童。 院中可真熱鬧漆际,春花似錦、人聲如沸拉庵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钞支。三九已至茫蛹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烁挟,已是汗流浹背婴洼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撼嗓,地道東北人柬采。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓欢唾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親粉捻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子礁遣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 通過(guò)撰寫(xiě)產(chǎn)品需求文檔(PRD),能夠鍛煉到基本的產(chǎn)品能力肩刃,同時(shí)也是提高axure操作能力的重要途徑祟霍。筆者將以網(wǎng)易嚴(yán)...
    銀海系閱讀 3,748評(píng)論 4 31
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒盈包。表情可以傳達(dá)很多信息沸呐。高興了當(dāng)然就笑了,難過(guò)就哭了呢燥。兩者是相互影響密不可...
    Persistenc_6aea閱讀 124,202評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者崭添,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn)叛氨,也就放棄了無(wú)數(shù)的可能呼渣。 ...
    yichen大刀閱讀 6,033評(píng)論 0 4