zoukankan      html  css  js  c++  java
  • oc学习之路----APNS消息推送从证书到代码(2015年4月26号亲试可用)

    前言:看这篇博客之前要准备:首先的有一个99刀的个人开发者账号或者199刀的企业开发者账号,其次你用的是apns消息推送,(本人之前四处打听有没有其他消息推送的方法:收获如下:首先如果想做到apns的效果,退出app后还能收到信息,只能用apns,其他的消息推送,xmpp不能像他一样,我也没用过,其次,apns相对来说没有那么耗资源)

    最后你要对apns有一定的了解。网上很多,我就不多说了。

    咳咳!开始

    一 , 首先证书的准备,步骤:

      1  获取 CertificateSigningRequest.certSigningRequest证书

      2 获取   APPID 

      3 获取 aps_development.cer证书 

      4 获取  *.mobileprovision证书 

      5 获取    *.p12证书 

      如何获取CertificateSigningRequest.certSigningRequest证书

        点击前往实用工具->点击钥匙串访问-> 在证书助理里面选择从证书颁发机构请求证书,填写必要信息->之后存储即可,建议把所有证书存到一个push文件夹里面去

          

    至此CertificateSigningRequest.certSigningRequest证书获取完毕,在你的push文件夹会有一个这样的证书。

    获取APPIDs,在apple delopment登录你的账号,这里直接基本上全部下一步,没什么难的 ,注意的地方我都有标志的

      至此appids创建完毕

    获取aps_development.cer证书

      

    至此你的push文件夹里面应有这两个文件

    获取  *.mobileprovision证书首先这一步之前你要保证你有一个设备已经注册了证书,,大概看这篇文章的人都是刚有开发者账号不就,所以这一步很多人都没做,导致后面的会出现no  Certificate的错误,不能继续下去,就不能获取*.mobileprovision,至于怎么获取这个证书,基本上与获取aps_development.cer证书一样,估计一张图大家就会明白了

    之后真正的获取*.mobileprovision来了

      

    至此*.mobileprovision证书获取完毕

    获取p12证书,打开push文件,双击aps_development.cer,进入钥匙串选择含有我们刚才创建的appid的证书,右击导出,

    至此准备工作已经完全搞定。

    之后贴代码

    iOS客户端

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        NSString* str = [UIDevice currentDevice];
        NSLog(@"%@",str);
        // Override point for customization after application launch.
        //判断是否由远程消息通知触发应用程序启动
        if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]!=nil) {
            //获取应用程序消息通知标记数(即小红圈中的数字)
            int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
            if (badge>0) {
                //如果应用程序消息通知标记数(即小红圈中的数字)大于0,清除标记。
                badge--;
                //清除标记。清除小红圈中数字,小红圈中数字为0,小红圈才会消除。
                [UIApplication sharedApplication].applicationIconBadgeNumber = badge;
            }
        }
        //消息推送注册
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge];
        return YES;
    }
    
    #pragma 代理方法token    NSString
    -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
    //    获取终端设备的标志,这个标志需要通过结构发送到服务器端,服务器端推送消息到APNS时需要知道的终端的标志,APNS通过标志的终端标志来找到终端
        NSString *token = [NSString stringWithFormat:@"%@",deviceToken];
        NSLog(@"token ======= %@",token);
    }
    
    -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
        NSString *error_str = [NSString stringWithFormat: @"%@", error];   
        NSLog(@"Failed to get token, error:%@", error_str);   
    }
    
    -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
        //在此处理接收到的消息。
        NSLog(@"Receive remote notification : %@",userInfo);
    }

    这里要添加一个地方,三个代理方法,

    在application didFinishLaunchingWithOptions:添加代码
    添加三个代理方法
    java服务端
    import javapns.devices.Device;
    import javapns.devices.implementations.basic.BasicDevice;
    import javapns.notification.AppleNotificationServerBasicImpl;
    import javapns.notification.PushNotificationManager;
    import javapns.notification.PushNotificationPayload;
    import javapns.notification.PushedNotification;
    import org.junit.Test;
    
    public class PushDemo {
    //    方法一
        public static void main(String[] args)throws Exception{
    //        String deviceToken = "d4b3c5f3d497554f56f6f9791872666ae06e3b4e7abad6f4792dcd030007db91";
            String deviceToken = "42b74bacb28414c856505e2e6d70fe7940540a8c8fa4c728b3338c9ec1575367";
            String alert = "诶~你惨了~随时给你发垃圾信息~{{{(>_<)}}}~";//push的内容
            int badge = 3;//图标小红圈的数值
            String sound = "default";//铃音
    
            List<String> tokens = new ArrayList<String>();
            tokens.add(deviceToken);
            String certificatePath = "/Users/etund/Desktop/push/证书.p12";
            String certificatePassword = "123456";//此处注意导出的证书密码不能为空因为空密码会报错
            boolean sendCount = true;
    
            try
            {
                PushNotificationPayload payLoad = new PushNotificationPayload();
                payLoad.addAlert(alert); // 消息内容
                payLoad.addBadge(badge); // iphone应用图标上小红圈上的数值
                // payLoad.addCustomAlertBody("噢嘿嘿~捏嘻嘻~哇咔咔咔~");
    
                if (!StringUtils.isBlank(sound))
                {
                    payLoad.addSound(sound);//铃音
                }
                PushNotificationManager pushManager = new PushNotificationManager();
                //true:表示的是产品发布推送服务 false:表示的是产品测试推送服务
                pushManager.initializeConnection(new AppleNotificationServerBasicImpl(certificatePath, certificatePassword, false));
                List<PushedNotification> notifications = new ArrayList<PushedNotification>();
                // 发送push消息
                if (sendCount)
                {
                    Device device = new BasicDevice();
                    device.setToken(tokens.get(0));
                    PushedNotification notification = pushManager.sendNotification(device, payLoad, true);
                    notifications.add(notification);
                }
                else
                {
                    List<Device> device = new ArrayList<Device>();
                    for (String token : tokens)
                    {
                        device.add(new BasicDevice(token));
                    }
                    notifications = pushManager.sendNotifications(payLoad, device);
                }
                List<PushedNotification> failedNotifications = PushedNotification.findFailedNotifications(notifications);
                List<PushedNotification> successfulNotifications = PushedNotification.findSuccessfulNotifications(notifications);
                int failed = failedNotifications.size();
                int successful = successfulNotifications.size();
                System.out.println(failedNotifications);
                System.out.println(successfulNotifications);
                pushManager.stopConnection();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    
    //    方法二
        @Test
        public void test2() {
            /**APNS推送需要的证书、密码、和设备的Token**/
            String  p12Path = "/Users/etund/Desktop/push/证书.p12";
            String  password = "123456";
            String  pushToken = "42b74bacb28414c856505e2e6d70fe7940540a8c8fa4c728b3338c9ec1575367";
    
            try {
                /**设置参数,发送数据**/
                ApnsService service = APNS.newService().withCert(p12Path,password).withSandboxDestination().build();
                String payload = APNS.newPayload().alertBody("hello,www.mbaike.net").badge(1).sound("default").build();
                service.push(pushToken, payload);
                System.out.println("推送信息已发送!");
            } catch (Exception e) {
                System.out.println("出错了:"+e.getMessage());
            }
        }
    }

    至于java服务的jar包

    至此服务端和客户端已经全部可以运行
    最后看看运行效果
    手机端

    好了,结束!

    全部原创,转载请说明出处。

  • 相关阅读:
    web集群和分布式服务以及消息补偿机制几种方案
    什么是幂等性
    Dubbo面试常见问题
    mysql 缓存机制
    mysql面试题
    在IDEA中用Gradle构建项目时使用lombok以依赖出现出错
    jdbcType与javaType的对应关系
    通用Mapper的使用
    Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分
    dubbo面试题
  • 原文地址:https://www.cnblogs.com/superYou/p/4458669.html
Copyright © 2011-2022 走看看