iOS APNS推送前端和后端(Java)代码

Push的原理:

Push 的工作机制可以简单的概括为下图:

Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider。

APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。

上图可以分为三个阶段。

第一阶段:Push服务器应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。

第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。

第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。

iOS前端push消息步骤:

1.应用程序注册消息通知,代码如下:[注意喽:ios7和ios8注册通知是不一样的哦!!!]

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
      //消息推送
    [self msgPush];

}

/**
    消息推送
 **/
- (void) msgPush
{
    //推送的形式:标记,声音,提示
    if (IS_IOS8) {
        //1.创建消息上面要添加的动作(按钮的形式显示出来)
        UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init];
        action.identifier = @"action";//按钮的标示
        [email protected]"Accept";//按钮的标题
        action.activationMode = UIUserNotificationActivationModeForeground;//当点击的时候启动程序
        //    action.authenticationRequired = YES;
        //    action.destructive = YES;

        UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];
        action2.identifier = @"action2";
        [email protected]"Reject";
        action2.activationMode = UIUserNotificationActivationModeBackground;//当点击的时候不启动程序,在后台处理
        action.authenticationRequired = YES;//需要解锁才能处理,如果action.activationMode = UIUserNotificationActivationModeForeground;则这个属性被忽略;
        action.destructive = YES;

        //2.创建动作(按钮)的类别集合
        UIMutableUserNotificationCategory *categorys = [[UIMutableUserNotificationCategory alloc] init];
        categorys.identifier = @"alert";//这组动作的唯一标示,推送通知的时候也是根据这个来区分
        [categorys setActions:@[action,action2] forContext:(UIUserNotificationActionContextMinimal)];

        //3.创建UIUserNotificationSettings,并设置消息的显示类类型
        UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:[NSSet setWithObjects:categorys, nil]];
        [[UIApplication sharedApplication] registerUserNotificationSettings:notiSettings];
    }else{

        [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
    }

}

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings

{

//注册远程通知

[application registerForRemoteNotifications];

}

2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。【代码如下:】

3、应用程序将deviceToken发送给PUSH服务端程序

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    MyLog(@"myToken = %@",deviceToken);
    //保存token
    [Config saveToken:[NSString stringWithFormat:@"%@",deviceToken]];

//将deviceToken发送给服务器

[self initNetworkState:[NSString stringWithFormat:@"%@",deviceToken]];

}

-(void)initNetworkState:(NSString *)pToken

{

NSDictionary *dicJson = [PackJsonForMine packTokenJson:pToken];

NSError *error;

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dicJson options:NSJSONWritingPrettyPrinted error: &error];

NSMutableData *tempJsonData = [NSMutableData dataWithData:jsonData];

request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:IDS_URL_TOKEN]];

[request setRequestMethod:@"POST"];

[request setPostBody:tempJsonData];

[request setDelegate:self];

[request setDidFailSelector:@selector(requestLogFailed:)];

[request setDidFinishSelector:@selector(requestLogFinish:)];

[request startAsynchronous];

}

/**

发送token失败

**/

- (void)requestLogFailed:(ASIHTTPRequest *)requests

{

MyLog(@"发送token到服务器失败%@",[requests responseString]);

}

/**

发送token成功

**/

- (void)requestLogFinish:(ASIHTTPRequest *)requests

{

[Config saveTokenFlag];

}

4、服务端程序向APNS服务发送消息。

5、APNS服务将消息发送给iPhone应用程序。【注意喽:处理推送分为两种:正在运行的程序收到推送消息,alerat弹窗;锁屏时通知栏显示】

#pragma mark - 处理推送的消息内容
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    self.urlStr = [userInfo valueForKey:@"link"];
    self.message = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];

    [UIApplication sharedApplication].applicationIconBadgeNumber = [UIApplication sharedApplication].applicationIconBadgeNumber = [[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue];

    //注意:在打开应用的时候,是需要一个弹框提醒的,不然用户看不到推送消息
    if (application.applicationState == UIApplicationStateActive) {

        if (self.urlStr.length > 0) {

            CustomIOS7AlertView *alertView = [[CustomIOS7AlertView alloc] init];
            //自定义AlertView
            [alertView setContainerView:[self createView]];
            [alertView setButtonTitles:[NSMutableArray arrayWithObjects:@"关闭",@"查看", nil]];
            [alertView setBackgroundColor:[UIColor clearColor]];
            [alertView setDelegate:self];
            [alertView setUseMotionEffects:true];
            [alertView show];

        }else{

            CustomIOS7AlertView *alertView = [[CustomIOS7AlertView alloc] init];
            //自定义AlertView
            [alertView setContainerView:[self createView]];
            [alertView setButtonTitles:[NSMutableArray arrayWithObjects:@"关闭", nil]];
            [alertView setBackgroundColor:[UIColor clearColor]];
            [alertView setDelegate:self];
            [alertView setUseMotionEffects:true];
            [alertView show];
        }
    }else{
        if (self.urlStr.length > 0) {
            WebViewController *webViewC = [[WebViewController alloc] init];
            webViewC.link = self.urlStr;
            [Tool showHideToolBar:HIDE];
            [navIntergralController pushViewController:webViewC animated:YES];
        }

    }

}

无论是iPhone客户端跟APNS,还是Provider和APNS都需要通过证书进行连接的。下面介绍一下所用到证书的制作。

一、CSR文件

1、生成Certificate Signing Request(CSR)

2.填写你的邮箱和常用名称,并保存到硬盘

点击继续:

这样就在本地生成了一个PushTest.certSigningRequest文件。

二、SSL certificate文件 以及相关的证书制作过程详情请见如下博客内容:

http://www.cnblogs.com/imlucky/p/3419581.html

在推送中测试的时候需要测试的.P12文件和发布的.P12文件

后台代码:

六、JAVA后台代码:

public static void main(String[] args) throws Exception 
{
        try
        {
            //从客户端获取的deviceToken,在此为了测试简单,写固定的一个测试设备标识。
           String deviceToken = "df779eda 73258894 5882ec78 3ac7b254 6ebc66fe fa295924 440d34ad 6505f8c4"

System.out.println("Push Start deviceToken:" + deviceToken);
            //定义消息模式
            PayLoad payLoad = new PayLoad();
            payLoad.addAlert("this is test!");
            payLoad.addBadge(1);//消息推送标记数,小红圈中显示的数字。
            payLoad.addSound("default");
            //注册deviceToken
            PushNotificationManager pushManager = PushNotificationManager.getInstance();
            pushManager.addDevice("iPhone", deviceToken);
            //连接APNS
            String host = "gateway.sandbox.push.apple.com";
            //String host = "gateway.push.apple.com";
            int port = 2195;

String certificatePath = "c:/PushTest.p12";//前面生成的用于JAVA后台连接APNS服务的*.p12文件位置
            String certificatePassword = "123456";//p12文件密码。
            pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);
            //发送推送
            Device client = pushManager.getDevice("iPhone");
            System.out.println("推送消息: " + client.getToken()+"\n"+payLoad.toString() +" ");
            pushManager.sendNotification(client, payLoad);
            //停止连接APNS
            pushManager.stopConnection();
            //删除deviceToken
            pushManager.removeDevice("iPhone");
            System.out.println("Push End");
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
}
}

至此大功告成!!!!!!!

时间: 2024-10-07 13:13:18

iOS APNS推送前端和后端(Java)代码的相关文章

iOS apns推送

前言:推送分为本地推送以及远程推送. 两者的区别为本地推送一般为定时推送.定期推送或者位置推送.而远程推送更为多样化,能满足较高的要求.当然远程推送需要服务器端开发,开发流程较复杂. 1.本地推送只需要在客户端写代码即可,实现简单轻松. (1)本地推送在app未开启的情况下也能收到本地推送的消息.会走这个入口方法 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color

IOS 基于APNS消息推送原理与实现(JAVA后台)--转

Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器. 上图可以分为三个阶段. 第一阶段:Push服务器应用程序把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的

转:IOS 基于APNS消息推送原理与实现(JAVA后台)

Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器. 上图可以分为三个阶段. 第一阶段:Push服务器应用程序把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的

IOS 基于APNS消息推送原理与实现(JAVA后台)

Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器. 上图可以分为三个阶段. 第一阶段:Push服务器应用程序把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的

【java/C# 服务器】IOS 配置推送证书 p12文件流程

在配置 P12 证书文件之前, 我们要准备三个文件 1.PushChat.certSigningRequest      请求证书文件 2.PushChatKey.p12                       请求证书文件后, 在证书秘钥中生成了一个公钥和私钥, 通过私钥导出的p12文件 3.aps_developer_identity.cer          使用请求证书文件 生成的  推送证书 获取到的deviceToken,我们可以通过webservice服务提交给.net应用程序

iOS 通知推送APNS

结合网上各个资料,再简单整理的一份. 一.APNS推送说明 1.你的IOS应用需要去注册APNS消息推送功能. 2.当苹果APNS推送服收到来自你应用的注册消息就会返回一串device token给你(很重要) 3.将应用收到的device Token传给你本地的Push服务器. 4.当你需要为应用推送消息的时候,你本地的推送服务器会将消息,以及Device Token打包发送到苹果的APNS服 5.APNS再将消息推送给目的iphone 二.推送的准备工作 推送准备的主要就是1.推送证书 2.

iOS 推送证书制作(JAVA/PHP)

iOS 推送证书制作(JAVA/PHP) 在使用Java或者PHP制作iOS推送服务器的时候,需要自己从开发者网站上导出的aps_developer_identity证书和Apple Development Push Services证书进行合成,生成可以供Java使用的p12证书或供PHP使用的pem证书.aps_developer_identity证书和Apple Development Push Services证书的申请过程可以参考:http://www.cnblogs.com/hubj

iOS 下APNS推送处理函数具体解释

相比起Android,iOS在推送方面无疑惯例得更好.APNS(Apple Push Notification Service)是苹果公司提供的消息推送服务.其原理就是.第三方应用将要推送给用户的信息推送到苹果server.苹果server再通过统一的系统接口将这些信息推送到用户的手机上.假设对此不舍了解的朋友能够參见这篇文章:一步一步教你做ios 推送 本文着重叫在App端怎样处理推送信息. 主要涉及一下几个比較重要的函数,而这些函数都是AppDelegate类中: - (BOOL)appli

IOS使用APNS推送Payload字节数限制导致推送不成功

这2天需要在推送上加上脚本,找到了badge方法可以加脚本.加上后但是怎么推送也不成功.郁闷了好久,在网上查找相关资料. 终于被我找到原因: "Payload--最多256bytes." 原来是发送的payload字节超过规定字符. 使用payload.getBytes().length得到字节数.查看了下字符个数240个字节,没有超过256,反复测试,得知,256bytes也不够准确.就把原payload中的某些值去掉了(loginUri登录,uri用于跳转),再次测试,推送成功.