消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图1-1: 1、 Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服务端[消息的发起者]); 2、 APNS:Apple Push Notification Service[苹果消息推送服务器]; 3、 iPhone:用来接收APNS下发下来的消息; 4、 Client App:IOS设备上的应用程序,用来接收iphone传递APNS下发的消息到制定的一个客户端 app[消息的最终响应者]; 上图可以分为三个阶段: 阶段一:Provider[服务端]把要发送的消息,目的IOS设备标识打包,发送给APNS; 阶段二:APNS在自身的已注册Push服务的IOS设备列表中,查找有相应标识的IOS设备,并将消息发送到IOS设备; 阶段三:IOS设备把发送的消息传递给对应的应用程序,并且按照设定弹出Push通知。
这里记录下iOS消息推送实现的全过程
首先,申请秘钥。
如图:
下面实现创建推送证书
接上图:
下图:
第一步完:
为证书添加推送功能:
点击之后的效果:
点击之后
到现在我们已经有俩个证书了,aps_development.cer 和CertificateSigningRequest.certSigningRequest。
下面的步骤比较关键。我们需要把机器中的之前的证书清理干净,如果不清理干净的画会出现如下错误:
Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的权利字符串" UserInfo=0x17007d6c0 {NSLocalizedDescription=未找到应用程序的“aps-environment”的权利字符串}
这个错误大概的意思就是证书不匹配的意思。
清理之后,我们点击
将推送证书添加进去。
之后我们导出一个可以供服务器端使用的。
以下代码来着网上的活雷锋贡献。
下面附上客户端代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSString* str = [UIDevice currentDevice];
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;
}
-(
void
)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSString* token = [NSString stringWithFormat:@
"%@"
,deviceToken];
NSLog(@
"%@"
,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);
}
下面附上服务器端代码:
import
org.apache.log4j.Logger;
import
org.apache.log4j.PropertyConfigurator;
import
javapns.*;
import
javapns.back.PushNotificationManager;
import
javapns.back.SSLConnectionHelper;
import
javapns.data.Device;
import
javapns.data.PayLoad;
public
class
PushDemo {
public
static
void
main(String[] args)
throws
Exception {
try
{
//从客户端获取的deviceToken,在此为了测试简单,写固定的一个测试设备标识。
String deviceToken =
"9f8e0099 1e72c4ab ca835ec3 994e93d9 a09ce215 62d91bb3 6e929a33 02c29456"
;
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 =
"/Users/tokou/Desktop/PushDemo.p12"
;
//前面生成的用于JAVA后台连接APNS服务的*.p12文件位置
String certificatePassword =
"123"
;
//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();
}
}
}
希望能帮到你;
原文地址:http://www.2cto.com/kf/201404/293459.html