這篇文章是搬遷自我自己的新浪博客的,因爲無法自動搬遷所以就自己動手了
前段時間公司的項目需要用到推送所以就這個方面做了些工作,現在想總結出來給大家共同分享。當然了,因爲本人水平有限,有錯漏的地方歡迎大家指正。
首先就是最繁瑣最重要的註冊證書了,關於證書的註冊很多前輩已經總結 的很詳細了,我在這裏就不多加贅述。這些鏈接都是比較全面的關於證書註冊的教程大家可以先看看http://blog.csdn.net/shenjie12345678/article/details/41120637,http://www.cocoachina.com/industry/20130321/5862.html這兩篇文章都介紹了證書註冊的一些知識,內容差不多。
我這篇文章將着重介紹證書生成後所要做的工作。首先你要生成服務端的證書,在這裏我就介紹怎樣生成java服務器的證書:
(1)將.cer文件轉換成.pem文件 openssl x509 -in aps_development.cer -inform der -out PushDevelopment.pem
(2)將.p12文件轉換爲.pem文件 openssl pkcs12 -nocerts -out PushChatKey.pem -in Push.p12
(3)將現在生成的兩個.pem文件生成.p12文件 openssl pkcs12 -export -in PushDevelopment.pem -inkey PushChatKey.pem -out pushCert.p12 -name “apns-cert”
通過這三步你就可以獲取到java服務器所需要的證書了,關於生成php服務器的證書的前面給的連接中都有涉及。
然後你要在你的工程中註冊推送,在- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(nullable NSDictionary )launchOptions NS_AVAILABLE_IOS(3_0)方法中可以註冊遠程推送
關於註冊推送的部分我寫 了個方法:
(void)iOSPushActionApplication:(UIApplication *)application {
#ifdef __IPHONE_8_0
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSetting ssettingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlertcategories:nil];
[[UIApplicationsharedApplication] registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
}
#else
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
#endif
}
#ifdef __IPHONE_8_0
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
[application registerForRemoteNotifications];
}
#endif
註冊推送完成後,appdelegate還有幾個關於推送的代理方法,我們可以在這幾個方法中對推送進行處理:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *st = [NSStringstringWithFormat:@"%@",deviceToken];
NSString *string = [st substringWithRange:NSMakeRange(1, st.length-2)];
NSString *substring = [string stringByReplacingOccurrencesOfString:@" "withString:@""]; //這樣獲取的字符串就是服務器所需要的deviceToken
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { //下面的處理是爲了點開推送后角標可以清零
[[UIApplicationsharedApplication] setApplicationIconBadgeNumber:1];
[[UIApplicationsharedApplication] setApplicationIconBadgeNumber:0];
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
NSLog(@"Regist fail%@",error);
}
此外關於推送的條數是服務器控制的(app圖標上的角標數),服務端向蘋果的服務器所發送的json串有一個key就是控制推送條數的,寫什麼數字,角標顯示的就是什麼數字。{“aps”:{“alert”:”這是iOS的推送測試.”,”badge”:1}},badge這key表示的就是角標數
最後,一般我們證書生成後都想拋開服務端自己測試測試,這樣你可以使用一個第三方的工具PushMeBaby。
你下載了這個PushMeBaby項目後首先要導入你的aps_development.cer證書,然後你要填入你獲取到的deviceToken。
在這個項目的ApplicationDelegate類的init方法中修改如下兩行代碼,將它改成你自己的信息:
self.deviceToken = @"8d33fbe9 c0d05bb0 325dd3e1 92a79fda c277ed85 3931c4d6 3bd15676 1b27572e"; //填寫你自己的deviceToken
self.certificate = [[NSBundlemainBundle] pathForResource:@"aps_development"ofType:@"cer"]; //填寫你自己的證書