在关闭的应用程序上未收到推送通知
Posted
技术标签:
【中文标题】在关闭的应用程序上未收到推送通知【英文标题】:Not receiving push notification on closed app 【发布时间】:2016-05-20 07:37:23 【问题描述】:我正在尝试开发一个带有 phonegap 构建的移动网络应用程序,并通过亚马逊 SNS 实现推送通知。 我目前正在android上进行测试,并且我设法在应用程序处于后台或前台时使通知工作,但是如果我完全终止应用程序,则不会收到通知。 一旦我启动应用程序,它就会收到“待处理”通知。 我进行了广泛的搜索,但没有找到解决方案,因为我在后台和前台收到通知,并且我没有收到来自 AWS 的任何错误,我认为设备和服务器端的注册是正确的。
即使应用程序完全关闭,我如何在标准状态栏中接收通知?
这里有一些代码:
客户
jQuery(document).ready(function($)
document.addEventListener("deviceready", onDeviceReady, false);
);
function onDeviceReady()
pushNotificationFlow();
function pushNotificationFlow()
var pushNotification = window.plugins.pushNotification;
window.GCMsenderID = '123456789';
if(isMobile.Android())
//android
pushNotification.register(successHandler, errorHandler,"senderID": window.GCMsenderID,"ecb":"onNotificationGCM");
else
//ios
pushNotification.register(tokenHandler, errorHandler,
"badge":"true",
"sound":"true",
"alert":"true",
"ecb":"onNotificationAPNS" );
function tokenHandler (result)
var idUser=getLocalUser();
if ( result.length > 0 )
$.post('http://myserver.com/my_serverside_registration.php',
token: result,
shop: window.shop,
type: 'APNS',
id_user: idUser
,function( data )
);
function successHandler (result)
function errorHandler (error)
function onNotificationGCM (e)
$.post('http://pointcard.stayted.com/pushTest.php',
log: JSON.stringify(e)
);
switch( e.event )
case 'registered':
if ( e.regid.length > 0 )
var idUser=getLocalUser();
$.post('http://myserver.com/my_serverside_registration.php',
token: e.regid,
shop: window.shop,
type: 'GCM',
id_user: idUser
,function( data )
);
break;
case 'message':
// this is the actual push notification. its format depends on the data model from the push server
alert('message = '+e.message+' msgcnt = '+e.msgcnt);
break;
case 'error':
break;
default:
break;
function onNotificationAPNS (e)
if ( e.alert )
chocolatApp.addNotification(
title: 'mytitle',
message: e.alert,
media: '<img style="border-radius:100%" src="dist/img/appIcon.png">'
);
if ( e.sound )
var snd = new Media(e.sound);
snd.play();
if ( e.badge )
pushNotification.setApplicationIconBadgeNumber(successHandler, errorHandler, e.badge);
服务器
//create amazon SNS client
require_once dirname(__FILE__).'/vendor/autoload.php';
use Aws\Sns\SnsClient;
$message = 'test message '.date('d/m/Y G:i',time());
$title= 'mytitle';
$AWS_apiKey = 'my_apiKey';
$AWS_apiSecret = 'my_apiSecret';
$region = 'region';
$topicArn = 'my_topicArn';
$endpointArn = 'my_endpointArn';
// Instantiate with your AWS credentials
$client = SnsClient::factory(array(
'credentials' => array(
'key' => $AWS_apiKey,
'secret' => $AWS_apiSecret,
),
'region' => $region
));
//Publish
try
$array = array(
//'TopicArn' => $topicArn,
'TargetArn' => $endpointArn,
// Message is required
'Message' => json_encode(array(
'default' => 'default',
'APNS' => json_encode(array(
'aps' => array(
'alert' => $message,
"sound" => "default",
),
)),
'APNS_SANDBOX' => json_encode(array(
'aps' => array(
'alert' => $message,
"sound" => "default",
),
)),
'GCM' => json_encode(array(
'data' => array(
'message' => $message,
'title' => $title,
)
)),
)),
'MessageStructure' => 'json',
'MessageAttributes' => array(
// Associative array of custom 'String' key names
'String' => array(
// DataType is required
'DataType' => 'String',
'StringValue' => 'String'
//'BinaryValue' => 'String',
),
),
);
$messageID = $client->publish($array);
catch (\Exception $e)
$error = $e->getMessage();
if(!empty($error))
$alert.="<div class=\"alert alert-danger\">
<strong>Error</strong>: ".print_r($error,true)."
</div>";
elseif(!empty($message) AND empty($alert) )
$alert.="<div class=\"alert alert-success\">
<strong>Ok.</strong> success.
</div>";
编辑:我指的是从“最近”关闭应用程序,而不是从设置中强制停止它 -> 应用程序
【问题讨论】:
GCM push notification works after app Force Stop?的可能重复 自 Android 3.1 起,如果应用完全死机,这是预期的 android 行为。请参阅链接帖子的已接受答案。干杯! :) 我使用 Google Cloud Messaging 实现了推送通知,即使应用程序完全关闭,我也会收到消息。也许您可以尝试将消息服务器端的生存时间设置为 0 或其他变量。在 GCM 的情况下,您必须实现 GCMListenerService 并且即使应用程序完全关闭,该服务也会继续运行。编辑:取决于您所说的完全关闭是什么意思,如果您在设置中强制关闭它将不起作用,但如果您只是在“最近的应用程序”中杀死它,它应该仍然可以工作。 我对从设置中停止的应用不感兴趣,我的意思是应用被“最近的应用”杀死 【参考方案1】:尝试使用一些现成的平台从服务器端推送通知,例如 PubNub: https://www.pubnub.com/blog/2015-06-23-getting-started-with-gcm-android-push-notifications-and-pubnub/ https://www.pubnub.com/blog/2015-06-24-sending-receiving-android-push-notifications-with-gcm-google-cloud-messaging/ 我也在使用它们,它们工作正常。
【讨论】:
我可以尝试,但我认为我的问题出在客户端 只需访问他们提供的链接以及处理客户端的代码。【参考方案2】:尝试使用
<uses-permission android:name="android.permission.WAKE_LOCK" />
【讨论】:
以上是关于在关闭的应用程序上未收到推送通知的主要内容,如果未能解决你的问题,请参考以下文章
从 appery 发送时,iPhone 上未收到推送通知消息
Worklight 6.2:成功发送标签推送通知,但在 android 设备上未收到
在 android 中关闭应用程序时,在真实设备上未收到一个信号通知