質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cordova

Cordovaは様々なデバイスで使うことができるオープンソースなモバイル用開発プラットフォームです。開発者に各デバイスの元のプラットフォームで開発する必要をなくし、HTML・JavaScript・CSSなどの一般的なウェブのテクノロジーを使ってすべてのデバイスで展開することができるモバイルのアプリケーションを生成することを可能にします。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

690閲覧

Phonegap(cordova)で、アプリがバックグラウンド時にプッシュ通知をした時に、バッジの値を変更したい

K_Endo

総合スコア13

Cordova

Cordovaは様々なデバイスで使うことができるオープンソースなモバイル用開発プラットフォームです。開発者に各デバイスの元のプラットフォームで開発する必要をなくし、HTML・JavaScript・CSSなどの一般的なウェブのテクノロジーを使ってすべてのデバイスで展開することができるモバイルのアプリケーションを生成することを可能にします。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2018/01/03 04:35

###前提・実現したいこと
PhonegapでiOSアプリを開発しています。

phonegap-plugin-pushを使って、
プッシュ通知を受信した時にバッジ数を増やす処理を
実装しようとしています。

プッシュ通知の送信サーバー側では、バッジの値を設定せず、
アプリがプッシュ通知を受信した時に、今のバッジ数を取得し、
1つインクリメントしてバッジを設定するという処理を実現したいです。

###発生している問題・エラーメッセージ

push.getApplicationIconBadgeNumberと push.setApplicationIconBadgeNumberを使って、 アプリがForegroundの時は下記のコードで動きましたが、 アプリがBackground、Suspended、Not runningの時は 動きませんでした。 下記のページ https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/API.md#pushfinishsuccesshandler-errorhandler-id---ios-only には push.setApplicationIconBadgeNumberの説明が 「Set the badge count visible when the app is not running」 push.getApplicationIconBadgeNumberの説明が 「Get the current badge count visible when the app is not running」 となっておりますが、わたしが書いたコードでは、 アプリがForegroundの時でも動作していますし アプリがNot runningの時にプッシュ通知を送信しても バッジ数は変わりませんでした。 そもそも、上記ページに書かれている仕様が、間違っているのでしょうか?

###該当のソースコード

var app = { // Application Constructor initialize: function() { this.bindEvents(); }, bindEvents: function() { document.addEventListener('deviceready', this.onDeviceReady, false); }, onDeviceReady: function() { console.log('Received Device Ready Event'); console.log('calling setup push'); console.log('platform : '+device.platform); if ((device.platform == 'iOS') || (device.platform == 'Android')) { app.setupPush(); } }, setupPush: function() { console.log('calling push init'); var push = PushNotification.init({ "android": { "senderID": "xxxxxxxxxx" }, "browser": {}, "ios": { "sound": true, "vibration": true, "badge": true }, "windows": {} }); push.on('registration', function(data) { console.log('registration event: ' + data.registrationId); var oldRegId = localStorage.getItem(key); console.log('oldRegId : ' + oldRegId); if (oldRegId !== data.registrationId) { console.log('different ID'); localStorage.setItem(key, data.registrationId); } }); push.on('error', function(e) { console.log("push error = " + e.message); }); push.on('notification', function(data) { console.log('notification event'); navigator.notification.alert( data.message, // message null, // callback data.title, // title 'Ok' // buttonName ); push.getApplicationIconBadgeNumber(function(count) { console.log('get badge : ' + count); count++; push.setApplicationIconBadgeNumber(function() { console.log('set badge : ' + count); }, function() { console.log('set badge error'); }, count); }, function() { console.log('get badge error'); }); }); } };

###試したこと
プッシュ通知の送信サーバー側で
content-available=1
を設定しても、しなくても、動作に変化はありませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
crodova version : 7.1.0
platform iOS : 4.5.4
phonegap-plugin-push : 1.10.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決できました。

ただし、アプリがNot running、つまり起動していない時は
バッジの値を更新できません。

おそらく実現不可能と思われるので、仕様だと思って、あきらめます。

どうしてもNot runningの時にバッジを更新したいなら、
送信サーバー側でbadgeを指定すれば、できると思います。

以下、解決方法です。

■1 Background Fetchのプラグインを使う。

つまり、config.xml ファイルに
<plugin name="cordova-plugin-background-fetch" source="npm" />
を設定する

■2 アプリのバックグラウンド更新を有効にする。

iPhoneの
「設定」→「一般」→「Appのバックグラウンド更新」
から、対象となるアプリのバックグラウンド更新を有効にする。

■3 送信データにcontent-available=1とidを設定する

下記は、送信データの一例

{ "aps": { "alert": "Hello World","content-available": 1 }, "id" : 3 }

この例では、id=3に設定した。

このidは、次のpush.finish関数で使用する。

■4 push.finish関数を追加する。

push.on('notification', function(data){});
の関数に、下記のように追加する。

data.additionalData.の後に続くidは、先述の送信データのidと名前を一致させる。
(push.finishの仕様も確認してもらえれば分かると思います)

push.on('notification', function(data) { console.log('notification event'); navigator.notification.alert( data.message, // message null, // callback data.title, // title 'Ok' // buttonName ); push.getApplicationIconBadgeNumber(function(count) { //alert('get badge : ' + count); console.log('get badge : ' + count); count++; push.setApplicationIconBadgeNumber(function() { console.log('set badge : ' + count); }, function() { console.log('set badge error'); }, count); }, function() { console.log('get badge error: ' + count); }); //alert('notId: ' + data.additionalData.notId); console.log('notification id: ' + data.additionalData.id); // do something with the push data // then call finish to let the OS know we are done push.finish(function() { console.log("processing of push data is finished"); }, function() { console.log("something went wrong with push.finish for ID =", data.additionalData.id) }, data.additionalData.id); });

投稿2018/01/07 08:02

K_Endo

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問