序文:
メッセージを購読するたびに、それをオンラインに貼り付けたりコピーしたりしていますが、うまくいくときもあれば、うまくいかないときもあり、興奮できないこともあります。不思議な現象がたくさんあったので、時間をかけて投稿しました。参考程度に整理してください。
特徴/プロセス:
【方法】
wx.getSetting、
withSubscriptions: true、
res.subscriptionsSetting.mainSwitch、
res.subscriptionsSetting.itemSettings、
wx.showModal、
wx.openSetting,
wx.requestSubscribeMessage
【目的】
認可ステータスの取得
【プロセス】
状態 1: メイン スイッチがオン - テンプレート メッセージが承認されている - すべてのテンプレート メッセージが承認されている (上記のメソッドのいずれかが通過するため、テンプレート ID をトラバースすることで判断されます)
状態 2: メインスイッチがオン - 許可されたテンプレート メッセージ - 許可されていないテンプレート メッセージがある (上記のいずれかのメソッドが通過するため、テンプレート ID をトラバースすることで判断されます)
状態 3 メイン スイッチがオン - 不正なテンプレート メッセージ
状態 4: メインスイッチが閉じている
ステータス 1_1 -> 次のステップ (注文の送信など)
ステータス 2_1 -> 二次確認ポップアップ ウィンドウを表示 (サブスクリプション メッセージが開かれていないことが検出されました。設定に移動しますか?)
ステータス 3_1 -> 認可ポップアップウィンドウの呼び出し (wx.requestSubscribeMessage)
ステータス 4_1 -> 二次確認ポップアップ ウィンドウ (サブスクリプション メッセージがオンになっていないことが検出されました。設定に移動しますか?)
ステータス 2_1_1 -> キャンセル 移動 -> 次のステップ (例: 注文の送信)
ステータス2_1_2 -> OK -> 設定ページへジャンプ(openSetting)
ステータス 3_1_1 -> テンプレートのチェックを外します。チェックを外した場合、上記の選択は常に維持され、キャンセルのみ可能です。
ステータス 3_1_2 -> テンプレートのチェックを外し、上記の選択を常に維持するにはチェックを入れます。キャンセルのみ可能です。
ステータス 3_1_3 -> テンプレート内の特定のテンプレートにチェックを入れます、チェックが入っていない場合は、上記の選択が常に維持されます。
ステータス 3_1_4 -> テンプレート内の特定のテンプレートにチェックを入れます。チェックを入れないと、上記の選択が常に維持されます。許可
ステータス 3_1_5 -> テンプレート内の特定のテンプレートにチェックを入れ、常に上記の選択を維持するにチェックを入れ、キャンセルします
ステータス 3_1_6 -> テンプレート内の特定のテンプレートをチェックし、常に上記の選択を保持するをチェックし、許可します
ステータス 3_1_7 -> すべてのテンプレートをチェックし、上記の選択を常に維持するにはチェックを外し、キャンセルします
ステータス 3_1_8 -> すべてのテンプレートをチェックし、上記の選択を常に保持するチェックを外し、許可します
ステータス 3_1_9 -> すべてのテンプレートをチェックし、常に上記の選択を維持するをチェックし、キャンセルします
ステータス 3_1_10 -> すべてのテンプレートをチェックし、常に上記の選択を保持するをチェックし、許可します
ステータス 4_1_1 -> キャンセル 移動 -> 次のステップ (例: 注文の送信)
ステータス4_1_2 -> OK -> 設定ページへジャンプ(openSetting)
ステータス 2_1_2_1 -> 未チェック/未チェック -> 返品後 -> 次のステップ (例: 注文の送信)
ステータス 2_1_2_2 -> チェック済み -> 返品後 -> 次のステップ (例: 注文の送信)
ステータス 3_1_1_1 -> キャンセル後、テンプレートは設定に表示されません -> 次のステップ (注文の送信など)
ステータス 3_1_2_1 -> キャンセル後、設定にテンプレートが表示されますが、すべて受け入れられません -> 次のステップ (注文の送信など)
ステータス 3_1_3_1 -> キャンセル後、テンプレートは設定に表示されません -> 次のステップ (注文の送信など)
ステータス 3_1_4_1 -> 許可後、テンプレートは設定に表示されません (この時点で許可が有効かどうかはまだ議論されていません) -> 次のステップ (注文の送信など)
ステータス 3_1_5_1 -> キャンセル後、設定にテンプレートが表示されますが、すべて受け入れられません -> 次のステップ (注文の送信など)
ステータス 3_1_6_1 → 許可後、テンプレートが設定に表示されます チェックが入っている状態が受領状態、チェックが入っていない状態が非受領状態 → 次のステップ(注文の送信など)
ステータス 3_1_7_1 -> キャンセル後、テンプレートは設定に表示されません -> 次のステップ (注文の送信など)
ステータス 3_1_8_1 -> 許可後、テンプレートは設定に表示されません -> 次のステップ (注文の送信など)
ステータス 3_1_9_1 -> キャンセル後、設定にテンプレートが表示されますが、すべて受け入れられません -> 次のステップ (注文の送信など)
ステータス 3_1_10_1 -> 許可後、テンプレートが設定に表示され、すべて受信ステータスになります -> 次のステップ (注文の送信など)
ステータス 4_1_2_1 -> サブスクリプション メッセージを受信するためにメイン スイッチをオンにします
ステータス 4_1_2_2 -> サブスクリプション メッセージを受信するためのメイン スイッチを無効にします
ステータス 4_1_2_1_1 -> 戻った後 -> 2 番目の確認ポップアップ ウィンドウが表示されます (購読メッセージが開かれていないことが検出されました。設定に移動しますか?)
ステータス 4_1_2_2_1 -> 返品後 -> 次のステップ (例: 注文の送信)
ステータス 4_1_2_1_1_1 -> キャンセル -> 次のステップ (注文の送信など)
ステータス 4_1_2_1_1_2 -> OK -> ステータス 3_1
要約する
承認ポップアップウィンドウのチェックが外されている場合は、常に上記の選択ボタンを押したままにしてください。テンプレートの選択の有無、キャンセルまたは許可に関係なく、テンプレートは設定に表示されません(テンプレートの選択と許可が成功したかどうか) ? 未知)
承認ポップアップウィンドウでは常に上記の選択ボタンを押したままにし、キャンセル後はすべてのテンプレートを選択しても、特定のテンプレートを選択しても、設定にテンプレートが表示され、受信されなくなります。
承認ポップアップ ウィンドウで上記の選択を常にチェックしたままにし、許可すると、設定にテンプレートが表示され、ステータスが確認されます。
何度も操作を繰り返した結果、再度設定ミスや認証ミスが確認され、ほぼクローズ状態となった。
知らせ
メインスイッチを設定した後、認証なしで検出テンプレートに戻っても直接認証ポップアップウィンドウを呼び出すことができない場合は、二次確認ポップアップウィンドウを使用して確認する必要があります。
プロセスのスクリーンショット
メインスイッチ
テンプレートが開かれていない/常に保持ボタンがチェックされていないため、キャンセルされています。
すべてのテンプレートを有効にする/常に保持して許可するにチェックを入れる
テンプレート部分がオンになっている/常に許可を維持するにチェックを入れる
認証ポップアップウィンドウ
完全なコード
理解しやすいようにメソッドを分けて書いていますが、コードの繰り返しが多いのが難点ですので、自分でカプセル化してマージしてください。
最初のステップは thia.dingyue();
that.onSubmit(); は次の送信メソッドです
// 验证订阅状态
dingyue(type){
let that = this;
wx.getSetting({
withSubscriptions: true,
success: function(res) {
if (res.subscriptionsSetting.mainSwitch) {
// 用户已开启总开关
let itemSettings = res.subscriptionsSetting.itemSettings;
if (itemSettings) {
// 用户已授权模板消息
let status = true;
//判断模板是否全部授权
for(let i=0; i<tmplIds.length; i++){
let key = tmplIds[i];
if(itemSettings[key] != 'accept'){
status = false;
break;
}
}
if(!status){
that.weidingyue_muban();
}else{
that.onSubmit();
}
} else {
// 用户未授权任何模板消息
if(type == 'kaiguan'){ // 设置返回后提示是否授权模板
that.onSettingNotSubscribeMessage();
return;
}
that.openSubscribeMessage();
}
} else {
// 用户未开启总开关
if(type == 'kaiguan'){ // 设置返回后仍未开启进入下一步
that.onSubmit();
return;
}
that.weidingyue_kaiguan();
}
}
});
},
// 未开启订阅 开关
weidingyue_kaiguan(){
let that = this;
wx.showModal({
title: '提示',
content: '检测到您未开启订阅消息,是否前往设置?',
success (res) {
if (res.confirm) {
that.openSetting('kaiguan');
} else if (res.cancel) {
that.onSubmit();
}
}
})
},
// 未开启订阅 模板
weidingyue_muban(){
let that = this;
wx.showModal({
title: '提示',
content: '检测到有订阅消息未开启,是否前往设置?',
success (res) {
if (res.confirm) {
that.openSetting('muban');
} else if (res.cancel) {
that.onSubmit();
}
}
})
},
// 打开设置
openSetting(type){
let that = this;
wx.openSetting({
success: function(res) {
// 返回后流程
if(type == 'muban'){
that.onSubmit();
} else if(type == 'kaiguan'){
// 再次验证订阅状态
that.dingyue('kaiguan');
}
},
fail: function(err) {
that.settingFail(type);
}
});
},
// 设置失败
settingFail(type){
let that = this;
wx.showModal({
title: '提示',
content: '设置失败,是否重新设置?',
success (res) {
if (res.confirm) {
that.openSetting(type);
} else if (res.cancel) {
that.onSubmit();
}
}
})
},
// 设置开启总开关返回后,并未授权的情况(如果不加二次确认弹窗,无法直接唤起授权弹窗)
onSettingNotSubscribeMessage(){
let that = this;
wx.showModal({
title: '提示',
content:'检测到有订阅消息未授权,是否授权?',
success (res) {
if (res.confirm) {
that.openSubscribeMessage();
} else if (res.cancel) {
that.onSubmit();
}
}
})
},
// 唤起授权订阅弹窗
openSubscribeMessage(){
let that = this;
wx.requestSubscribeMessage({
tmplIds,
success(res) {
that.onSubmit();
},
fail(err) {
that.subscribeMessageFail();
}
})
},
// 授权失败
subscribeMessageFail(){
let that = this;
wx.showModal({
title: '提示',
content:'授权失败,是否重新授权?',
success (res) {
if (res.confirm) {
that.openSubscribeMessage();
} else if (res.cancel) {
that.onSubmit();
}
}
})
},