前言:看這篇博客以前要準備:首先的有一個99刀的我的開發者帳號或者199刀的企業開發者帳號,其次你用的是apns消息推送,(本人以前四處打聽有沒有其餘消息推送的方法:收穫以下:首先若是想作到apns的效果,退出app後還能收到信息,只能用apns,其餘的消息推送,xmpp不能像他同樣,我也沒用過,其次,apns相對來講沒有那麼耗資源)java
最後你要對apns有必定的瞭解。網上不少,我就很少說了。服務器
咳咳!開始app
一 , 首先證書的準備,步驟:iphone
1 獲取 CertificateSigningRequest.certSigningRequest證書ide
2 獲取 APPID 工具
3 獲取 aps_development.cer證書 測試
4 獲取 *.mobileprovision證書 ui
5 獲取 *.p12證書 spa
如何獲取CertificateSigningRequest.certSigningRequest證書.net
點擊前往實用工具->點擊鑰匙串訪問-> 在證書助理裏面選擇從證書頒發機構請求證書,填寫必要信息->以後存儲便可,建議把全部證書存到一個push文件夾裏面去
至此CertificateSigningRequest.certSigningRequest證書獲取完畢,在你的push文件夾會有一個這樣的證書。
獲取APPIDs,在apple delopment登陸你的帳號,這裏直接基本上所有下一步,沒什麼難的 ,注意的地方我都有標誌的
至此appids建立完畢
獲取aps_development.cer證書
至此你的push文件夾裏面應有這兩個文件
獲取 *.mobileprovision證書首先這一步以前你要保證你有一個設備已經註冊了證書,,大概看這篇文章的人都是剛有開發者帳號不就,因此這一步不少人都沒作,致使後面的會出現no Certificate的錯誤,不能繼續下去,就不能獲取*.mobileprovision,至於怎麼獲取這個證書,基本上與獲取aps_development.cer證書同樣,估計一張圖你們就會明白了
以後真正的獲取*.mobileprovision來了
至此*.mobileprovision證書獲取完畢
獲取p12證書,打開push文件,雙擊aps_development.cer,進入鑰匙串選擇含有咱們剛纔建立的appid的證書,右擊導出,
至此準備工做已經徹底搞定。
以後貼代碼
iOS客戶端
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSString* str = [UIDevice currentDevice]; NSLog(@"%@",str); // Override point for customization after application launch. //判斷是否由遠程消息通知觸發應用程序啓動 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; } #pragma 代理方法token NSString -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{ // 獲取終端設備的標誌,這個標誌須要經過結構發送到服務器端,服務器端推送消息到APNS時須要知道的終端的標誌,APNS經過標誌的終端標誌來找到終端 NSString *token = [NSString stringWithFormat:@"%@",deviceToken]; NSLog(@"token ======= %@",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); }
這裏要添加一個地方,三個代理方法,
在application didFinishLaunchingWithOptions:添加代碼
添加三個代理方法
java服務端
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; import org.junit.Test; public class PushDemo { // 方法一 public static void main(String[] args)throws Exception{ // String deviceToken = "d4b3c5f3d497554f56f6f9791872666ae06e3b4e7abad6f4792dcd030007db91"; String deviceToken = "42b74bacb28414c856505e2e6d70fe7940540a8c8fa4c728b3338c9ec1575367"; String alert = "誒~你慘了~隨時給你發垃圾信息~{{{(>_<)}}}~";//push的內容 int badge = 3;//圖標小紅圈的數值 String sound = "default";//鈴音 List<String> tokens = new ArrayList<String>(); tokens.add(deviceToken); String certificatePath = "/Users/etund/Desktop/push/證書.p12"; String certificatePassword = "123456";//此處注意導出的證書密碼不能爲空由於空密碼會報錯 boolean sendCount = true; try { PushNotificationPayload payLoad = new PushNotificationPayload(); payLoad.addAlert(alert); // 消息內容 payLoad.addBadge(badge); // iphone應用圖標上小紅圈上的數值 // payLoad.addCustomAlertBody("噢嘿嘿~捏嘻嘻~哇咔咔咔~"); if (!StringUtils.isBlank(sound)) { payLoad.addSound(sound);//鈴音 } PushNotificationManager pushManager = new PushNotificationManager(); //true:表示的是產品發佈推送服務 false:表示的是產品測試推送服務 pushManager.initializeConnection(new AppleNotificationServerBasicImpl(certificatePath, certificatePassword, false)); List<PushedNotification> notifications = new ArrayList<PushedNotification>(); // 發送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> device = new ArrayList<Device>(); for (String token : tokens) { device.add(new BasicDevice(token)); } notifications = pushManager.sendNotifications(payLoad, device); } List<PushedNotification> failedNotifications = PushedNotification.findFailedNotifications(notifications); List<PushedNotification> successfulNotifications = PushedNotification.findSuccessfulNotifications(notifications); int failed = failedNotifications.size(); int successful = successfulNotifications.size(); System.out.println(failedNotifications); System.out.println(successfulNotifications); pushManager.stopConnection(); } catch (Exception e) { e.printStackTrace(); } } // 方法二 @Test public void test2() { /**APNS推送須要的證書、密碼、和設備的Token**/ String p12Path = "/Users/etund/Desktop/push/證書.p12"; String password = "123456"; String pushToken = "42b74bacb28414c856505e2e6d70fe7940540a8c8fa4c728b3338c9ec1575367"; try { /**設置參數,發送數據**/ ApnsService service = APNS.newService().withCert(p12Path,password).withSandboxDestination().build(); String payload = APNS.newPayload().alertBody("hello,www.mbaike.net").badge(1).sound("default").build(); service.push(pushToken, payload); System.out.println("推送信息已發送!"); } catch (Exception e) { System.out.println("出錯了:"+e.getMessage()); } } }
至於java服務的jar包
至此服務端和客戶端已經所有能夠運行
最後看看運行效果
手機端
好了,結束!
所有原創,轉載請說明出處。