精华内容
下载资源
问答
  • iOS 开发之实现 App 消息推送(最新)

    万次阅读 多人点赞 2014-11-19 21:13:10
    今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:...

    好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适)

    第一部分

    首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps:其实每一篇教程都有),先来看一张苹果官方对其推送做出解释的概要图。

    Provider是给你手机应用发出推送消息的服务器,而APNS(Apple Push Notification Service)则是苹果消息推送服务器。你本地的服务器当需要给应用推送一条消息的时候,先要将消息发出到苹果推送服务器,然后再由苹果推送服务器将消息发到安装了该应用的手机。

    接下来再看一张解释图:

     

    根据上图的逻辑我来给大家解释一下:

    1.你的IOS应用需要去注册APNS消息推送功能。

    2.当苹果APNS推送服收到来自你应用的注册消息就会返回一串device token给你(很重要)

    3.将应用收到的device Token传给你本地的Push服务器。

    4.当你需要为应用推送消息的时候,你本地的推送服务器会将消息,以及Device Token打包发送到苹果的APNS服

    5.APNS再将消息推送给目的iphone

     

    第二部分

    1.从证书颁发机构颁发证书

    打开你mac的钥匙串访问: 然后点击钥匙串访问

     

    随后它会弹出一个窗口用户电子邮件信息就填写你苹果开发者账号的名称即可(应该是一个邮件名称),点击保存到磁盘的选

    项,点击继续,显示如下:

     

    点击存储,文件名为:CertificateSigningRequest.certSigningRequest 随后将他放在一个文件夹中我们取名push吧!

     

    第三部分

    访问苹果开发者网址:https://developer.apple.com/

     

    选中MemberCenter选项,进入登陆页面,用你的苹果开发者账号登陆,过一会网页就会自动跳转到下图。

    点击红色所选部分内容进行下一步的操作。

    选择Certificates选项,设置证书,如图所示先解释一下:

     

     

    Development选项的作用顾名思义就是用来作为开发使用的证书,Production选项则是用来发布产品使用的,名称很陌生是不是,之

    前的开发者网页是没有这一选项的,可能是苹果把他修改了,用这个名称更加能让人理解吧(字面上解释就是产品么)。两个选项生

    成证书的步骤是一样的,现在我们使用开发者的选项进行证书的制作,步骤如下:选择Development选项:

     

    点击上面的加号选项,

     

    选择APNS选项(开发么当然是在沙盒环境下了,模拟真实情况),然后Continue

     

    这个AppID我们在下一部分讲如何生成,现在我用的是已经生成好的一个应用ID,继续Continue

     

    这边就要选择在钥匙串访问环节下载下来的CertificateSigningRequest.certSigningRequest文件了,选择并生成:

    点击下载,得到aps_development .cer,保存到push文件中去。

     

    第四部分

    新建一个AppID,选择网页上的AppIDs,然后点击右上角的 “加号”

     

    App的取名只要按照苹果要求的就可以了

     

    然后BundleID是比较重要的,在提交审核以及测试(苹果的TestFlight)和付费环节都需要用到,也只需按照苹果要求来写就好了。

     

    接下来就是对你的应用需要使用苹果的哪些服务进行选择就行了,例如广告,游戏中心,推送,付费等等情况。

    最后选择“Submit”选项,在下一个界面中选择“done”选项,这样我们设置AppID的步骤我们就完成了。


    第五部分:生成Provisioning Profiles

    这个配置概要文件分为两种,一种是为开发使用的,还有一种则是为发布到appStore上面。

    创建发布版的ProvisioningProfile与开发版的流程相同,点击Development然后点击右上角的加号

     

    会进入选择何种配置概要文件的界面:

     

    我们现在时测试,所以选择“IOS App Development”的选项,在下面的Distribution发布选项中有两个选择,“App Store”以及

    “Ad hoc”,你可以根据下面的描述选择你发布所需的选项。点击Continue进入下一步。

    选择你上一步创建的AppID,点击Continue 进行下一步

    选择你的开发者账号,Continue进行下一步

    在这一步上选择你的设备(你只有在这一步上勾选了你的设备,你才能在设备上用这个签名进行调试)。关于如何将你的设备号添加

    进去也是非常简单的,选择左侧的"Devices",然后点击右上角的加号,在随后出来的页面上添加你设备的UUID(在XCode中可以查

    看到)以及name( 可以随便取,自己看的懂就行)然后Register一下,照着流程走到最后一步就完成了。

    好咱们继续回到上面的Provisioning Profile配置环节,当你选好了你的设备后点击“Continue”进入下一页,

     

    输入一个文件名(最好是起的能看懂是干嘛的,当然也可以随便起),点击“Generate”进入下一个页面,在这个页面中就会有一个下

    载按钮让你下载这个文件,我们把它下载下来放在Push文件夹中。

     

    第六部分

    好了,前期的准备工作都已经做完了,现在让我们开始推送吧!(吼吼)

    首先双击我们生成的 “aps_development .cer” 文件,进入钥匙串访问,找到我们的专用秘钥(根据在第二部分中从证书机构颁发证书操作中填写的常用名)

     

    我在第二部分填写的是“silicon”,由于换了一台mac之前安装的没有了,之前没有截图,所以随便找了个图给大家看一下,凭大家的聪明才智应该不难理解吧。

    然后右击导出,会弹出如下所示的图。

     

    将他存储到push文件夹中,命名为“push.p12”,在这一步中导出会让你输入密码并验证,你可以自定义一个密码,例如abc123

    现在push文件夹中应该有几个文件“aps_development .cer” ,"push.p12",“CertificateSigningRequest.certSigningRequest”以及

    刚才下下来的配置概要文件。

     

    接下来我们打开终端将他们生成.pem文件

    1.把aps_development .cer文件生成.pcm文件,cd到push文件夹下

     

    2.把push.p12文件生成为.pem文件

    上边输入的密码则是你导出证书所设的密码,即abc123.接着还会让你输入.pem文件的密码,还是使用abc123好了,防止混淆。

    这样我们在push文件夹中就又得到了两个文件,PushChatCert.pem和PushChatKey.pem。

     

    3.把PushChatCert.pem和PushChatKey.pem合并为一个pem文件,

     

    在push文件夹中又多了一个ck.pem文件,以上我们把需要使用的文件都准备好了

     

    接下来就要测试一下啦,是不是很激动~

    为了测试证书工作的状况,我们可以使用“telnet gateway.sandbox.push.apple.com 2195”来检测一下,如果显示下图则表示成功了。

     

    然后,我们使用我们生成的证书和私钥来设置一个安全的链接去链接苹果服务器

    在终端输入如下命令:openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem

    需要输入密码(abc123 我们刚才所设置的)。

    然后他会返回一系列的数据,这里我就粘贴一部分啦:

     

    CONNECTED(00000003)

    depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C

    verify error:num=20:unable to get local issuer certificate

    verify return:0

    ---

    Certificate chain

    。。。。。(省略)

    。。。。。(省略)

    。。。。。(省略)

     

        Start Time: 1416389389

        Timeout   : 300 (sec)

        Verify return code: 0 (ok)

    ---

    测试就到这里啦。。。

     

    第七部分

    1.建立推送项目

     

    //
    //  AppDelegate.m
    //  TestPushNotifiy
    //
    //  Created by silicon on 14-10-30.
    //  Copyright (c) 2014年 silicon. All rights reserved.
    //
    
    #import "AppDelegate.h"
    
    @implementation AppDelegate
    @synthesize mainView = _mainView;
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
        {
            //IOS8
            //创建UIUserNotificationSettings,并设置消息的显示类类型
            UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:nil];
            
            [application registerUserNotificationSettings:notiSettings];
            
        } else{ // ios7
            [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge										 |UIRemoteNotificationTypeSound										 |UIRemoteNotificationTypeAlert)];
        }
        
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
        
        self.mainView = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
        self.window.rootViewController = self.mainView;
        return YES;
    }
    
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken{
        NSLog(@"---Token--%@", pToken);
    }
    
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
        
        NSLog(@"userInfo == %@",userInfo);
        NSString *message = [[userInfo objectForKey:@"aps"]objectForKey:@"alert"];
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
        
        [alert show];
    }
    
    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
    
        NSLog(@"Regist fail%@",error);
    }
    
    - (void)applicationWillResignActive:(UIApplication *)application
    {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    }
    
    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }
    
    - (void)applicationWillEnterForeground:(UIApplication *)application
    {
        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
    }
    
    - (void)applicationDidBecomeActive:(UIApplication *)application
    {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }
    
    - (void)applicationWillTerminate:(UIApplication *)application
    {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }
    
    @end
    

     

    在appdelegate.m中加入以上代码,

     

     

     

    if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
        {
            //IOS8
            //创建UIUserNotificationSettings,并设置消息的显示类类型
            UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:nil];
            
            [application registerUserNotificationSettings:notiSettings];
            
        } else{ // ios7
            [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge										 |UIRemoteNotificationTypeSound										 |UIRemoteNotificationTypeAlert)];
        }

    由于ios8的推送跟ios7及以下的不一样,所以需要加判断来注册消息推送。

    函数:

     

    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken{
        NSLog(@"---Token--%@", pToken);
    }

     

    会接收来自苹果服务器给你返回的deviceToken,然后你需要将它添加到你本地的推送服务器上。(很重要,决定你的设备能不能接收到推送消息)。

     

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
        
        NSLog(@"userInfo == %@",userInfo);
        NSString *message = [[userInfo objectForKey:@"aps"]objectForKey:@"alert"];
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
        
        [alert show];
    }

     

    这个函数则是当设备接收到来自苹果推送服务器的消息时触发的,用来显示推送消息。

     

     

    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
    
        NSLog(@"Regist fail%@",error);
    }

    当注册失败时,触发此函数。

     

     

    2.PHP服务端

    将simplepush.php这个推送脚本也放在push文件夹中

     

    <?php
    
    // ??????????deviceToken???????????????
    $deviceToken = 'c95f661371b085e2517b4c12cc76293522775e5fd9bb1dea17dd80fe85583b41';
    
    // Put your private key's passphrase here:
    $passphrase = 'abc123';
    
    // Put your alert message here:
    $message = 'My first push test!';
    
    
    
    $ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
    
    // Open a connection to the APNS server
    //??????????
     //$fp = stream_socket_client(?ssl://gateway.push.apple.com:2195?, $err, $errstr, 60, //STREAM_CLIENT_CONNECT, $ctx);
    //?????????????appstore??????
    $fp = stream_socket_client(
    'ssl://gateway.sandbox.push.apple.com:2195', $err,
    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
    
    if (!$fp)
    exit("Failed to connect: $err $errstr" . PHP_EOL);
    
    echo 'Connected to APNS' . PHP_EOL;
    
    // Create the payload body
    $body['aps'] = array(
    'alert' => $message,
    'sound' => 'default'
    );
    
    // Encode the payload as JSON
    $payload = json_encode($body);
    
    // Build the binary notification
    $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
    
    // Send it to the server
    $result = fwrite($fp, $msg, strlen($msg));
    
    if (!$result)
    echo 'Message not delivered' . PHP_EOL;
    else
    echo 'Message successfully delivered' . PHP_EOL;
    
    // Close the connection to the server
    fclose($fp);
    ?>

    deviceToken填写你接收到的token,passPhrase则填写你的ck.pem设置的密码。

    此刻就是见证奇迹的时候了,使用终端进入到push文件夹,在终端输入 php simplepush.php

     

    若显示以上提示则表示推送成功了。附上一张成功图。

     

    推送就到这边吧!

    感谢这篇博客的指导:http://blog.csdn.net/showhilllee/article/details/8631734

     

    simplepush.php以及XCode工程我会上传到我的资源里去,大家可以去那边下载。有什么不明白的地方大家可以留言或者私信我,我会第一之间回复的~

     

     

    大家可以关注我的微信公众号与我互动,相关问题也可以直接用公众号联系我:

     

     

     

     

     

     

     

     

     

     

    展开全文
  • Android消息推送

    千次下载 热门讨论 2013-04-17 12:02:48
    Android消息推送 支持离线消息 Android消息推送 支持离线消息
  • php实现app消息推送

    万次阅读 2021-06-28 12:04:27
    现在有很多的消息推送厂商,比如阿里云的消息推送,极光推送,融云的消息推送。他们的原理都是把sdk内置在app里面,达到消息推送的目的,通过一张图来了解一下,看不懂不要紧,理解大概的过程就行 实现 进入极光...

    如何用php实现APP消息推送

    现在有很多的消息推送厂商,比如阿里云的消息推送,极光推送,融云的消息推送。他们的原理都是把sdk内置在app里面,达到消息推送的目的,通过一张图来了解一下,看不懂不要紧,理解大概的过程就行

    在这里插入图片描述

    实现

    • 进入极光官网,注册一个app应用
      在这里插入图片描述

    • 集成厂商推送服务(!!!非常重要,不然推送不了——)

    在这里插入图片描述
    中途还要验证企业用户,集成完把sdk发给app开发人员。

    • 极光官网推送,测试是否成功

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210628122916966.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI5OTc0NTUz,size_16,color_FFFFFF,t_70
    到这一步已经实现基本的推送了,可以发现非常简单。

    重点来了,用php实现推送

    回到第一张图,只要我们调用api,就可以实现推送,话不多说开干,详看官方文档API部分
    在这里插入图片描述

    php使用极光推送

    • 项目引入极光SDK
    composer require jpush/jpush
    
    • 简单使用
    use JPush\Client as JPush;
    use JPush\Client;
    	//测试推送
        public function jpush(){
            $app_key="111111";     //这是app密钥,填你自己的
            $master_secret="1111111";    //这也是密钥,填你自己的
            $client = new Client($app_key,$master_secret);
            $pusher = $client->push();
            $pusher->setPlatform('Android');
    		//$pusher->addAllAudience();
            $pusher->addRegistrationId('100d85590992b509d86');
            $pusher->setNotificationAlert('test,RedJPush---'.date("Y-m-d H:i:s"));
            try {
                $res=$pusher->send();
                return $res;
            } catch (\JPush\Exceptions\JPushException $e) {
                return $e->getMessage();
            }
         }
    

    总结

    首先搞懂推送的概念,它们是如何工作的,然后再使用php调用极光api,过程很简单。

    展开全文
  • androidpn消息推送

    千次下载 热门讨论 2012-07-04 16:32:15
    androidpn消息推送 其中包含客户端 服务器端包含tomcat和jetty版本
  • Android消息推送:第三方消息推送平台详细解析

    万次阅读 多人点赞 2016-10-19 19:33:50
    消息推送在Android开发中应用的场景是越来越多了,比如说电商产品进行活动宣传、资讯类产品进行新闻推送等等,如下图: 本文将介绍Android中实现消息推送的第三方推送的详细解决方案 阅读本文前,建议先阅读我的写...

    前言

    • 消息推送在Android开发中应用的场景是越来越多了,比如说电商产品进行活动宣传、资讯类产品进行新闻推送等等,如下图:

    推送消息截图

    • 本文将介绍Android中实现消息推送的第三方推送的详细解决方案

    阅读本文前,建议先阅读我写的文章:史上最全解析Android消息推送解决方案


    目录

    目录


    1. 主流的第三方推送平台分类

    • 手机厂商类:小米推送、华为推送。
    • 第三方平台类:友盟推送、极光推送、云巴(基于MQTT)
    • BAT大厂的平台推送:阿里云移动推送、腾讯信鸽推送、百度云推送

    2. 对比其他推送方式的特点

    其他推送方式还有:C2DM、轮询、SMS、MQTT协议、XMPP协议等等,相对于这些推送方式,第三方推送方式的特点分别是:

    • 优点:

      1. 成本低
        上述的推送大多数是免费的,假如自己实现则消耗过多资源(开发成本和后台管理、统计成本)
      2. 消息到达率高
        如果一个手机里有多个App使用了同一家推送服务,那么这些App将共用一条消息通道,即使你家的App推送服务被杀死了,那么只要用户打开了其他集成该推送服务的App,你家的推送就能到达用户
    • 缺点

      1. 安全性低
        使用别人的服务器,所以你懂的。
      2. 服务会被杀死
        由于Android系统的机制,后台推送 Service 会被各种主动的或是被动的行为给杀死,而服务一旦被杀死,意味着就接收不到推送消息。

    3. 第三方推送服务方式的特点

    • 第三方服务基本都具备免费、和到达率高的特点
    • 那么应该如何选择呢?我们来分别看一下第三方推送各种方式的优点:

    3.1 手机厂商推送

    请记住一个潜规则:操作系统是不会杀死属于自己品牌的推送服务。

    1. 手机厂商的推送服务在自家的手机上属于系统级别的服务,这意味着系统不会杀死自家的推送服务
    2. 比如说,Android原生系统是不会杀死C2DM消息推送服务,MIUI系统是不会杀死小米的推送服务。

    当今市场上的Android手机系统份额最高是MIUI系统,即小米(具体排名请看http://www.umindex.com/)

    因为:免费、到达率高且在Android系统市场份额第一的MIUI系统上不被杀死。所以,如果要选择手机厂商的推送服务,请选择小米推送作为第三方平台实现推送服务

    下面一些应用可以从侧面来证明我的推断:

    • 腾讯新闻使用的小米推送,没有使用自己家的信鸽推送
    • 淘宝使用了自家的阿里云推送,同时还集成了小米推送
    • 百度视频爱奇艺使用的是小米推送,没有用自家的百度推送
    • 官网截图 - 集成应用:

    集成应用

    1. 如果希望进一步提高推送的效果,其实可以集成多个手机厂商的推送服务
    2. 比如小米渠道用小米推送,华为渠道用华为推送,但这样的实现成本会大一些

    3.2 第三方平台类

    请记住一个规则:推送系统会共享一条推送渠道

    1. 这意味着假设你接入了友盟推送,而恰好今日头条也接入了友盟。
    2. 有一天你的App被杀死了,但这时用户启动了今日头条,那么推送系统也就会通过共享的推送通道顺便把你推送消息送达到手机上,然后还可能把你的进程也唤醒(被“保活”了)。

    所以说,关于如何选择第三方平台类的推送,推送平台的规模效应就很重要了。
    那如何得知他们的规模和市场份额呢?按个人经验,主要看两点:

    • 问内部的朋友。
    • 看推送平台的合作客户里有哪些大的app - 参考对应官网的合作案例

    3.3 BAT大厂的推送

    BAT大厂其实并没有什么优势,同时谨记:

    • 不要以为用了腾讯信鸽推送,就能占上微信的光保证你的App永远内部被杀死。
    • 说个题外话,手机淘宝除了自家的阿里云的移动推送,同时也使用其它的第三方推送平台啊(比如友盟推送)。

    4. 如何选择第三方平台推送服务?

    • 选择因素
      用户群体属性、实现成本、渠道

    • 具体选择方案

    示意图

    所以,大家可根据自己的使用场景来进行消息推送平台的选择。


    5. 推送消息类别的选择

    5.1 推送消息的类别

    通常第三方推送平台都支持两种推送消息类型:通知栏消息和透传消息。

    • 通知栏消息:该类消息在被送达用户的设备后,直接以系统通知栏的形式展示给用户

    不会继续被传递到App

    • 透传消息:该类消息在被送达用户的设备后,还会继续传递到App
    1. 通过回调App的某个BroadcastReceiver的形式将消息传递到App内部。然后由App决定如何处理和显示这个消息。
    2. 所以透传消息不一定会以系统通知栏的形式进行推送,由程序猿自定义

    5.2 消息类别的区别与特点

    • 二者的区别在于:透传消息在整个消息传递过程中比通知栏消息多了一步-传递到App
    • 通知栏消息的优点:送达率高
      因为透传消息在整个消息传递过程中比通知栏消息多了一步-传递到App,因此透传消息就增加一些被系统限制的概率,给系统杀死的概率就高一些,所以说,通知栏消息比透传消息应该能提供更好的送达率。

    我们来看下小米推送的官方文档描述:

    1. 在一些 Android 系统(如 MIUI)中,受到系统自启动管理设置的限制,应用不能在后台自启动
    2. 在这类系统中,如果在发送消息的时候对应的应用没有被启动,透传类消息将不能顺利送达。
    3. 因此,对于对送达率要求很高的消息,建议尽量采用通知栏提醒的方式推送消息
    • 透传消息的优点:对消息操作程度高 & 自定义程度高
    1. 提供了对消息数据的更灵活的操纵能力。

    App如果仅仅通过通知栏消息,是无法接触到消息数据本身的。

    1. 可自定义通知提醒的样式(包括提示样式、提示形式如声音等等)

    所以大家可以根据不同的使用场景来对推送消息类别进行选择了。


    6. 总结


    请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

    展开全文
  • 前面写过一篇云开发实现小程序订阅消息(模板消息)推送的文章,《借助云开发实现小程序订阅消息和模板消息的推送功能》是有好多同学用的是Java写后台,所以今天就再来写一篇Java后台实现小程序订阅消息推送的文章。...

    前面写过一篇云开发实现小程序订阅消息(模板消息)推送的文章,《借助云开发实现小程序订阅消息和模板消息的推送功能》是有好多同学用的是Java写后台,所以今天就再来写一篇Java后台实现小程序订阅消息推送的文章。

    老规矩先看效果图

    至于如何创建模板消息,如果获取模板id我这节就不再讲解,不知道的同学可以查看我上篇文章《借助云开发实现小程序订阅消息和模板消息的推送功能》里面有详细的讲解。

    今天呢就来重点讲下如何在Java后台编写小程序订阅消息推送的知识。

    其实我很早之前有写过一篇Java实现模板消息推送的,但是小程序后面用订阅消息替换了模板推送,所以我也会根据最新的知识点不定期的更新文章的。

    发送订阅消息三步走

    • 1,拿到用户的openid
    • 2,获取access_token
    • 3,调用小程序消息推送的接口

    一,获取用户的openid

    关于用户openid的获取,我写过很多篇文章了,也有录过视频出来的,还不知道怎么获取的同学,可以取翻看下我之前的文章,或者看下我录制的零基础入门小程序的视频:《5小时零基础入门小程序云开发》 所以这一步不是今天的重点。

    二,获取access_token

    首先来看下access_token是什么,下图是官方给出的

    其实通俗的讲,access_token就是小程序官方给我们提供的一个凭证,你要调用小程序官方的接口,就必须先拿到access_token。所以下面先讲下如果获取access_token

    • 看下官方文档,可以知道我们需要用到下面的几个参数

      grant_type是一个固定的值,只有appid和secret是需要我们填入的,这两个值在我们的小程序后台就可以拿到,我也有录视频教大家如何拿到,如果不知道怎么获取的同学可以取看下我的视频。

    下面就是Java代码的编写了

    我们这里用的是springboot,这里涉及到一个请求小程序官方接口,所以我们这里用了springboot自带的RestTemplate来做网络请求。具体代码如下。

    可以看出代码很简单,就是用RestTemplate来实现一个get请求,这样我们就可以轻松的获取到了access_token。

    注意点

    关于这个access_token,是存在有效期的,来看下官方给出的提示

    所以我要在获取到access_token的时候,把access_token存到数据库,或者存到本地缓存,并且还要记录当前时间,后面再用的时候先判断这个access_token有没有超过2个小时,如果超过2个小时的话,就要重新获取了。由于这里不是本节的重点,我这里只给大家说下原理。

    三,发送消息到小程序

    我们通过上面第二步,成功的获取到了access_token。下面就要调用小程序官方为我们提供的发送消息的接口了。先看下官方文档。

    上面的参数都是我们发送消息时需要的。这些参数的定义和设置我在前面的文章里也都讲过了,不知道的同学可以去看下我前面写的这篇文章 《借助云开发实现小程序订阅消息和模板消息的推送功能》

    这里需要注意的一点是,我们要给用户发送消息,就必须引导用户授权,就是下面这个图


    因为用户不点击允许,你是没有办法给用户推送消息的。每一次授权只允许发送一条消息,所以如果你想尽量多的发送消息,就得尽量多的引导用户授权。

    推送的Java代码如下


    可以看到,我们这里需要定义用户的openid,模板id,跳转路径,模板消息内容。。。

    这些都定义好以后,我们就可以提供一个服务给到Java的其他代码调用,或者提供一个接口供外界传入openid,然后给对应的用户推送消息了。


    我们在浏览器里调用上面接口,可以看到下图所示,这样就代表我们消息推送成功了。

    下面我把完整的代码贴出来给到大家。

    package com.qcl.demo;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestClientException;
    import org.springframework.web.client.RestTemplate;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 作者:编程小石头
     * 发送小程序订阅消息
     */
    @RestController
    public class SendWxMessage {
    
        /*
         * 发送订阅消息
         * */
        @GetMapping("/pushOneUser")
        public String pushOneUser() {
            return push("o3DoL0WEdzcJ20AVJg1crP96gbjM");
        }
    
        public String push(String openid) {
            RestTemplate restTemplate = new RestTemplate();
            //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
            String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + getAccessToken();
            //拼接推送的模版
            WxMssVo wxMssVo = new WxMssVo();
            wxMssVo.setTouser(openid);//用户的openid(要发送给那个用户,通常这里应该动态传进来的)
            wxMssVo.setTemplate_id("CFeSWarQLMPyPjwmiy6AV4eB-IZcipu48V8bFLkBzTU");//订阅消息模板id
            wxMssVo.setPage("pages/index/index");
    
            Map<String, TemplateData> m = new HashMap<>(3);
            m.put("thing1", new TemplateData("小程序入门课程"));
            m.put("thing6", new TemplateData("杭州浙江大学"));
            m.put("thing7", new TemplateData("第一章第一节"));
            wxMssVo.setData(m);
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(url, wxMssVo, String.class);
            return responseEntity.getBody();
        }
    
    
        @GetMapping("/getAccessToken")
        public String getAccessToken() {
            RestTemplate restTemplate = new RestTemplate();
            Map<String, String> params = new HashMap<>();
            params.put("APPID", "wx7c54942dfc87f4d8");  //
            params.put("APPSECRET", "5873a729c365b65ab42bb5fc82d2ed49");  //
            ResponseEntity<String> responseEntity = restTemplate.getForEntity(
                    "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params);
            String body = responseEntity.getBody();
            JSONObject object = JSON.parseObject(body);
            String Access_Token = object.getString("access_token");
            String expires_in = object.getString("expires_in");
            System.out.println("有效时长expires_in:" + expires_in);
            return Access_Token;
        }
    }
    

    对应的两个数据类如下
    WxMssVo用来封装请求官方接口的参数

    package com.qcl.demo;
    
    import java.util.Map;
    
    /*
     * 小程序推送所需数据
     * 编程小石头
     * */
    public class WxMssVo {
        private String touser;//用户openid
        private String template_id;//订阅消息模版id
        private String page = "pages/index/index";//默认跳到小程序首页
        private Map<String, TemplateData> data;//推送文字
    
        public String getTouser() {
            return touser;
        }
    
        public void setTouser(String touser) {
            this.touser = touser;
        }
    
        public String getTemplate_id() {
            return template_id;
        }
    
        public void setTemplate_id(String template_id) {
            this.template_id = template_id;
        }
    
        public String getPage() {
            return page;
        }
    
        public void setPage(String page) {
            this.page = page;
        }
    
        public Map<String, TemplateData> getData() {
            return data;
        }
    
        public void setData(Map<String, TemplateData> data) {
            this.data = data;
        }
    }
    

    TemplateData 用来定义消息的内容

    package com.qcl.demo;
    
    public class TemplateData {
        private String value;//
    
        public TemplateData(String value) {
            this.value = value;
        }
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    }
    

    到这里我们就可以完整的实现Java发送小程序消息的功能了。完整代码也已经贴给大家了。

    后面我会写更多Java和小程序相关的文章出来,敬请期待

    展开全文
  • 在Android开发中,消息推送功能的使用非常常见。为了降低开发成本,使用第三方推送是现今较为流行的解决方案。 今天,我将手把手教大家如何在你的应用里集成小米推送 该文档基于小米推送官方Demo,并给出简易推送...
  • 每次看到iOS的远程消息推送,总是感觉很头大,即便后来项目都做完了,还是觉得摸不着远程推送的脉门,网上介绍的资料虽然多如牛毛,但不是写的太简单了,就是写的太详细了,不能一下抓住要点,今天终于能够抽出点...
  • 微信小程序 消息推送功能实现详解

    万次阅读 多人点赞 2018-09-05 19:30:57
    比如我们小程序中的客服功能,我不想要使用小程序后台的在线客服功能,但我又想实现客服功能,这个时候微信提供了消息推送功能,在小程序后台的设置,开发设置中,消息推送功能: 点击开启消息推送功能,认证成功...
  • 极光推送,是一个面向普通开发者开放的,免费的第三方消息推送服务。本篇博客将结合案例介绍极光推送自定义消息的使用方法,利用自定义消息实现项目中特定的消息推送需求。
  • 离线消息推送

    千次阅读 2019-08-30 02:22:48
    离线消息推送,一般采用厂商通道,现在以Hbuilder创建的APP为例,记录下步骤: 1)Hbuilder创建APP。 2)登录http://dev.dcloud.net.cn,开通UniPush推送服务。 3)配置厂商推送设置,需要根据手机的类型,进入...
  • PhoneGap极光推送 cordova消息推送

    千次阅读 2018-04-01 19:21:26
    之前做过一个APP用到了消息推送,最近这个项目又用到了推送。但是由于两个项目间隔4个多月,推送集成、使用方式等都忘了,所以当时又去看了以前项目的源码和一些推送相关的博客,寻找那些蛛丝马迹。突然觉得这样很...
  • FCM实现消息推送

    千次阅读 热门讨论 2020-07-20 19:24:35
    最近刚刚毕业,在公司接到的第一个正式任务是要求我将消息推送到firebase服务器上从而实现消息推送到安卓客户端。由于该产品面向海外用户,所以需要通过谷歌提供的服务器进行消息推送。至于fcm的概念,大家可以自行...
  • App消息推送的原理

    万次阅读 2019-04-29 16:12:06
    Android消息推送原理3.1 操作系统有自身的消息推送功能(系统级别)3.2 三种基本的推送方式:Push、Pull 和 SMS3.3 七种主流的Android消息推送方式 1. 基本概念 目的: 在用户未打开App时,App主动向用户推送...
  • 最近需要开发微信和小程序的推送功能,需要用java后台实现推送,自己本身java和小程序都做,所以就自己动手实现下小...我的这个是跑腿抢单推送,当用户新下单时,会给跑腿员推送消息。 下面开始讲解实现步骤 ...
  • 极光推送,是一个面向普通开发者开放的,免费的第三方消息推送服务。本篇博客将结合案例介绍极光推送自定义消息的使用方法,利用自定义消息实现项目中特定的消息推送需求。 本案例将实现如图效果:  ...
  • uni-app消息推送方案

    万次阅读 热门讨论 2019-11-06 01:13:40
    uni-app是支持消息推送的,参考如下文档: UniPush介绍 UniPush使用指南 UniPush开通指南 如何自定义推送通知的图标? 在 uni-app 中使用 UniPush 二、效果 开源项目uniapp-admin 三、需求 不同角色的用户登陆App,...
  • 消息推送系统方案

    千次阅读 2018-09-04 16:04:08
    消息推送创建/发送 消息推送后台管理: 消息推送模块: 消息推送管理: 新建推送消息: 消息支持在指定的时间开发推送功能; 消息支持按照不同群体分类进行精准推送功能; 标签推送:给用户增加标签...
  • 微信企业消息推送方案

    千次阅读 2019-12-02 11:20:48
    在软件程序实际应用中,在软件中推送可能还不能满足实际需求,需要把消息推送到用户手机,目前比较好的方式,可能是微信消息推送。因此做一个记录 企业微信/企业号注册 微信消息推送需要配合 企业微信号 做消息推送 ...
  • Flutter 通知栏消息推送

    千次阅读 2021-01-16 18:19:23
    此博文要实现的通知栏的消息推送如...通知栏的消息推送可简单分为本地消息推送和网络消息推送。 这里主要介绍的是本地消息推送。 使用的package是官方发布的flutter_local_notifications,版本是3.0.3,官方地址如下: ...
  • 今天来带大家学习下微信模版消息推送。 先看效果图: 核心代码只有下面几行,即可轻松实现微信模版消息推送 //1,配置 WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage(); wxStorage....
  • 基于 RabbitMQ 的实时消息推送

    万次阅读 2018-02-23 16:59:33
    就目前来看,Web 应用的消息推送方式主要有以下几种: 1.1 Ajax短轮询 Ajax 轮询主要通过页面端的 JS定时异步刷新任务来实现数据的加载,但这种方式实时效果较差,而且对服务端的压力也较大。 ...
  • HBuilder webapp实现消息推送

    千次阅读 热门讨论 2019-02-02 21:51:32
    HBuilder webapp实现消息推送 关于软件的push推送 HBuilder 只提供了二个SDK(小米推送、个推) 因为我使用的是个推所以这篇文章就主要介绍如何使用个推实现消息推送、 1.注册个推 个推官网:...
  • app消息推送及监听系统消息点击

    万次阅读 2020-08-11 15:55:45
    //创建本地消息,这个可以通过判断服务器端是否有新消息推送,获取到推送消息之后,创建本地推送消息 plus.push.addEventListener(“click”, function(msg) { //content: ( String ) 必选 消息显示的内容,在系统...
  • 消息推送(个推推送)的原理

    千次阅读 2016-12-13 14:30:18
    消息推送(个推推送)的原理: 1.手机客户端初始化个推SDK; 2.如果初始化成功,个推SDK向在个推服务器注册; 3.如果注册成功,个推服务器会向个推SDK返回CID; 4.如果个推SDK接收到个推服务器发送来...
  • 百度消息推送(最简单的Demo)

    千次下载 热门讨论 2014-02-24 11:21:19
    一个百度消息推送的最小demo,有兴趣的朋友可以看我的博文中相关部分:http://blog.csdn.net/dawanganban/
  • (1)消息推送的作用目前的手机APP多数都具有消息推送的功能。消息推送我认为其作用和价值有二:一是向所有APP用户发布消息公告;二是在业务流中及时向特定用户发出提醒,告知某请求的处理进度。(2)消息推送的方式...
  • 基于消息推送的聊天工具

    千次下载 热门讨论 2013-06-08 15:20:46
    本应用是基于百度云推送的一款轻量级聊天工具,包含多个开源项目库,同时本代码也已经开源,欢迎访问我的博客主页:http://blog.csdn.net/weidi1989,由于时间仓促,错误与疏忽之处在所难免,希望各位朋友们以邮件的...
  • unity消息推送- 接入小米推送SDK-自定义消息通知声音 虽然app消息推送功能一般在原生端做;但是,unity就要这么任性的无所不能,不废话,直接上步骤,快速实现消息推送功能。 具体步骤方法: 1.下载sdk ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 184,188
精华内容 73,675
关键字:

消息推送