uniapp は unipush を使用してプッシュし、Java バックグラウンド プッシュ コードを使用します (unipush を使用してプッシュするローカルのパッケージ化された APK を含む)

ご存知のとおり、これはプロジェクトで再び使用されています。プログラマーとして、定期的に「進化」し、一生懸命書く必要があります。Android 開発者として多くのプッシュを書いてきましたが、uniapp のプッシュも異なります。記録してください。将来の使用。

まず、uniapp のプッシュ uniPush は、DCloud と Getui Company が開始した統合統合プッシュ サービスです。つまり、選択する必要はなく、ただプッシュするだけです。

次に、unipush はバージョン 1.0 とバージョン 2.0 に分かれていますが、これは非常に重要であり、全く異なる概念ですので、単なるアップグレード版と考えないでください。

バージョン 1.0:従来のプッシュ方式で、クライアントとサーバーの両方がプッシュ サービスを統合する必要があり、サーバーはプッシュ サーバーにリクエストを送信して関連するプッシュ機能を操作します。

バージョン 2.0: サーバーなどというものは存在しません。これは、クラウド運用の概念、つまり、uniCloud とクラウドの統合に相当します。また、uniapp クラウド技術の必然的なトレンドでもあります。強力な機能を備えており、以下の機能が付属しています。 Web コンソールが欠落しているため、サーバーの場合、自然なプロセスは単純です。

したがって、ビジネス ニーズに応じて適切なバージョンを選択してください。私も初めて書きます。新しいバージョンを感じたいと思っています。その結果、ほぼ書き終えて、何かが間違っていることに気づきました。2.0 ではありません。今回はプロジェクトのニーズに適しているため、バージョン 1.0 に戻しました。したがって、この記事では引き続きバージョン 1.0 の使用方法と、uniapp がローカルに基づいたアプリにパッケージ化されている場合にそれを調整する方法を紹介します。

通常の状況 (パッケージ化されていない APK) での unipush 1.0 の使用について説明します。

1.unipushプッシュサービスを開く

新しい uniapp プロジェクトを作成した後、manifest.json でアプリ モジュール構成を選択し、プッシュ (メッセージ プッシュ) と対応するバージョンを確認します。ここでは unipush 1.0 を示します。

 次に、「構成」をクリックして Dcloud Developer Center に入ります。

ここではios関連は紹介しないので、プラットフォームの選択でIOSのチェックを外しても大丈夫です。ここで、パッケージ名と署名を入力する必要があることがわかります。

パッケージングについてクラウドパッケージングをご利用の場合

パッケージ名が実際には uni であることもわかります。AppID は上で丸で囲まれたものです。パッケージ名の列にそれを入力し、パッケージ化するときに古い Dcloud 証明書の使用を確認することを忘れないでください。このように、開発者センターの署名欄の紹介を見ると、クラウドパッケージと古いバージョンの証明書を使用する場合、署名に何を記入すればよいか、すでに表示されているので、コピーしてくださいという意味ですか?その署名を入力し、署名欄に記入します。

最後に、クリックしてアプリケーションをアクティブ化します。アクティブ化が成功すると、ポップアップ ウィンドウが表示されます。

 2. 関連知識をプッシュする

Push を記述するには、まず Push について理解する必要があります。従来のプッシュや、この種の少量の情報のリアルタイム配信 (インスタント メッセージング) と同様に、それは次のようなものにすぎません。

1. ポーリング方式、つまり定期的に http リクエストを実行して、送信するニュースがあるかどうかを確認します。この方式は最も愚かな方式です。

2. SMS、ハオ、お気軽にどうぞ

3. 長時間接続。現在は長時間接続が成熟していますが、携帯電話の場合、この種のパフォーマンスの消費は依然として膨大です。結局のところ、チャットや生放送ではありません。

幸いなことに、Jiguang Push、Alibaba Cloud Push、Getui など、成熟したサードパーティ通知がすでに市場に登場しています。ここでは詳しく説明しませんが、それについてのみ言及します。多くの人はバックグラウンドまたはモバイル以外の Web テクノロジーの開発に従事しているため、モバイル プッシュについてはもちろん、プッシュとは何なのかさえ知りません。

写真のように、携帯電話のステータス バーには、広告、更新通知、特定のメッセージ、テキスト メッセージなど、時には気に入ったり、時には飽きたりするさまざまなポップアップ ウィンドウがあります。そして、プッシュとはポップアップウィンドウだけを指すのではなく、このポップアップウィンドウはAndroidに付属する機能、つまり通知(通知)であり、プッシュ技術なしで携帯電話にそのようなポップアップウィンドウをポップアップさせることができます、さらにはさまざまなアイコン、効果音、振動などをもたらします。プッシュとは、データをリアルタイムで携帯電話に送信し、ポップアップ ウィンドウを開始すること、ポップアップ ウィンドウに表示される内容、またはこれをクリックしたときに何をするかを携帯電話に知らせることです。ポップアップウィンドウ、拍手はわかります!

次に、push 原理と技術アーキテクチャについて簡単に説明しますが、私は unipush のオリジナルのイメージを直接取得しており、描画することはできません。

率直に言うと、携帯電話はまず unipush サーバー (プッシュ サーバー) との接続を確立します。これは基本的に一意の ID、ここではいわゆる clientId (cid) によって確立されます。次に、Java サーバーがプッシュ サービスを統合した後、cid が xx の携帯電話に xxx メッセージをプッシュしたいというリクエストを送信してプッシュ サーバーの API を呼び出すことができ、プッシュ サーバーはデータをプッシュできるようになります。 cid を介して携帯電話に送信します。

また、私が特定の人物や特定のアカウントについて話しているのではなく、携帯電話や機器について話していることもおわかりでしょう。アカウントは自社サーバーのアカウントシステムのセットであることが多いためです。したがって、より豊富なプッシュ メソッドが必要な場合、またはそれを独自のアカウント システムに関連付ける場合 (cid デバイス ID を独自のサーバーに直接渡してバインドすることもできます)、cid に関連する他のプッシュ メソッドのセットが必要になります。派生エイリアス(alias)、ラベル(タグ)のうち。一部のサードパーティのプッシュ メソッドには、より豊富なメソッドがありますが、類似しており、通常はエイリアスやタグなどのメソッドがあります。

エイリアス (別名)。通常、自分のアカウントに関連付けるために使用されます。必要に応じて、ユーザーのアカウント番号、ニックネーム、電子メール アドレス、または携帯電話番号を指定できます。

タグは一般に、特定の種類のユーザーの一括プッシュや、特定のグループに属するユーザーの一括プッシュなど、独自のアカウント システムをグループ化するために使用されます。

最後に、プッシュは一般に 2 種類に分けられ、1 つは通知と呼ばれ、もう 1 つはメッセージと呼ばれることを理解する必要があります (ここではユニプッシュを透過的送信メッセージと呼びます)。2 つの違いは、1 つは単なるリマインダー用であり、もう 1 つはデータの受け渡しやビジネス ロジック、スタイルなどのカスタマイズ用であることです。

通知は比較的シンプルで粗雑です。一般的には、タイトルと内容を渡すだけで、携帯電話に自動的に表示されます。たとえば、ソフトウェアを更新する必要があること、新しいメッセージがあること、新しい返信があることをユーザーに通知するために使用されます、など。 

透過的な送信メッセージは、一般にデータ形式をカスタマイズできますが、主に json が使用されます。第二に、携帯電話が透過的な送信メッセージを受信した後、自動的に通知のようなウィンドウが表示されず、まったく応答がありません。 、データを受信したばかりの場合は、業務に応じてポップアップ ウィンドウをポップアップ表示するか、フォローアップ操作を実行する必要があります。

プッシュ プロセスは、他のサードパーティのプッシュとは少し異なります。アプリが実行されたらすぐに cid を取得し、Java バックグラウンドでインターフェイスを作成する必要があります。アプリは cid をバックグラウンド サーバーに渡し、バックグラウンドでサーバーは cid、エイリアス、ラベルを実行してバインドします。ユーザーがログアウトした後は、必ずバインドを解除してください。そうしないと、1 つのアカウントでログインするデバイスが複数ある場合、プッシュが乱れます。

まあ、基本的にこれらを理解すれば十分です。コーディングを続けてください。

3. uniapp は clientId を取得し、unipush との接続を確立します。

アプリを初めて実行するときに、まず clientId を取得する必要があります。コードは次のとおりです。

getClient: (callback) => {
		// #ifdef APP-PLUS
		let clientInfo = plus.push.getClientInfo();  //获取 clientID
		uni.setStorageSync('clientid', clientInfo.clientid) //缓存到本地
		console.log(clientInfo);
		// #endif

}

4. プッシュ受信時の処理を監視する

CID の取得に加えて、受信したプッシュ メッセージの処理方法も設定する必要があります。ここでのコードの一部は他の人 (正確には誰なのかはわかりません...) から借用し、独自の微調整を加えています。次に、便宜上、それを js ファイル unipush.js に入れます。

export default {
	init: () => {
		// #ifdef APP-PLUS
		plus.push.setAutoNotification(true);  //设置通知栏显示通知 //必须设置
		plus.push.addEventListener("click", function(msg) {
			plus.push.clear(); //清空通知栏
			pushHandle(msg) //处理方法
		}, false);
		// 监听在线消息事件    
		plus.push.addEventListener("receive", function(msg) {			
			console.log("receive:"+JSON.stringify(msg));
			if (plus.os.name=='iOS') {  //由于IOS 必须要创建本地消息 所以做这个判断
				if (msg.payload&& msg.payload!=null&&msg.type=='receive') {
					console.log(msg);
					// {"title": "xxx","content": "xxx","payload": "xxx"} 符合这种 才会自动创建消息  文档地址https://ask.dcloud.net.cn/article/35622
					plus.push.createMessage(msg.title,msg.content,JSON.stringify(msg.payload))  //创建本地消息
				}
			}
			if (plus.os.name=='Android') {
				let options={
					cover:false,
					sound:"system",
					title:msg.title
				}
				plus.push.createMessage(msg.content,msg.payload.content,options);
				// if(!msg.title||!msg.content||!msg.payload){ //  不符合自动创建消息的情况
				// 	 //这里根据你消息字段来创建消息 
				// 	 console.log("这里根据你消息字段来创建消息:"+msg.title+","+msg.content+","+msg.payload);
				// 	plus.push.createMessage(msg.payload.content,JSON.stringify(msg.payload))  //创建本地消息
				// }else{
				// 	//符合自动创建消息 
				// 	console.log("符合自动创建消息"+msg.title+","+msg.content+","+msg.payload);
				// 	pushHandle(msg)
				// }	
			}
			 	
		}, false);
		// #endif
	},

	getClient: (callback) => {
		// #ifdef APP-PLUS
		let clientInfo = plus.push.getClientInfo();  //获取 clientID
		uni.setStorageSync('clientid', clientInfo.clientid)
		console.log(clientInfo);
		// #endif

	},

}
const pushHandle = (msg) => {
	if (typeof (msg.payload )=='string') {  //如果是字符串,表示是ios创建的  要转换一下
		msg.payload=JSON.parse(msg.payload )
	}
	if(!msg) return false;
	plus.runtime.setBadgeNumber(0); //清除app角标
	
	//下面的代码根据自己业务来写 这里可以写跳转业务代码
	//跳转到tab
	if (msg.payload.pathType == '1') {
		uni.switchTab({
			url: msg.payload.url
		})
	}
	//跳转到详情
	if (msg.payload.pathType == 0) {
		let url = msg.payload.url
		if (msg.payload.args) {
			url = url + '?id=' + msg.payload.args
		}
		console.log(url);
		uni.navigateTo({
			url: url
		})
	}
}

最後に、App.vue に次のコードを追加します。

<script>
	import push from 'push/unipush.js';
	export default {
		onLaunch: function() {
			console.log('App Launch');
			push.getClient(); 
			push.init();
		},
		onShow: function() {
			console.log('App Show')
		},
		onHide: function() {
			console.log('App Hide')
		}
	}
</script>

<style>
	/*每个页面公共css */
</style>

ここまでで携帯電話のコードは完成しました。かなりシンプルです。次はJavaサーバー側です

5. Java サーバー側の統合プッシュ

秘密鍵などの関連情報を取得するには、開発者センターにアクセスし、プッシュ -> 構成管理 -> アプリケーション構成のメッセージに秘密鍵関連の情報があります。 

私のバックグラウンドは Springboot なので、application.yml の下に次の設定を入力します。

次に、プッシュされた SDK を pom.xml に統合します。

<dependency>
    <groupId>com.getui.push</groupId>
    <artifactId>restful-sdk</artifactId>
    <version>1.0.0.8</version>
</dependency>

6. プッシュ構成クラス GTPushConfig を作成します

import com.getui.push.v2.sdk.ApiHelper;
import com.getui.push.v2.sdk.GtApiConfiguration;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GTPushConfig {

//    @Value("https://restapi.getui.com/v2")
//    private String baseUrl;

    @Value("${uniPush.appId}")
    private String appId;

    @Value("${uniPush.appKey}")
    private String appKey;

    @Value("${uniPush.masterSecret}")
    private String masterSecret;

    @Bean(name = "myApiHelper")
    public ApiHelper apiHelper() {
        GtApiConfiguration apiConfiguration = new GtApiConfiguration();
        //填写应用配置
        apiConfiguration.setAppId(appId);
        apiConfiguration.setAppKey(appKey);
        apiConfiguration.setMasterSecret(masterSecret);
        // 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
        //默认为https://restapi.getui.com/v2
        //apiConfiguration.setDomain("https://restapi.getui.com/v2/");
        // 实例化ApiHelper对象,用于创建接口对象
        ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
        return apiHelper;
    }
}

7. プッシュツールクラスPushUtilとプッシュメッセージエンティティクラスをカプセル化する

プッシュメッセージエンティティクラス

@Data
public class PushReqBean implements Serializable {

    //消息类型  0代表透传消息(使用这个,需要手机自己弹出通知,定义通知样式,content为json串)  1代表是通知(使用这个,标题和内容即手机上显示的通知标题和内容)
    private Integer noticeType;
    //推送用户类型 0 全部用户  1根据cid推送  2根据别名  3根据标签
    private Integer userType;
    //用户标识,可为cid,别名,tag,多个之间逗号隔开
    private String user;
    //推送标题
    private String title;
    //推送内容
    private String content;

}

API 呼び出しの結果はエンティティ クラスをカプセル化します (オプション)

@Data
public class ResultBean implements Serializable {

    public int code;
    public String msg;
    public Object data;

}

プッシュツールクラスには、エイリアスのバインド、バッチバインド、タグのバインド、バインド解除、各種メソッドによるプッシュ通知、各種メソッドによる透過的な送信メッセージのプッシュなど、ほぼすべての機能を統合しました。


import com.getui.push.v2.sdk.ApiHelper;
import com.getui.push.v2.sdk.api.PushApi;
import com.getui.push.v2.sdk.api.UserApi;
import com.getui.push.v2.sdk.common.ApiResult;
import com.getui.push.v2.sdk.dto.req.*;
import com.getui.push.v2.sdk.dto.req.message.PushDTO;
import com.getui.push.v2.sdk.dto.req.message.PushMessage;
import com.getui.push.v2.sdk.dto.req.message.android.GTNotification;
import com.getui.push.v2.sdk.dto.res.QueryCidResDTO;
import com.getui.push.v2.sdk.dto.res.TaskIdDTO;
import com.google.gson.JsonObject;
import com.njlift.wechat.common.Result;
import com.njlift.wechat.entity.PushReqBean;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.*;

@Component
public class PushUtil {

    @Resource(name = "myApiHelper")
    private ApiHelper myApiHelper;


    /**
     * 绑定别名
     * @param cid  用户在推送服务器的唯一识别标志
     * @param alias 在自己服务器上的唯一识别标志
     * @return 绑定结果
     */
    public Result bindAlias(String cid,String alias){
        Result rb=new Result();
        CidAliasListDTO cidAliasListDTO=new CidAliasListDTO();
        CidAliasListDTO.CidAlias cidAlias=new CidAliasListDTO.CidAlias();
        cidAlias.setCid(cid);
        cidAlias.setAlias(alias);
        cidAliasListDTO.add(cidAlias);
        UserApi userApi = myApiHelper.creatApi(UserApi.class);
        ApiResult<Void> voidApiResult = userApi.bindAlias(cidAliasListDTO);
        rb.setCode(voidApiResult.getCode());
        rb.setMsg(voidApiResult.getMsg());
        rb.setData(voidApiResult.getData());
        return rb;
    }

    /**
     * 批量解绑别名
     * @param aliasList 别名列表
     * @return 解绑结果
     *
     */
    public Result unbindAlias(List<String> aliasList){
        Result rb=new Result();
        List<CidAliasListDTO.CidAlias> list=new ArrayList<>();
        UserApi userApi = myApiHelper.creatApi(UserApi.class);
        for (String alias:aliasList){
            ApiResult<QueryCidResDTO> queryCidResDTOApiResult = userApi.queryCidByAlias(alias);
            if (queryCidResDTOApiResult.isSuccess()){
                List<String> cidList = queryCidResDTOApiResult.getData().getCid();
                for (String cid:cidList){
                    CidAliasListDTO.CidAlias cidAlias=new CidAliasListDTO.CidAlias();
                    cidAlias.setAlias(alias);
                    cidAlias.setCid(cid);
                    list.add(cidAlias);
                }
            }
        }
        CidAliasListDTO cidAliasListDTO=new CidAliasListDTO();
        cidAliasListDTO.setDataList(list);
        ApiResult<Void> voidApiResult = userApi.batchUnbindAlias(cidAliasListDTO);
        rb.setCode(voidApiResult.getCode());
        rb.setMsg(voidApiResult.getMsg());
        rb.setData(voidApiResult.getData());
        return rb;
    }

    /**
     * 一个用户根据cid进行绑定tag标签(次数限制)
     * @param cid 用户在推送服务器的唯一识别标志
     * @param tag 标签名
     * @return 绑定结果
     */
    public Result userBindTagsByCid(String cid,String tag){
        Result rb=new Result();
        UserApi userApi = myApiHelper.creatApi(UserApi.class);
        TagDTO dto=new TagDTO();
        dto.addTag(tag);
        ApiResult<Void> voidApiResult = userApi.userBindTags(cid, dto);
        rb.setCode(voidApiResult.getCode());
        rb.setMsg(voidApiResult.getMsg());
        rb.setData(voidApiResult.getData());
        return rb;
    }

    /**
     * 一个用户根据别名进行绑定tag标签(次数限制)
     * @param alias 在自己服务器上的唯一识别标志
     * @param tag 标签名
     * @return 绑定结果
     */
    public Result userBindTagsByAlias(String alias,String tag){
        Result rb=new Result();
        rb.setCode(1);
        UserApi userApi = myApiHelper.creatApi(UserApi.class);
        ApiResult<QueryCidResDTO> queryCidResDTOApiResult = userApi.queryCidByAlias(alias);
        if (queryCidResDTOApiResult.isSuccess()){
            List<String> cidList = queryCidResDTOApiResult.getData().getCid();
            if (cidList.size()==1){
                String cid = cidList.get(0);
                TagDTO dto=new TagDTO();
                dto.addTag(tag);
                ApiResult<Void> voidApiResult = userApi.userBindTags(cid, dto);
                rb.setCode(voidApiResult.getCode());
                rb.setMsg(voidApiResult.getMsg());
                rb.setData(voidApiResult.getData());
            }else {
                rb.setMsg("该别名对应多个cid,无法绑定标签");
            }
        }else {
            rb.setMsg(queryCidResDTOApiResult.getMsg());
        }
        return rb;
    }

    /**
     * 一批用户绑定tag标签(每分钟100次,每日10000次)
     * @param cidList 用户在推送服务器的唯一识别标志
     * @param tag 标签名
     * @return 绑定结果
     */
    public Result userBindTagsByAlias(List<String> cidList,String tag){
        Result rb=new Result();
        rb.setCode(1);
        UserApi userApi = myApiHelper.creatApi(UserApi.class);
        UserDTO userDTO=new UserDTO();
        Set<String> cidSet=new HashSet<>(cidList);
        userDTO.setCid(cidSet);
        ApiResult<Map<String, String>> mapApiResult = userApi.usersBindTag(tag, userDTO);
        rb.setCode(mapApiResult.getCode());
        rb.setMsg(mapApiResult.getMsg());
        rb.setData(mapApiResult.getData());
        return rb;
    }

    /**
     * 批量用户解绑一个标签
     * @param list 用户集合(可cid集合或alias集合)
     * @param type 0表示alias集合,1表示cid集合
     * @param tag 标签
     * @return 解绑结果
     */
    public Result usersUnbindTag(List<String> list,int type,String tag){
        Result rb=new Result();
        rb.setCode(1);
        UserApi userApi = myApiHelper.creatApi(UserApi.class);
        UserDTO userDTO=new UserDTO();
        List<String> cidList=new ArrayList<>();
        if (type==0){
            for (String alias:list){
                ApiResult<QueryCidResDTO> queryCidResDTOApiResult = userApi.queryCidByAlias(alias);
                if (queryCidResDTOApiResult.isSuccess()){
                    cidList.addAll(queryCidResDTOApiResult.getData().getCid());
                }
            }
        }else {
            cidList.addAll(list);
        }
        Set<String> cidSet=new HashSet<>(cidList);
        userDTO.setCid(cidSet);
        ApiResult<Map<String, String>> mapApiResult = userApi.deleteUsersTag(tag, userDTO);
        rb.setCode(mapApiResult.getCode());
        rb.setMsg(mapApiResult.getMsg());
        rb.setData(mapApiResult.getData());
        return rb;
    }



    /**
     * 群推透传消息
     * @param bean 推送信息
     * @return 结果
     */
    public Result pushMessageToAll(PushReqBean bean){
        Result rb=new Result();
        PushDTO<String> pushDTO = new PushDTO<String>();
        pushDTO.setRequestId(System.currentTimeMillis() + "");
        pushDTO.setAudience("all");
        PushMessage pushMessage = new PushMessage();
        JsonObject jsonObject=new JsonObject();
        jsonObject.addProperty("m_title",bean.getTitle());
        jsonObject.addProperty("m_content",bean.getContent());
        pushMessage.setTransmission(jsonObject.toString());
        pushDTO.setPushMessage(pushMessage);
        PushApi pushApi = myApiHelper.creatApi(PushApi.class);
        ApiResult<TaskIdDTO> apiResult = pushApi.pushAll(pushDTO);
        rb.setCode(apiResult.getCode());
        rb.setMsg(apiResult.getMsg());
        rb.setData(apiResult.getData());
        return rb;
    }

    /**
     * 根据cid推送消息(含批量)
     * @param bean 推送信息
     * @return 结果
     */
    public Result pushMessageToCid(PushReqBean bean){
        boolean isMany=bean.getUser().contains(",");
        if (isMany){
            return pushMessageToManyCid(bean);
        }else {
            return pushMessageToSingleCid(bean);
        }
    }

    /**
     * 根据别名推送消息(含批量)
     * @param bean 推送信息
     * @return 结果
     */
    public Result pushMessageToAlias(PushReqBean bean){
        boolean isMany=bean.getUser().contains(",");
        if (isMany){
            return pushMessageToManyAlias(bean);
        }else {
            return pushMessageToSingleAlias(bean);
        }
    }

    //根据cid单推消息
    private Result pushMessageToSingleCid(PushReqBean bean){
        Result rb=new Result();
        PushDTO<Audience> pushDTO = new PushDTO<Audience>();
        pushDTO.setRequestId(System.currentTimeMillis() + "");
        PushMessage pushMessage = new PushMessage();
        JsonObject jsonObject=new JsonObject();
        jsonObject.addProperty("m_title",bean.getTitle());
        jsonObject.addProperty("m_content",bean.getContent());
        pushMessage.setTransmission(jsonObject.toString());
        pushDTO.setPushMessage(pushMessage);
        Audience audience = new Audience();
        audience.addCid(bean.getUser());
        pushDTO.setAudience(audience);
        PushApi pushApi = myApiHelper.creatApi(PushApi.class);
        ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
        rb.setCode(apiResult.getCode());
        rb.setMsg(apiResult.getMsg());
        rb.setData(apiResult.getData());
        return rb;
    }

    //批量根据cid推送消息
    private Result pushMessageToManyCid(PushReqBean bean){
        Result rb = new Result();
        PushDTO pushDTO=new PushDTO();
        PushMessage pushMessage = new PushMessage();
        JsonObject jsonObject=new JsonObject();
        jsonObject.addProperty("m_title",bean.getTitle());
        jsonObject.addProperty("m_content",bean.getContent());
        pushMessage.setTransmission(jsonObject.toString());
        pushDTO.setPushMessage(pushMessage);
        PushApi pushApi = myApiHelper.creatApi(PushApi.class);
        ApiResult<TaskIdDTO> msg = pushApi.createMsg(pushDTO);
        if (msg.isSuccess()){
            AudienceDTO audienceDTO=new AudienceDTO();
            audienceDTO.setTaskid(msg.getData().getTaskId());
            audienceDTO.setAsync(true);
            List<String> users = Arrays.asList(bean.getUser().split(","));
            Audience audience=new Audience();
            for (String user:users){
                audience.addCid(user);
            }
            audienceDTO.setAudience(audience);
            PushApi pushApi1 = myApiHelper.creatApi(PushApi.class);
            ApiResult<Map<String, Map<String, String>>> mapApiResult = pushApi1.pushListByCid(audienceDTO);
            rb.setCode(mapApiResult.getCode());
            rb.setMsg(mapApiResult.getMsg());
            rb.setData(mapApiResult.getData());
        }else {
            rb.setCode(msg.getCode());
            rb.setMsg(msg.getMsg());
            rb.setData(msg.getData());
        }
        return rb;
    }

    //根据别名单推消息
    private Result pushMessageToSingleAlias(PushReqBean bean){
        Result rb=new Result();
        PushDTO<Audience> pushDTO = new PushDTO<Audience>();
        pushDTO.setRequestId(System.currentTimeMillis() + "");
        PushMessage pushMessage = new PushMessage();
        JsonObject jsonObject=new JsonObject();
        jsonObject.addProperty("m_title",bean.getTitle());
        jsonObject.addProperty("m_content",bean.getContent());
        pushMessage.setTransmission(jsonObject.toString());
        pushDTO.setPushMessage(pushMessage);
        Audience audience = new Audience();
        audience.addAlias(bean.getUser());
        pushDTO.setAudience(audience);
        PushApi pushApi = myApiHelper.creatApi(PushApi.class);
        ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByAlias(pushDTO);
        rb.setCode(apiResult.getCode());
        rb.setMsg(apiResult.getMsg());
        rb.setData(apiResult.getData());
        return rb;
    }

    //批量根据别名推送消息
    private Result pushMessageToManyAlias(PushReqBean bean){
        Result rb = new Result();
        PushDTO pushDTO=new PushDTO();
        PushMessage pushMessage = new PushMessage();
        JsonObject jsonObject=new JsonObject();
        jsonObject.addProperty("m_title",bean.getTitle());
        jsonObject.addProperty("m_content",bean.getContent());
        pushMessage.setTransmission(jsonObject.toString());
        pushDTO.setPushMessage(pushMessage);
        PushApi pushApi = myApiHelper.creatApi(PushApi.class);
        ApiResult<TaskIdDTO> msg = pushApi.createMsg(pushDTO);
        if (msg.isSuccess()){
            AudienceDTO audienceDTO=new AudienceDTO();
            audienceDTO.setTaskid(msg.getData().getTaskId());
            audienceDTO.setAsync(true);
            List<String> users = Arrays.asList(bean.getUser().split(","));
            Audience audience=new Audience();
            for (String user:users){
                audience.addAlias(user);
            }
            audienceDTO.setAudience(audience);
            PushApi pushApi1 = myApiHelper.creatApi(PushApi.class);
            ApiResult<Map<String, Map<String, String>>> mapApiResult = pushApi1.pushListByAlias(audienceDTO);
            rb.setCode(mapApiResult.getCode());
            rb.setMsg(mapApiResult.getMsg());
            rb.setData(mapApiResult.getData());
        }else {
            rb.setCode(msg.getCode());
            rb.setMsg(msg.getMsg());
            rb.setData(msg.getData());
        }
        return rb;
    }

    //根据标签推送消息
    public Result pushMessageToTag(PushReqBean bean){
        Result rb=new Result();
        PushDTO<Audience> pushDTO = new PushDTO<Audience>();
        pushDTO.setRequestId(System.currentTimeMillis() + "");
        PushMessage pushMessage = new PushMessage();
        JsonObject jsonObject=new JsonObject();
        jsonObject.addProperty("m_title",bean.getTitle());
        jsonObject.addProperty("m_content",bean.getContent());
        pushMessage.setTransmission(jsonObject.toString());
        pushDTO.setPushMessage(pushMessage);
        Audience audience = new Audience();
        Condition condition=new Condition();
        condition.setKey("custom_tag");
        List<String> tags=new ArrayList<>();
        if (bean.getUser().contains(",")){
            tags.addAll(Arrays.asList(bean.getUser().split(",")));
        }else {
            tags.add(bean.getUser());
        }
        Set<String> sets=new HashSet<>();
        for (String tag:tags){
            sets.add(tag);
        }
        condition.setValues(sets);
        condition.setOptType("and");
        audience.addCondition(condition);
        pushDTO.setAudience(audience);
        PushApi pushApi = myApiHelper.creatApi(PushApi.class);
        ApiResult<TaskIdDTO> apiResult = pushApi.pushByTag(pushDTO);
        rb.setCode(apiResult.getCode());
        rb.setMsg(apiResult.getMsg());
        rb.setData(apiResult.getData());
        return rb;
    }


    /**
     * 群推通知
     * @param bean 推送信息
     * @return 结果
     */
    public Result pushNoticeToAll(PushReqBean bean){
        Result rb=new Result();
        PushDTO<String> pushDTO = new PushDTO<String>();
        pushDTO.setRequestId(System.currentTimeMillis() + "");
        pushDTO.setAudience("all");
        PushMessage pushMessage = new PushMessage();
        GTNotification notification = new GTNotification();
        notification.setTitle(bean.getTitle());
        notification.setBody(bean.getContent());
        notification.setClickType("none");
        pushMessage.setNotification(notification);
        pushDTO.setPushMessage(pushMessage);
        PushApi pushApi = myApiHelper.creatApi(PushApi.class);
        ApiResult<TaskIdDTO> apiResult = pushApi.pushAll(pushDTO);
        rb.setCode(apiResult.getCode());
        rb.setMsg(apiResult.getMsg());
        rb.setData(apiResult.getData());
        return rb;
    }

    /**
     * 根据cid推送通知(含批量)
     * @param bean 推送信息
     * @return 结果
     */
    public Result pushNoticeToCid(PushReqBean bean){
        boolean isMany=bean.getUser().contains(",");
        if (isMany){
            return pushNoticeToManyCid(bean);
        }else {
            return pushNoticeToSingleCid(bean);
        }
    }

    /**
     * 根据别名推送通知(含批量)
     * @param bean 推送信息
     * @return 结果
     */
    public Result pushNoticeToAlias(PushReqBean bean){
        boolean isMany=bean.getUser().contains(",");
        if (isMany){
            return pushNoticeToManyAlias(bean);
        }else {
            return pushNoticeToSingleAlias(bean);
        }
    }

    //根据cid单推通知
    private Result pushNoticeToSingleCid(PushReqBean bean){
        Result rb=new Result();
        PushDTO<Audience> pushDTO = new PushDTO<Audience>();
        pushDTO.setRequestId(System.currentTimeMillis() + "");
        PushMessage pushMessage = new PushMessage();
        GTNotification notification = new GTNotification();
        notification.setTitle(bean.getTitle());
        notification.setBody(bean.getContent());
        notification.setClickType("none");
        pushMessage.setNotification(notification);
        pushDTO.setPushMessage(pushMessage);
        Audience audience = new Audience();
        audience.addCid(bean.getUser());
        pushDTO.setAudience(audience);
        PushApi pushApi = myApiHelper.creatApi(PushApi.class);
        ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
        rb.setCode(apiResult.getCode());
        rb.setMsg(apiResult.getMsg());
        rb.setData(apiResult.getData());
        return rb;
    }

    //批量根据cid推送通知
    private Result pushNoticeToManyCid(PushReqBean bean) {
        Result rb = new Result();
        PushDTO pushDTO=new PushDTO();
        PushMessage pushMessage = new PushMessage();
        GTNotification notification = new GTNotification();
        notification.setTitle(bean.getTitle());
        notification.setBody(bean.getContent());
        notification.setClickType("none");
        pushMessage.setNotification(notification);
        pushDTO.setPushMessage(pushMessage);
        PushApi pushApi = myApiHelper.creatApi(PushApi.class);
        ApiResult<TaskIdDTO> msg = pushApi.createMsg(pushDTO);
        if (msg.isSuccess()){
            AudienceDTO audienceDTO=new AudienceDTO();
            audienceDTO.setTaskid(msg.getData().getTaskId());
            audienceDTO.setAsync(true);
            List<String> users = Arrays.asList(bean.getUser().split(","));
            Audience audience=new Audience();
            for (String user:users){
                audience.addCid(user);
            }
            audienceDTO.setAudience(audience);
            PushApi pushApi1 = myApiHelper.creatApi(PushApi.class);
            ApiResult<Map<String, Map<String, String>>> mapApiResult = pushApi1.pushListByCid(audienceDTO);
            rb.setCode(mapApiResult.getCode());
            rb.setMsg(mapApiResult.getMsg());
            rb.setData(mapApiResult.getData());
        }else {
            rb.setCode(msg.getCode());
            rb.setMsg(msg.getMsg());
            rb.setData(msg.getData());
        }
        return rb;
    }

    //根据别名单推通知
    private Result pushNoticeToSingleAlias(PushReqBean bean){
        Result rb=new Result();
        PushDTO<Audience> pushDTO = new PushDTO<Audience>();
        pushDTO.setRequestId(System.currentTimeMillis() + "");
        PushMessage pushMessage = new PushMessage();
        GTNotification notification = new GTNotification();
        notification.setTitle(bean.getTitle());
        notification.setBody(bean.getContent());
        notification.setClickType("none");
        pushMessage.setNotification(notification);
        pushDTO.setPushMessage(pushMessage);
        Audience audience = new Audience();
        audience.addAlias(bean.getUser());
        pushDTO.setAudience(audience);
        PushApi pushApi = myApiHelper.creatApi(PushApi.class);
        ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByAlias(pushDTO);
        rb.setCode(apiResult.getCode());
        rb.setMsg(apiResult.getMsg());
        rb.setData(apiResult.getData());
        return rb;
    }

    //批量根据别名推送通知
    private Result pushNoticeToManyAlias(PushReqBean bean) {
        Result rb = new Result();
        PushDTO pushDTO=new PushDTO();
        PushMessage pushMessage = new PushMessage();
        GTNotification notification = new GTNotification();
        notification.setTitle(bean.getTitle());
        notification.setBody(bean.getContent());
        notification.setClickType("none");
        pushMessage.setNotification(notification);
        pushDTO.setPushMessage(pushMessage);
        PushApi pushApi = myApiHelper.creatApi(PushApi.class);
        ApiResult<TaskIdDTO> msg = pushApi.createMsg(pushDTO);
        if (msg.isSuccess()){
            AudienceDTO audienceDTO=new AudienceDTO();
            audienceDTO.setTaskid(msg.getData().getTaskId());
            audienceDTO.setAsync(true);
            List<String> users = Arrays.asList(bean.getUser().split(","));
            Audience audience=new Audience();
            for (String user:users){
                audience.addAlias(user);
            }
            audienceDTO.setAudience(audience);
            PushApi pushApi1 = myApiHelper.creatApi(PushApi.class);
            ApiResult<Map<String, Map<String, String>>> mapApiResult = pushApi1.pushListByAlias(audienceDTO);
            rb.setCode(mapApiResult.getCode());
            rb.setMsg(mapApiResult.getMsg());
            rb.setData(mapApiResult.getData());
        }else {
            rb.setCode(msg.getCode());
            rb.setMsg(msg.getMsg());
            rb.setData(msg.getData());
        }
        return rb;
    }

    //根据标签推送通知
    public Result pushNoticeToTag(PushReqBean bean){
        Result rb=new Result();
        PushDTO<Audience> pushDTO = new PushDTO<Audience>();
        pushDTO.setRequestId(System.currentTimeMillis() + "");
        PushMessage pushMessage = new PushMessage();
        GTNotification notification = new GTNotification();
        notification.setTitle(bean.getTitle());
        notification.setBody(bean.getContent());
        notification.setClickType("none");
        pushMessage.setNotification(notification);
        pushDTO.setPushMessage(pushMessage);
        Audience audience = new Audience();
        Condition condition=new Condition();
        condition.setKey("custom_tag");
        List<String> tags=new ArrayList<>();
        if (bean.getUser().contains(",")){
            tags.addAll(Arrays.asList(bean.getUser().split(",")));
        }else {
            tags.add(bean.getUser());
        }
        Set<String> sets=new HashSet<>();
        for (String tag:tags){
            sets.add(tag);
        }
        condition.setValues(sets);
        condition.setOptType("and");
        audience.addCondition(condition);
        pushDTO.setAudience(audience);
        PushApi pushApi = myApiHelper.creatApi(PushApi.class);
        ApiResult<TaskIdDTO> apiResult = pushApi.pushByTag(pushDTO);
        rb.setCode(apiResult.getCode());
        rb.setMsg(apiResult.getMsg());
        rb.setData(apiResult.getData());
        return rb;
    }


}

実際、ツール クラスの内容からおおよその意味が推測できます。詳細については、Push Server Documentation Push API-Tui Document Centerを参照してください。    

実際には、パラメータを構築してリクエストし、プッシュ サーバーの動作をリクエストします。

八、包装テスト

エミュレータまたは携帯電話上で直接実行したい場合は、Uniapp の実行が標準ドックとカスタム ドックに分かれているため、効果はありません。

簡単に説明すると、標準ベースは単純なデバッグに使用され、ネイティブ層が変更されていない場合、新しいコードを動的にロードし、ホットリロードで実行できます。ただし、ネイティブ レイヤーを変更する場合は、それを Android apk または ios ipa パッケージにパッケージ化する必要があります。このままではログの監視もできず、デバッグや開発段階で非常に面倒なのでカスタムベースを用意しています。

[実行] -> [携帯電話またはエミュレータで実行] -> [カスタム デバッグ ベースの作成] をクリックします。

 

公式声明も非常に明確で、カスタム ベースを使用すると、これらのサードパーティ SDK 構成も有効になり、構成を再度変更しない限り、パッケージ化する必要があるのは 1 回だけです。

作成は比較的簡単です。ここでは独自の証明書を使用することをお勧めします。したがって、制限はありません。生成された証明書は、ブログの下部にある記事 (jks ファイル) にあります。他の形式を使用する人もいます。そうではありません。重要なのは、これは単なる Android 証明書です。次に、カスタム デバッグ ベース、従来のパッケージを開くことを選択し、パッケージを待つことを確認します。

 次に、「実行」をクリックし、カスタム ベースの実行を選択します。エミュレータまたはコンピュータに接続されている実マシン上でカスタム ベースを直接実行し、プッシュ ジョイント デバッグを実行して効果を確認できます。

9. uniapp をローカルで apk としてパッケージ化します (使用する場合は、以下をお読みください)

ローカル Android Studio を使用して APK をパッケージ化する場合は、上記の操作に加えて、jar/aar パッケージをインポートする必要があります。ローカルパッケージング uniapp の使用方法は以前のブログで説明されているので、ここでは多くを述べません。

以前にダウンロードしたプロジェクトの SDK フォルダーに、対応する jar/aar パッケージがあります。

全部入れるのではなく、必要に応じて取り出して、これを入れます

 

 次に、プロジェクトの build.gradle (最も外側の build.gradle ではない) の下に、次のように Android の下に、manifestPlaceholders コードを追加します。合計 4 つの値、uniapp の appid、次に unipush の構成、最後に Android プロジェクトを追加します。パッケージ名、applicationId はパッケージ名です。applicationId と同じを入力する必要があります

 最後に、忘れずに開発者センターにアクセスして、パッケージ名と署名を変更してください。

Android Studio のパッケージ名と、パッケージ化された APK 証明書の sha1 値を入力します。これについては、以前にパッケージ化したブログでも説明されています。ここでは詳しく説明しません。ここまでで、すべて終了です。

パッケージ化ブログのアドレス:   Hbuilderx uniapp local Packaging android project

余分な言葉

最後に、Mi 携帯電話は重要でない通知のプッシュを非表示にすることに注意する必要があります(通知メッセージが受信されていないわけではありません)。この問題を解決するには、Mi 開発プラットフォームでチャネルを申請する必要があります。メッセージレベルを調整するには、重要レベルに設定します。時間があるときにここで更新します。まずこのドキュメントを自分で読んでください:ドキュメント センター

私の個人的な創作物で、類似点がある場合、それは全くの偶然であるか、変更を加えるために私に連絡してください。出典を明記して転載またはCVの組み合わせをお願いします。ありがとうございます! (質問や間違いがある場合は、私の QQ:752231513 までご指摘ください)

おすすめ

転載: blog.csdn.net/qq_30548105/article/details/128219723