iOS消息推送(Java实现)

首先来了解一下苹果的消息推送APNS(英文全称:Apple Push Notification service)

先来看两张苹果对于推送的两张解释图:



iOS消息推送(Java实现)_第1张图片

大概的意思就是,提供商把消息推送至苹果的推送服务器,再由苹果推送服务器将消息推送给手机客户端,或者反过来手机客户端把消息推送至苹果推送服务器,再由苹果推送服务将消息推送至提供商。这里提到的提供商可以是像极光推送或其他供应商,亦或是自己的服务器。


这里提到了苹果推送服务器向手机端推送消息,那么它是怎么知道是推送到哪个手机上的呢,这个就汲及到一个Token的问题。

Token是每台iOS手机唯一的标识,在启动手机应用时,会向苹果推送服务器去请求得到唯一的Token。当然,虽然每次应用启动时都会去请求得到Token,但是针对于同一部手机,返回回来的Token值都是一致的。

所以当苹果推送服务器只要知道要推送给哪个Token即可知道是推送至哪个手机。


接下来看一下APNS如何去实现消息的推送

1.首先是要准备好证书

从你的苹果电脑上导出CSR文件,打开钥匙串-->钥匙串访问-->证书助理-->从证书颁发机构请求证书,然后一路输入邮件地址和保存的文件,保存到电脑,CSR文件就生成了。

到苹果开发者官网http://developer.apple.com,登陆进入到证书管理模块,Identifiers --> App IDs, 如果你的应用ID还没有添加进来,那么点右上角加号添加进来,如果已经加进来了,单击进入,进么设置,将Push Notifications 设成Enable.

iOS消息推送(Java实现)_第2张图片


一路设置好,上传刚才从苹果电脑上导出来的CSR文件,并导出证书,双击导出的证书,它会自动安装到苹果电脑上,安装好后,在钥匙串工具中导出Push证书,即导出来后是一个P12文件,P12文件是用于后边Java后台连接APNS使的。

xcode中修改证书为刚才安装好的推送证书。由于推送需要用到真机,所以还需要Provisioning Profiles 证书,生成后也要在xcode中设置好。


2.给应用注册推送服务

  • 首先在项目的AppDelegate.m中加入以下两个代理方法
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
    NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
    //获取终端设备标识,这个标识需要通过接口发送到服务器端,服务器端推送消息到APNS时需要知道终端的标识,APNS通过注册的终端标识找到终端设备。
    NSLog(@"My token is:%@", token);   
}  


- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {   
    NSString *error_str = [NSString stringWithFormat: @"%@", error];   
    NSLog(@"Failed to get token, error:%@", error_str);   
}


  • 在AppDelegate.m的(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中加入注册消息通知推送能力;加入当应用程序处于未启动状态时,判断是否由远程消息通知触发;加入清除消息推送通知标记。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  //判断是否由远程消息通知触发应用程序启动
    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];
}


  • 在项目AppDelegate.m中加入消息接收处理代理方法。
//处理收到的消息推送
- (void)application:(UIApplication *)application 
didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    //在此处理接收到的消息。
    NSLog(@"Receive remote notification : %@",userInfo);
}


3.Java后台苹果推送服务器推送消息

package com.kerryzb.util;

import java.util.ArrayList;
import java.util.List;




import org.apache.commons.lang.StringUtils;

import javapns.Push;
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;



public class Test
{
    public static void main(String[] args) throws Exception
    {
        String deviceToken = "d4b3c5f3d497554f56f6f9791872666ae06e3b4e7abad6f4792dcd030007db91";
        String alert = "给你发信息了";//push的内容
        int badge = 3;//图标小红圈的数值
        String sound = "default";//铃音

        List tokens = new ArrayList();
        tokens.add(deviceToken);
        String certificatePath = "D:/ZshPush.p12";
        String certificatePassword = "123456";//此处注意导出的证书密码不能为空因为空密码会报错
        boolean sendCount = true;

        try
        {
            PushNotificationPayload payLoad = new PushNotificationPayload();
            payLoad.addAlert(alert); // 消息内容
            payLoad.addBadge(badge); // iphone应用图标上小红圈上的数值
           
            if (!StringUtils.isBlank(sound))
            {
                payLoad.addSound(sound);//铃音
            }
            PushNotificationManager pushManager = new PushNotificationManager();
            //true:表示的是产品发布推送服务 false:表示的是产品测试推送服务
            pushManager.initializeConnection(new AppleNotificationServerBasicImpl(certificatePath, certificatePassword, false));
            List notifications = new ArrayList();
            // 发送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 = new ArrayList();
                for (String token : tokens)
                {
                    device.add(new BasicDevice(token));
                }
                notifications = pushManager.sendNotifications(payLoad, device);
            }            
            pushManager.stopConnection();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}


Java所需要用到的jar包,可到此下载

http://download.csdn.net/detail/kerryzb/9531939




你可能感兴趣的:(iOS消息推送(Java实现))