客戶端代碼:連接地址html
這裏記錄下iOS消息推送實現的全過程apache
首先,申請祕鑰。服務器
以後進入連接地址開發者,固然你得有啊!!!!!app
點擊這裏ide
如圖:測試
下面實現建立推送證書(和開發證書不同)ui
接上圖:this
下圖:spa
第一步完:
爲證書添加推送功能:
點擊以後的效果:
點擊以後
到如今咱們已經有倆個證書了,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]; 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.aiuxian.com/article/p-1327006.html