在关闭的应用程序上未收到推送通知

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 设备上未收到

Asp.net 推送通知 [关闭]

在 android 中关闭应用程序时,在真实设备上未收到一个信号通知

通过cURL / PHP发送时,设备上未收到Firebase通知

在活动中存储/保存收到的推送通知[关闭]