一、原生開發(fā)推送
今天看到一篇很詳細(xì)的關(guān)于推送的相關(guān)文章,一系列的本地推送和遠(yuǎn)程推送都有,收藏下來,以備后用!
第一蝙叛、遠(yuǎn)程推送相關(guān)
一、前往開發(fā)者中心配置 推送調(diào)試證書(用于未上線前推送調(diào)試)和推送發(fā)布證書(用于上線后推送)
注冊證書鏈接
二褒颈、將證書的.cer和.p12文件提供給后臺合成.pem文件
三、代碼相關(guān)
0.點擊工程 - TARGETS - Capabilities - Push Notifications 打開励堡,會在項目中生成一個 工程名.entitlements 文件
1.在 AppDelegate 中導(dǎo)入 頭文件和協(xié)議
// 推送
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications>
#endif
<UNUserNotificationCenterDelegate>
2.在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法里實現(xiàn) 請求權(quán)限和注冊通知代碼
// 推送相關(guān)
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
//iOS10特有
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
// 必須寫代理,不然無法監(jiān)聽通知的接收與點擊
center.delegate = self;
// 請求用戶權(quán)限
[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
// 點擊允許
if (granted) {
NSLog(@"注冊成功");
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
NSLog(@"%@", settings);
}];
} else {
// 點擊不允許
NSLog(@"注冊失敗");
}
}];
}else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0){
//iOS8 - iOS10
// 申請用戶權(quán)限
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil]];
}
//此方法不寫 無法調(diào)用接收推送回調(diào)方法 didRegisterForRemoteNotificationsWithDeviceToken
//注冊遠(yuǎn)程通知
[[UIApplication sharedApplication] registerForRemoteNotifications];
3.將獲取到的 deviceToken值傳給后臺服務(wù)器堡掏,
#pragma mark - 推送相關(guān)
/* 獲取蘋果服務(wù)器返回的 Device Token */
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
NSString *tokenString = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString:@"<" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"deviceTokenString : %@", tokenString);
// 返給后臺 deviceToken 必須返回
// NSString *urlHttp = @"v.showbuy100.com/index.php?r=order/apns";
// NSString *urlString = [urlHttp stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "].invertedSet];
// [[MSUAFNRequest sharedInstance] postRequestWithURL:urlString parameters:tokenString withBlock:^(id obj, NSError *error) {
// if (!error) {
// NSLog(@"------------obj--------------%@",obj);
// }else{
// NSLog(@"-----------error---------------%@",error);
//
// }
// }];
}
/* 獲得Device Token失敗 */
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}
4.調(diào)用接收通知的代理方法 (注:前臺模式下暫無法接受推送消息应结,需要退到后臺才會顯示消息)
/* 接收到推送消息的代理方法 */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
NSLog(@"-----------接收到了遠(yuǎn)程通知--------------%@",userInfo);
if (application.applicationState == UIApplicationStateInactive) {
NSLog(@"Inactive");
completionHandler(UIBackgroundFetchResultNewData);
} else if (application.applicationState == UIApplicationStateActive){
NSLog(@"Active");
completionHandler(UIBackgroundFetchResultNewData);
} else if (application.applicationState == UIApplicationStateBackground){
NSLog(@"Backround");
completionHandler(UIBackgroundFetchResultNewData);
}
}
5.iOS10 新增方法
/* iOS10 以后版本新增代理 關(guān)閉或后臺模式 點擊通知欄會調(diào)用這個方法 */
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
NSLog(@"iOS10 后新增代理 點擊通知欄會調(diào)用這個方法");
NSDictionary *dict = response.notification.request.content.userInfo;
NSLog(@"推送--- %@",dict);
NSDictionary *dataDic = dict[@"aps"];
// NSString *str = dict[@"aps"][@"alert"][@"title"];
if ([dataDic[@"type"] isEqualToString:@"100"] || [dataDic[@"type"] isEqualToString:@"99"] || [dataDic[@"type"] isEqualToString:@"97"] || [dataDic[@"type"] isEqualToString:@"95"]) {// 100-發(fā)貨提醒:買家提醒買家發(fā)貨 | 99-您出售的商品 XX已完成交易,小貝已將XX元存入您的錢包 | 97-XX 買家購買的XX 商品,已發(fā)起退貨/退款申請,點擊查看詳情>> | 95-XX買家購買的XX 商品已退貨,請注意處理
[self pushOrderDetailCenterWithPushCode:200];
} else if ([dataDic[@"type"] isEqualToString:@"98"] || [dataDic[@"type"] isEqualToString:@"94"] || [dataDic[@"type"] isEqualToString:@"93"] ){//98-您購買的xx賣家已發(fā)貨 | 94-您購買的XX商品,賣家已拒絕您的退貨/退款申請,點擊查看詳情>> | 93-您購買的XX商品,賣家已同意您的退貨/退款申請,點擊查看詳情>>
[self pushOrderDetailCenterWithPushCode:201];
} else if ([dataDic[@"type"] isEqualToString:@"96"] || [dataDic[@"type"] isEqualToString:@"92"] || [dataDic[@"type"] isEqualToString:@"91"] ){ // 96-您出售的商品 XX已完成交易,小貝已將XX元存入您的錢包 | 92-您申請退貨的XX商品賣家已簽收,貨款XX元已退回至您的付款賬戶
[self pushMoneyMineWithPushCode:0];
} else if ([dataDic[@"alert"][@"body"] isEqualToString:@"您有一條新消息"]){
[self pushMessageWithPushCode:0];
}
NSString *categoryIdentifier = response.notification.request.content.categoryIdentifier;
NSLog(@"推送2--- %@",categoryIdentifier);
// if ([categoryIdentifier isEqualToString:@"message"]) {//識別需要被處理的拓展
//
// if ([response.actionIdentifier isEqualToString:@"回復(fù)"]) {//識別用戶點擊的是哪個 action
//
// //假設(shè)點擊了輸入內(nèi)容的 UNTextInputNotificationAction 把 response 強(qiáng)轉(zhuǎn)類型
// UNTextInputNotificationResponse *textResponse = (UNTextInputNotificationResponse*)response;
// //獲取輸入內(nèi)容
// NSString *userText = textResponse.userText;
// //發(fā)送 userText 給需要接收的方法
//
// } else if ([response.actionIdentifier isEqualToString:@"清除"]){
//
// }
// }
}
/* iOS10 以后版本新增代理 前臺模式 可顯示通知提示內(nèi)容 */
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
NSLog(@"iOS10 后新增代理 前臺可顯示通知提示內(nèi)容");
// 顯示通知
completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound);
}
四、注意點
1.iOS7以后配置文件 Xcode會自動生成泉唁,所以配置文件不需要6炝洹(前往 開發(fā)者中心 - Account - Certificates, Identifiers & Profiles - Provisioning Profiles - All 查看是否有多余的配置文件)
2.推送出現(xiàn)問題原因有三種可能 ,
1)證書不對 檢驗證書可以通過后臺是否可以跟蘋果服務(wù)器對接亭畜,若能對接說明證書正確扮休,若不能對接證書很大幾率出現(xiàn)問題
2)deviceToken不對 檢驗deviceToken,可以打印出來拴鸵,如果在出現(xiàn)不卸載不重裝系統(tǒng)情況下玷坠,值不發(fā)生變化說明 deviceToken值正確N仙Α(注:APP應(yīng)用卸載會造成 deviceToken值發(fā)生變化 ,不會發(fā)生變化的是UUID)
3)后臺錯誤 (接口不對應(yīng)八堡,服務(wù)器地址問題樟凄,.pem文件配置錯誤)
3.遠(yuǎn)程推送 在前臺模式接收不到消息,只有退到后臺模式才會接受到消息兄渺,- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 方法才會調(diào)用缝龄!
4.申請用戶權(quán)限后,切記需要注冊遠(yuǎn)程通知 挂谍! 如果不注冊遠(yuǎn)程通知叔壤,獲取deviceToken的方法 didRegisterForRemoteNotificationsWithDeviceToken 不會調(diào)用,注冊代碼如下:
[[UIApplication sharedApplication] registerForRemoteNotifications];
二口叙、個推 - 第三方
1.集成和Appdelegate代碼參考個推文檔中心說明炼绘!
2.注意點
1)手動集成導(dǎo)入包的時候,注意文字 :“**將GtSdkLib目錄拷貝到項目工程目錄下庐扫,導(dǎo)入GtSdkLib文件夾:**” 饭望!跟百度API一樣,需要先把SDK拖到項目本地工程中形庭,在 addfile到項目中铅辞!
1)注意 TARGET 里面的 Linked Frameworks and libraries 里面的庫!切記不能出現(xiàn) GTExtensionSDK.framework 萨醒,一旦出現(xiàn)就會出現(xiàn)77個重復(fù)報錯問題斟珊!嚴(yán)格遵守下列圖片中的各類庫添加!
EB7D0F34-9751-4E51-9AD7-388A361850B0.png