zoukankan      html  css  js  c++  java
  • [转]ANDROID NOTIFICATIONS USING CORDOVA AND IONIC

    本文转自:http://intown.biz/2014/04/11/android-notifications/

    ANDROID NOTIFICATIONS USING CORDOVA AND IONIC

    So you want to add push notifications to your Cordova/Android/Ionic app? I’ll walk through it. Most of this entry applies to Cordova and Android, in case you’ve made the mistake of NOT using Ionic…

    Basic Info

    Android notifications work through Google GCM (Google Cloud Messaging). You can read the details at http://developer.android.com/google/gcm/index.html, but here’s the summary:

    GCM Explained

    Here’s the narrative version:  When your application starts up, the Android device registers with GCM server, which responds with a Registration ID.   The device then sends the registration ID to our Message Server, which stores it for future use.  Other information, such as the user’s name or location, can be sent for message targeting.

    When we want to send out a notification, our Message Server sends the text to the GCM server, along with the registration ID and the API .  The GCM server relays info to the device.

    The GCM Server

    Setting up your Google GCM server should be a fairly quick process. It’s a simple mechanism from our perspective, but does a lot of the heavy lifting for us. Follow these directions to get it running: http://developer.android.com/google/gcm/gs.html. Be sure to make note of your GCM Project ID, and your API Key. The Project ID will go into your Android app configuration, for registration. The API Key is used to send notifications.

    The Notification Server

    There are any number of ways to do this, and from what I’ve seen, folks often use custom code for this. Of coruse there are some off the shelf products. But for development, I recommend the node-gcm project https://github.com/ToothlessGear/node-gcm. It’s a super-simple way to communicate with the GCM server. First install

    npm install node-gcm

    Next set up a node script similar to this one:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    var gcm = require('node-gcm');
    var message = new gcm.Message();
     
    //API Server Key
    var sender = new gcm.Sender('INSERT_YOUR_API_SENDER_KEY_HERE');
    var registrationIds = [];
     
    // Value the payload data to send...
    message.addData('message', "Hello Cordova!");
    message.addData('title','Push Notification Sample' );
    message.addData('msgcnt','2'); // Shows up in the notification in the status bar
    message.addData('soundname','beep.wav'); //Sound to play upon notification receipt - put in the www folder in app
    message.collapseKey = 'demo';
    message.delayWhileIdle = true; //Default is false
    message.timeToLive = 3000;// Duration in seconds to hold in GCM and retry before timing out. Default 4 weeks (2,419,200 seconds) if not specified.
     
    // At least one reg id required
    registrationIds.push('THIS_IS_THE_REGISTRATION_ID_THAT_WAS_GENERATED_BY_GCM');
     
    /**
     * Parameters: message-literal, registrationIds-array, No. of retries, callback-function
     */
    sender.send(message, registrationIds, 4, function (err, result) {
        console.log(result);
    });

    The Android App

    As you know by now, you need a plugin to do just about anything in Cordova. So install the PushPlugin https://github.com/phonegap-build/PushPlugin. This should be the only plugin you need
    for both Android and iOS. You might want to scan the instructions, but (as of now) they are both overly complicated and incomplete. For starters, you don’t need PlugMan to install. Just use:

    cordova plugin add https://github.com/phonegap-build/PushPlugin.git

    The coding was a little bit tricky, but I finally managed a functional script for Ionic notifications. See inline comments for more information on what’s going on here:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    //factory for processing push notifications.
    angular.module('pushnotification', [])
       .factory('PushProcessingService', function() {
            function onDeviceReady() {
                console.info('NOTIFY  Device is ready.  Registering with GCM server');
                //register with google GCM server
                var pushNotification = window.plugins.pushNotification;
                pushNotification.register(gcmSuccessHandler, gcmErrorHandler, {"senderID":gcmAppID,"ecb":"onNotificationGCM"});
            }
            function gcmSuccessHandler(result) {
                console.info('NOTIFY  pushNotification.register succeeded.  Result = '+result)
            }
            function gcmErrorHandler(error) {
                console.error('NOTIFY  '+error);
            }
            return {
                initialize : function () {
                    console.info('NOTIFY  initializing');
                    document.addEventListener('deviceready', onDeviceReady, false);
                },
                registerID : function (id) {
                    //Insert code here to store the user's ID on your notification server.
                    //You'll probably have a web service (wrapped in an Angular service of course) set up for this.
                    //For example:
                    MyService.registerNotificationID(id).then(function(response){
                        if (response.data.Result) {
                            console.info('NOTIFY  Registration succeeded');
                        } else {
                            console.error('NOTIFY  Registration failed');
                        }
                    });
                },
                //unregister can be called from a settings area.
                unregister : function () {
                    console.info('unregister')
                    var push = window.plugins.pushNotification;
                    if (push) {
                        push.unregister(function () {
                            console.info('unregister success')
                        });
                    }
                }
            }
        });
     
    // ALL GCM notifications come through here.
    function onNotificationGCM(e) {
        console.log('EVENT -> RECEIVED:' + e.event + '');
        switch( e.event )
        {
            case 'registered':
                if ( e.regid.length > 0 )
                {
                    console.log('REGISTERED with GCM Server -> REGID:' + e.regid + "");
     
                    //call back to web service in Angular.
                    //This works for me because in my code I have a factory called
                    //      PushProcessingService with method registerID
                    var elem = angular.element(document.querySelector('[ng-app]'));
                    var injector = elem.injector();
                    var myService = injector.get('PushProcessingService');
                    myService.registerID(e.regid);
                }
                break;
     
            case 'message':
                // if this flag is set, this notification happened while we were in the foreground.
                // you might want to play a sound to get the user's attention, throw up a dialog, etc.
                if (e.foreground)
                {
                    //we're using the app when a message is received.
                    console.log('--INLINE NOTIFICATION--' + '');
     
                    // if the notification contains a soundname, play it.
                    //var my_media = new Media("/android_asset/www/"+e.soundname);
                    //my_media.play();
                    alert(e.payload.message);
                }
                else
                {
                    // otherwise we were launched because the user touched a notification in the notification tray.
                    if (e.coldstart)
                        console.log('--COLDSTART NOTIFICATION--' + '');
                    else
                        console.log('--BACKGROUND NOTIFICATION--' + '');
     
                    // direct user here:
                    window.location = "#/tab/featured";
                }
     
                console.log('MESSAGE -> MSG: ' + e.payload.message + '');
                console.log('MESSAGE: '+ JSON.stringify(e.payload));
                break;
     
            case 'error':
                console.log('ERROR -> MSG:' + e.msg + '');
                break;
     
            default:
                console.log('EVENT -> Unknown, an event was received and we do not know what it is');
                break;
        }
    }

    Call it from here:

    1
    2
    3
    4
    app.run(function(PushProcessingService) {
       //run once for the app
       PushProcessingService.initialize();
    });

    Hopefully this is helpful to someone!

    Thanks to these folks (and others) who put together helpful blogs on this topic:

  • 相关阅读:
    Filter的基本配置
    11.3、4(filter的生命周期和API)、
    11.1(过滤器概述)、(创建过滤器filter)
    10.6商品的促销活动,(未解决)
    php 调用常量或者变量的时候千万不能加引号""'' 不然不生效
    thinkphp5 if else的表达式怎么写?
    request() 获取参数是数组不是对象
    thinkphp5 PATHINFO路由正确的访问方式
    thinkphp5 的iframe文件怎么显示到html里面
    thinkphp5引入外部css js文件
  • 原文地址:https://www.cnblogs.com/freeliver54/p/5366650.html
Copyright © 2011-2022 走看看