客户端代码:链接地址
这里记录下iOS消息推送实现的全过程
首先,申请秘钥。
之后进入链接地址开发者,当然你得有啊!!!!!
点击这里
如图:
下面实现创建推送证书(和开发证书不一样)
接上图:
下图:
第一步完:
为证书添加推送功能:
点击之后的效果:
点击之后
到现在我们已经有俩个证书了,aps_development.cer 和CertificateSigningRequest.certSigningRequest。
下面的步骤比较关键。我们需要把机器中的之前的证书清理干净,如果不清理干净的画会出现如下错误:
Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的权利字符串" UserInfo=0x17007d6c0 {NSLocalizedDescription=未找到应用程序的“aps-environment”的权利字符串}
这个错误大概的意思就是证书不匹配的意思。
清理之后,我们点击
将推送证书添加进去。
Capabilities中打开Push Notifications 开关
在XCode7中这里的开关不打开,推送也是可以正常使用的,但是在XCode8中,这里的开关必须要打开,不然会报错:
Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的授权字符串" UserInfo={NSLocalizedDescription=未找到应用程序的“aps-environment”的授权字符串}
之后我们导出一个可以供服务器端使用的。
以下代码来着网上的活雷锋贡献。
下面附上客户端代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{//Override point for customization after application launch.
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];returnYES;
}-(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 classPushDemo {public static voidmain(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 = newPayLoad();
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();
}
}
}