極光集成華為廠商通道

JPush SDK 華為通道集成指南

概述

在國(guó)內(nèi) Android 生態(tài)中橙弱,推送通道都是由終端與云端之間的長(zhǎng)鏈接來(lái)維持使鹅,嚴(yán)重依賴于應(yīng)用進(jìn)程的存活狀態(tài)扒秸。如今一些手機(jī)廠家會(huì)在自家 rom 中做系統(tǒng)級(jí)別的推送通道盐捷,再由系統(tǒng)分發(fā)給各個(gè) app孽江,以此提高在自家 rom 上的推送送達(dá)率门坷。

JPush SDK 為了盡可能提高開(kāi)發(fā)者在各類 rom 上的推送送達(dá)率宣鄙,對(duì)使用 EMUI 的設(shè)備推送,自動(dòng)切換到華為通道默蚌。同時(shí)冻晤,為了保證 SDK 的易用性,原本 JPush 的所有接口調(diào)用邏輯都不用修改,JPush 會(huì)對(duì)自身支持的功能做兼容.只需在manifest中配置上華為HMS SDK 必須的配置組件即可.

功能描述

  • JPush 初始化的時(shí)候可選擇是否初始化 HMS Push 通道绸吸。

  • 在 EMUI 設(shè)備上 JPush 通道與 華為 通道共存.

  • 華為 通道初始化后支持 tag/alias這些 JPush 原有的功能,其它的 JPush 未支持的功能目前暫時(shí)還不可用.

  • 增加兼容華為HMS SDK初始化失敗處理錯(cuò)誤的接口.

:極光根據(jù) EMUI 系統(tǒng)版本間差異鼻弧,現(xiàn)采取的方案是 EMUI 4.1 及以上版本,使用 HMS 服務(wù)锦茁,通知走 HMS 通道攘轩;對(duì)于 EMUI 4.1 以下版本還是走極光通道。

配置集成步驟

主要步驟為:

添加 Huawei SDK 到項(xiàng)目中

  • 拷貝third-push/huawei/libs中的插件包(jpush-android-plugin-huawei-v3.x.x.jar)到工程libs目錄下

    • 注意:也可使用jcenter集成方式码俩,無(wú)需拷貝jpush-android-plugin-huawei-v3.x.x.jar文件度帮,也無(wú)需配置cn.jpush.android.service.PluginHuaweiPlatformsService組件
    • 示例:implementation 'cn.jiguang.sdk.plugin:huawei:3.x.x'
  • Huawei 上創(chuàng)建和 JPush 上同包名的待發(fā)布應(yīng)用,創(chuàng)建完成后下載該應(yīng)用的 agconnect-services.json 配置文件并添加到應(yīng)用的 module 目錄下。

  • 在根級(jí) build.gradle 中添加規(guī)則稿存,以納入 HMS 服務(wù)插件 和 華為 的 Maven 代碼庫(kù),可根據(jù)華為開(kāi)發(fā)者聯(lián)盟發(fā)布的版本更新選擇最新版本:


    buildscript{
        repositories {
            google()
            jcenter()
            maven {url 'http://developer.huawei.com/repo/'}
        }
    }
   buildscript {
       dependencies {
           classpath 'com.huawei.agconnect:agcp:1.4.1.300'
       }
   }
  
    allprojects {
        repositories {
            google()
            jcenter()
            maven {url 'http://developer.huawei.com/repo/'}
        }
    }

在應(yīng)用 module 的 build.gradle 文件底部添加 apply plugin 代碼行够傍,以啟用 gradle 插件:

    // ADD THIS AT THE TOP
   apply plugin: 'com.huawei.agconnect'

在應(yīng)用 module 的 gradle 中 dependencies 節(jié)點(diǎn)添加如下代碼,可根據(jù) 華為 發(fā)布的版本更新選擇最新版本:

     dependencies {
       implementation 'com.huawei.hms:push:5.0.2.300'
       //引入極光-華為插件挠铲,如果采用此配置冕屯,無(wú)需拷貝jpush-android-plugin-huawei-v3.x.x.jar文件,也無(wú)需配置cn.jpush.android.service.PluginHuaweiPlatformsService組件
       implementation 'cn.jiguang.sdk.plugin:huawei:3.x.x'
              
    }

注1:極光集成華為通道在 JPush Android SDK 3.0.5 添加拂苹,對(duì)應(yīng)測(cè)試的華為HMS SDK 版本為:HMS-SDK-2.4.0.300.aar

注2:JPush Android SDK 3.0.9 適配HMS SDK的升級(jí),對(duì)應(yīng)測(cè)試的華為HMS SDK 版本為:HMSSdk-base-2.5.2.300.aar,HMSSdk-push-2.5.2.300.aar

注3:JPush Android SDK 3.1.2 適配HMS SDK的升級(jí),對(duì)應(yīng)測(cè)試的華為HMS SDK 版本為:HMSSdk-base-2.5.3.302.aar,HMSSdk-push-2.5.3.302.aar

注4:從HMS_SDK_2.6.0.301版本開(kāi)始支持jar包+res資源集成安聘,JPush Android SDK 3.1.5對(duì)應(yīng)測(cè)試的華為HMS SDK 版本為:HMS_SDK_2.6.0.301.jar

注5:JPush Android SDK 3.2.0 更新華為HMS SDK版本為:hmssdk_2.6.3.301.jar

注6:JPush Android SDK 3.3.6 更新華為HMS SDK版本為:hmssdk_2.6.3.306.jar

注7:JPush Android SDK 3.5.4 更新華為HMS SDK版本為:3.0.3.301

注7:JPush Android SDK 3.6.0 更新華為HMS SDK版本為:4.0.2.300

注8:JPush Android SDK 3.9.0 更新華為HMS SDK版本為:5.0.2.300

注9 添加 華為 Push SDK 的官方文檔

2. 配置接收 HMS 消息的服務(wù)

     <service
                android:name="cn.jpush.android.service.PluginHuaweiPlatformsService"
                android:exported="false">
                <intent-filter>
                    <action android:name="com.huawei.push.action.MESSAGING_EVENT" />
                </intent-filter>
            </service

對(duì)于同一個(gè)應(yīng)用集成了多個(gè)推送SDK,且其他SDK也使用了華為通道的用戶:
可以將這個(gè)極光內(nèi)置的 Service瓢棒,換成自己定義的 Service浴韭。
這個(gè) Service 必須繼承華為的 com.huawei.hms.push.HmsMessageService
且在每個(gè)回調(diào)方法,都回調(diào)給極光的 PluginHuaweiPlatformsService脯宿。并且需要通過(guò)setContext方法念颈,
將Context對(duì)傳遞過(guò)去(since jpush3.9.0)。類似于這樣:

public class MyHWPushService extends HmsMessageService {

    final PluginHuaweiPlatformsService service = new PluginHuaweiPlatformsService();

    @Override
    public void onNewToken(String s) {
        service.setContext(context);
        service.onNewToken(s);
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        service.setContext(context);
        service.onMessageReceived(remoteMessage);
    }

    @Override
    public void onMessageSent(String s) {
        service.onMessageSent(s);
    }

    @Override
    public void onSendError(String s, Exception e) {
        service.onSendError(s,e);
    }

    @Override
    public void onDeletedMessages() {
        service.onDeletedMessages();
    }
}


3. 在build.gradle中配置在華為后臺(tái)添加的指紋證書(shū)對(duì)應(yīng)的簽名

:HMS 服務(wù)必須要求 app 簽名才能注冊(cè)成功连霉。指紋證書(shū)是在終端采用keytool -list -v -keystore keystorefileName 獲取偶對(duì)應(yīng)的指紋證書(shū).

    signingConfigs {
        release {
            storeFile file("release.keystore")//簽名文件的path
            storePassword "123456"
            keyAlias "android.keystore"
            keyPassword "123456"
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug{
            minifyEnabled false
            signingConfig signingConfigs.release
        }
    }

HMS SDK的編譯混淆問(wèn)題

如果使用了 proguard榴芳,需要在配置文件中加入,可以防止一個(gè)誤報(bào)的 warning 導(dǎo)致無(wú)法成功編譯嗡靡,

    -ignorewarning 
    -keepattributes *Annotation* 
    -keepattributes Exceptions 
    -keepattributes InnerClasses 
    -keepattributes Signature 
    -keepattributes SourceFile,LineNumberTable 
    -keep class com.hianalytics.android.**{*;} 
    -keep class com.huawei.updatesdk.**{*;} 
    -keep class com.huawei.hms.**{*;}

如果開(kāi)發(fā)者使用了AndResGuard,需要在混淆配置文件中加入AndResGuard白名單窟感。

    "R.string.hms*",
    "R.string.connect_server_fail_prompt_toast",
    "R.string.getting_message_fail_prompt_toast",
    "R.string.no_available_network_prompt_toast",
    "R.string.third_app_*",
    "R.string.upsdk_*",
    "R.layout.hms*",
    "R.layout.upsdk_*",
    "R.drawable.upsdk*",
    "R.color.upsdk*",
    "R.dimen.upsdk*",
    "R.style.upsdk*",
    "R.string.agc*"
    

點(diǎn)擊通知跳轉(zhuǎn) Activity

功能說(shuō)明

支持的版本

此功能從 JPush Android SDK 3.0.9 開(kāi)始支持

華為手機(jī)通知跳轉(zhuǎn)的定義

華為 push 允許開(kāi)發(fā)者在推送通知的時(shí)候傳入自定義的 intent uri 字符串讨彼,當(dāng)用戶點(diǎn)擊了該通知,系統(tǒng)會(huì)根據(jù) uri 的值過(guò)濾出匹配的 Activity 柿祈,并打開(kāi) Activity哈误,達(dá)到跳轉(zhuǎn)的目的。

使用方式

Push API 推送說(shuō)明

在 push api 的 payload 中的 "notification" 的 "android" 節(jié)點(diǎn)下添加以下字段:

<div class="table-d" align="center" >
<table border="1" width = "100%">
<tr bgcolor="#D3D3D3" >
<th >關(guān)鍵字</th>
<th >類型</th>
<th >示例</th>
<th >說(shuō)明</th>
</tr>
<tr >
<td>uri_activity</td>
<td>string</td>
<td>"com.example.jpushdemo.OpenClickActivity"</td>
<td>該字段用于指定開(kāi)發(fā)者想要打開(kāi)的 activity躏嚎,值為activity 節(jié)點(diǎn)的 “android:name ” 屬性值蜜自。</td>
</tr>
</table>
</div>

示例:

demo manifest配置:
<activity android:name="com.example.jpushdemo.OpenClickActivity"
      android:exported="true">
      <intent-filter>
           <action android:name="android.intent.action.VIEW"/>
           <category android:name="android.intent.category.DEFAULT"/>
      </intent-filter>
</activity>

請(qǐng)求json如下:
{
    "platform": [
        "android"
    ],
    "audience": "all",
    "notification": {
        "android": {
            "alert": "在線alert003",
            "title": "在線title003",
            "uri_activity": "com.example.jpushdemo.OpenClickActivity",
        }
    },
    "message": {
        "msg_content": "自定義消息內(nèi)容003"
    }
}

SDK 端配置

1.AndroidManifest.xml中配置點(diǎn)擊通知要打開(kāi)的 activity
<activity android:name="您配置的activity"
      android:exported="true">
      <intent-filter>
           <action android:name="android.intent.action.VIEW"/>
           <category android:name="android.intent.category.DEFAULT"/>
      </intent-filter>
</activity>

注: android:exported 屬性必須設(shè)置為 true,并增加示例中的 intent-filter卢佣,否則會(huì)導(dǎo)致無(wú)法收到通知袁辈。

2.獲取通知相關(guān)信息

目前啟動(dòng)配置的 activity 都是使用 Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK 方式啟動(dòng),只需要在您配置的 activity 中的onCreate方法中進(jìn)行處理珠漂,獲取通知信息晚缩。

通過(guò) getIntent().getData() 獲取到Intent 數(shù)據(jù)。獲取到的數(shù)據(jù)是 JSON 字符串媳危,通過(guò)解析可以獲得通知相關(guān)內(nèi)容荞彼。

JSON 示例如下:

{
    "msg_id":"123456",
    "n_content":"this is content",
    "n_extras":{"key1":"value1","key2":"value2"},
    "n_title":"this is title",
    "rom_type":0
}

JSON 內(nèi)容字段說(shuō)明:

字段 取值類型 描述
msg_id String 通過(guò)此key獲取到通知的msgid
n_title String 通過(guò)此key獲取到通知標(biāo)題
n_content String 通過(guò)此key獲取到通知內(nèi)容
n_extras String 通過(guò)此key獲取到通知附加字段
rom_type byte 通過(guò)此key獲取到下發(fā)通知的平臺(tái)。得到值說(shuō)明:byte類型的整數(shù)待笑, 0為極光鸣皂,1為小米,2為華為暮蹂,3為魅族寞缝,4為oppo,5為vivo仰泻,8為FCM荆陆。

注: rom_type 用于點(diǎn)擊事件的上報(bào),一般情況下開(kāi)發(fā)者只需要取到該字段的值用于上報(bào)集侯,不需要關(guān)心具體取值被啼。

3.通知點(diǎn)擊上報(bào)

解析通知內(nèi)容后,需主動(dòng)調(diào)用接口來(lái)進(jìn)行通知點(diǎn)擊上報(bào)棠枉,上報(bào)接口如下:

/**
* context 上下文
* msgId 消息ID
* whichPushSDK 收到推送的平臺(tái)浓体,即 rom_type 字段的取值。
**/
JPushInterface.reportNotificationOpened(Context context, String msgId, byte whichPushSDK);

注: 點(diǎn)擊上報(bào)必須傳入正確的 whichPushSDK 參數(shù)辈讶,否則會(huì)造成統(tǒng)計(jì)數(shù)據(jù)錯(cuò)誤命浴。

4.富媒體調(diào)整

在 AndroidManifest.xml 中將 PushActivity、PopWinActivity 的 android:exported="false" 屬性修改為 true贱除,否則會(huì)導(dǎo)致收不到富媒體推送生闲。

5.檢測(cè)華為服務(wù)升級(jí)

如果華為設(shè)備華為服務(wù)版本過(guò)低的話媳溺,將不能使用華為推送通道發(fā)送通知,必須升級(jí)華為服務(wù)才行跪腹,用戶可選檢測(cè)該服務(wù)是否需要升級(jí)。

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        jPluginPlatformInterface = new JPluginPlatformInterface(this);
    }
    protected void onStart() {
        super.onStart();
        jPluginPlatformInterface.onStart(this);
    }
    protected void onStop() {
        super.onStop();
        jPluginPlatformInterface.onStop(this);
    }

注: 參數(shù)必須為Activity飞醉,請(qǐng)?jiān)诤线m的Activity里調(diào)用該接口冲茸,onStart和onStop 接口都必須在Activity的生命周期里調(diào)用,否則可能引起內(nèi)存泄漏缅帘。

6.Activity 示例代碼
package com.example.jpushdemo;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;

import cn.jpush.android.api.JPushInterface;

/**
 * Created by jiguang on 17/7/5.
 */

public class OpenClickActivity extends Activity {
    private static final String TAG = "OpenClickActivity";
    /**消息Id**/
    private static final String KEY_MSGID = "msg_id";
    /**該通知的下發(fā)通道**/
    private static final String KEY_WHICH_PUSH_SDK = "rom_type";
    /**通知標(biāo)題**/
    private static final String KEY_TITLE = "n_title";
    /**通知內(nèi)容**/
    private static final String KEY_CONTENT = "n_content";
    /**通知附加字段**/
    private static final String KEY_EXTRAS = "n_extras";
    private TextView mTextView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mTextView = new TextView(this);
        setContentView(mTextView);
        handleOpenClick();
    }


    /**
     * 處理點(diǎn)擊事件轴术,當(dāng)前啟動(dòng)配置的Activity都是使用
     * Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK
     * 方式啟動(dòng),只需要在onCreat中調(diào)用此方法進(jìn)行處理
     */
    private void handleOpenClick() {
        Log.d(TAG, "用戶點(diǎn)擊打開(kāi)了通知");
        String data = null;
        //獲取華為平臺(tái)附帶的jpush信息
        if (getIntent().getData() != null) {
             data = getIntent().getData().toString();
        }

        //獲取fcm钦无、oppo逗栽、vivo、華碩失暂、小米平臺(tái)附帶的jpush信息
        if(TextUtils.isEmpty(data) && getIntent().getExtras() != null){
            data = getIntent().getExtras().getString("JMessageExtra");
        }

        Log.w(TAG, "msg content is " + String.valueOf(data));
        if (TextUtils.isEmpty(data)) return;
        try {
            JSONObject jsonObject = new JSONObject(data);
            String msgId = jsonObject.optString(KEY_MSGID);
            byte whichPushSDK = (byte) jsonObject.optInt(KEY_WHICH_PUSH_SDK);
            String title = jsonObject.optString(KEY_TITLE);
            String content = jsonObject.optString(KEY_CONTENT);
            String extras = jsonObject.optString(KEY_EXTRAS);
            StringBuilder sb = new StringBuilder();
            sb.append("msgId:");
            sb.append(String.valueOf(msgId));
            sb.append("\n");
            sb.append("title:");
            sb.append(String.valueOf(title));
            sb.append("\n");
            sb.append("content:");
            sb.append(String.valueOf(content));
            sb.append("\n");
            sb.append("extras:");
            sb.append(String.valueOf(extras));
            sb.append("\n");
            sb.append("platform:");
            sb.append(getPushSDKName(whichPushSDK));
            mTextView.setText(sb.toString());

            //上報(bào)點(diǎn)擊事件
            JPushInterface.reportNotificationOpened(this, msgId, whichPushSDK);
        } catch (JSONException e) {
            Log.w(TAG, "parse notification error");
        }


    }

    private String getPushSDKName(byte whichPushSDK) {
        String name;
        switch (whichPushSDK){
            case 0:
                name = "jpush";
                break;
            case 1:
                name = "xiaomi";
                break;
            case 2:
                name = "huawei";
                break;
            case 3:
                name = "meizu";
                break;
            case 4:
                name= "oppo";
                break;
            case 5:
                name = "vivo";
                break;
            case 6:
                name = "asus";
                break;                
            case 8:
                name = "fcm";
                break;
            default:
                name = "jpush";
        }
        return name;
    }
}

備注

版本對(duì)應(yīng)

       implementation 'cn.jiguang.sdk.plugin:huawei:3.x.x'

上面的版本號(hào)必須與極光的依賴庫(kù)版本號(hào)對(duì)應(yīng)起來(lái)彼宠,由于我開(kāi)發(fā)的項(xiàng)目是使用jpush/jpush-react-native https://github.com/jpush/jpush-react-native 是一個(gè)RN的極光推送庫(kù),版本號(hào)需要
到j(luò)push/jpush-react-native庫(kù)里面libs下去查找如下圖

jpush.PNG

所以配置的庫(kù)是

       implementation 'cn.jiguang.sdk.plugin:huawei:3.8.6'

配置華為廠商通道參數(shù)

在極光后臺(tái)打開(kāi)華為廠商通道并配置 AppID和App Secret弟塞,否則廠商通道是不起作用的凭峡。
查看在華為后臺(tái)應(yīng)用的配置
https://developer.huawei.com/consumer/cn/service/josp/agc/index.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市决记,隨后出現(xiàn)的幾起案子摧冀,更是在濱河造成了極大的恐慌,老刑警劉巖系宫,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件索昂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡扩借,警方通過(guò)查閱死者的電腦和手機(jī)椒惨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)潮罪,“玉大人框产,你說(shuō)我怎么就攤上這事〈斫啵” “怎么了秉宿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)屯碴。 經(jīng)常有香客問(wèn)我描睦,道長(zhǎng),這世上最難降的妖魔是什么导而? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任忱叭,我火速辦了婚禮隔崎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘韵丑。我一直安慰自己爵卒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布撵彻。 她就那樣靜靜地躺著钓株,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陌僵。 梳的紋絲不亂的頭發(fā)上轴合,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音碗短,去河邊找鬼受葛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛偎谁,可吹牛的內(nèi)容都是我干的总滩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼巡雨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咱娶!你這毒婦竟也來(lái)了急波?” 一聲冷哼從身側(cè)響起稽穆,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤送矩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蝌以,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體炕舵,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年跟畅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咽筋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徊件,死狀恐怖奸攻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虱痕,我是刑警寧澤睹耐,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站部翘,受9級(jí)特大地震影響硝训,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一窖梁、第九天 我趴在偏房一處隱蔽的房頂上張望赘风。 院中可真熱鬧,春花似錦纵刘、人聲如沸邀窃。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瞬捕。三九已至,卻和暖如春位谋,著一層夾襖步出監(jiān)牢的瞬間山析,已是汗流浹背堰燎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工掏父, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秆剪。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓赊淑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親仅讽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子陶缺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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