iOS10 注册极光推送(干货)
发布日期:2021-11-10 08:20:50 浏览次数:1 分类:技术文章

本文共 9511 字,大约阅读时间需要 31 分钟。

苹果在iOS10上对apns推送做了修改, 极光也是很给力的, 在第一时间就对sdk进行了更新, 下面对iOS10注册极光推送进行一下记录.

首先, 在极光的开发者服务里注册应用获取appKey, 在apple Developer配置推送证书...等等等这些废话就不说了.

兼容iOS10的是极光2.1.9版本的sdk.

1. 导入SDK

2. 导入SDK依赖的系统框架

CFNetwork.framework

CoreFoundation.framework

CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
Security.framework

Xcode7需要的是libz.tbd Xcode7以下版本是libz.dylib

Adsupport.framework (获取IDFA需要;如果不使用IDFA,请不要添加)

UserNotifications.framework(Xcode8及以上

3. 设置Build Setting中, Search Paths的User Header Search Paths

4. 如果用的是Xcode8及以上环境开发需要开启Application TargetCapabilities->Push Notifications选项

这两个一定要都是对号 ,  这个选项不开启在iOS10后不会注册成功

添加这个选项会在项目中多这样一个文件

5. 不要忘记Xcode7以上需要支持http传输方式

下面是需要写的代码部分:

6. 在AppDelegate.m中, 引入头文件

[objc]
  1. // 极光推送  
  2. #import "JPUSHService.h"  
  3. #import <AdSupport/AdSupport.h>  
  4. #ifdef NSFoundationVersionNumber_iOS_9_x_Max  
  5. #import <UserNotifications/UserNotifications.h> // 这里是iOS10需要用到的框架  
  6. #endif  

7. 设置注册极光推送需要的一些参数
[objc]
  1. static NSString * const JPUSHAPPKEY = @"xxxxxxxxxxxxxxxxx"// 极光appKey  
  2. static NSString * const channel = @"Publish channel"// 固定的  
  3.   
  4. #ifdef DEBUG // 开发  
  5.   
  6. static BOOL const isProduction = FALSE; // 极光FALSE为开发环境  
  7.   
  8. #else // 生产  
  9.   
  10. static BOOL const isProduction = TRUE; // 极光TRUE为生产环境  
  11.   
  12. #endif  
8. 这里是AppDelegate.m中的代码, 分了几大块, 全部粘到下面, 直接复制可用(只需要下面这些代码就可以实现通知)

[objc]
  1. //  
  2. //  AppDelegate.m  
  3. //  iOS10_JPUSH  
  4. //  
  5. //  Created by 周昊 on 16/9/18.  
  6. //  Copyright © 2016年 周昊. All rights reserved.  
  7. //  
  8.   
  9. #import "AppDelegate.h"  
  10. // 极光推送  
  11. #import "JPUSHService.h"  
  12. #import <AdSupport/AdSupport.h>  
  13. #ifdef NSFoundationVersionNumber_iOS_9_x_Max  
  14. #import <UserNotifications/UserNotifications.h> // 这里是iOS10需要用到的框架  
  15. #endif  
  16.   
  17. static NSString * const JPUSHAPPKEY = @"xxxxxxxxxxxxxxxxx"// 极光appKey  
  18. static NSString * const channel = @"Publish channel"// 固定的  
  19.   
  20. #ifdef DEBUG // 开发  
  21.   
  22. static BOOL const isProduction = FALSE; // 极光FALSE为开发环境  
  23.   
  24. #else // 生产  
  25.   
  26. static BOOL const isProduction = TRUE; // 极光TRUE为生产环境  
  27.   
  28. #endif  
  29.   
  30. @interface AppDelegate ()<JPUSHRegisterDelegate> // 最新版的sdk需要实现这个代理方法  
  31.   
  32. @end  
  33.   
  34. @implementation AppDelegate  
  35.   
  36.   
  37. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
  38.       
  39.     // 注册apns通知  
  40.     if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0// iOS10  
  41.     {  
  42. #ifdef NSFoundationVersionNumber_iOS_9_x_Max  
  43.         JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];  
  44.         entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge | UNAuthorizationOptionSound;  
  45.         [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];  
  46. #endif  
  47.     }  
  48.     else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0// iOS8, iOS9  
  49.     {  
  50.         //可以添加自定义categories  
  51.         [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];  
  52.     }  
  53.     else // iOS7  
  54.     {  
  55.         //categories 必须为nil  
  56.         [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert) categories:nil];  
  57.     }  
  58.     /* 
  59.      *  launchingOption 启动参数. 
  60.      *  appKey 一个JPush 应用必须的,唯一的标识. 
  61.      *  channel 发布渠道. 可选. 
  62.      *  isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES. 
  63.      *  advertisingIdentifier 广告标识符(IDFA) 如果不需要使用IDFA,传nil. 
  64.      * 此接口必须在 App 启动时调用, 否则 JPush SDK 将无法正常工作. 
  65.      */  
  66.     // 广告标识符  
  67.     NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];  
  68.       
  69.     // 如不需要使用IDFA,advertisingIdentifier 可为nil  
  70.     // 注册极光推送  
  71.     [JPUSHService setupWithOption:launchOptions appKey:JPUSHAPPKEY channel:channel apsForProduction:isProduction advertisingIdentifier:advertisingId];  
  72.       
  73.     //2.1.9版本新增获取registration id block接口。  
  74.     [JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {  
  75.         if(resCode == 0)  
  76.         {  
  77.             // iOS10获取registrationID放到这里了, 可以存到缓存里, 用来标识用户单独发送推送  
  78.             NSLog(@"registrationID获取成功:%@",registrationID);  
  79.             [[NSUserDefaults standardUserDefaults] setObject:registrationID forKey:@"registrationID"];  
  80.             [[NSUserDefaults standardUserDefaults] synchronize];  
  81.         }  
  82.         else  
  83.         {  
  84.             NSLog(@"registrationID获取失败,code:%d",resCode);  
  85.         }  
  86.     }];  
  87.       
  88.     return YES;  
  89. }  
  90.   
  91. // ---------------------------------------------------------------------------------  
  92. - (void)applicationWillResignActive:(UIApplication *)application {  
  93. }  
  94.   
  95.   
  96. - (void)applicationDidEnterBackground:(UIApplication *)application {  
  97.     [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];  
  98. }  
  99.   
  100.   
  101. - (void)applicationWillEnterForeground:(UIApplication *)application {  
  102.     [application setApplicationIconBadgeNumber:0];  
  103.     [application cancelAllLocalNotifications];  
  104. }  
  105.   
  106.   
  107. - (void)applicationDidBecomeActive:(UIApplication *)application {  
  108. }  
  109.   
  110.   
  111. - (void)applicationWillTerminate:(UIApplication *)application {  
  112. }  
  113.   
  114. // ---------------------------------------------------------------------------------  
  115. #pragma mark - 注册推送回调获取 DeviceToken  
  116. #pragma mark -- 成功  
  117. - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken  
  118. {  
  119.     // 注册成功  
  120.     // 极光: Required - 注册 DeviceToken  
  121.     [JPUSHService registerDeviceToken:deviceToken];  
  122. }  
  123.   
  124. #pragma mark -- 失败  
  125. - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error  
  126. {  
  127.     // 注册失败  
  128.     NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);  
  129. }  
  130.   
  131. // ---------------------------------------------------------------------------------  
  132.   
  133. // 这部分是官方demo里面给的, 也没实现什么功能, 放着以备不时之需  
  134. #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1  
  135. - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings  
  136. {  
  137.       
  138. }  
  139.   
  140. // Called when your app has been activated by the user selecting an action from  
  141. // a local notification.  
  142. // A nil action identifier indicates the default action.  
  143. // You should call the completion handler as soon as you've finished handling  
  144. // the action.  
  145. - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler  
  146. {  
  147.       
  148. }  
  149.   
  150. // Called when your app has been activated by the user selecting an action from  
  151. // a remote notification.  
  152. // A nil action identifier indicates the default action.  
  153. // You should call the completion handler as soon as you've finished handling  
  154. // the action.  
  155. - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler  
  156. {  
  157.       
  158. }  
  159. #endif  
  160.   
  161. // ---------------------------------------------------------------------------------  
  162. - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification  
  163. {  
  164.     [JPUSHService showLocalNotificationAtFront:notification identifierKey:nil];  
  165. }  
  166.   
  167. // ---------------------------------------------------------------------------------  
  168.   
  169. #pragma mark - iOS7: 收到推送消息调用  
  170. - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {  
  171.       
  172.     // iOS7之后调用这个  
  173.     [JPUSHService handleRemoteNotification:userInfo];  
  174.     NSLog(@"iOS7及以上系统,收到通知");  
  175.       
  176.     if ([[UIDevice currentDevice].systemVersion floatValue] < 10.0 || application.applicationState > 0)  
  177.     {  
  178.         // 程序在前台或通过点击推送进来的会弹这个alert  
  179.         NSString *message = [NSString stringWithFormat:@"iOS7-8-9收到的推送%@", [userInfo[@"aps"] objectForKey:@"alert"]];  
  180.         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil nil];  
  181.         [alert show];  
  182.     }  
  183.     completionHandler(UIBackgroundFetchResultNewData);  
  184. }  
  185.   
  186. // ---------------------------------------------------------------------------------  
  187.   
  188. #pragma mark - iOS10: 收到推送消息调用(iOS10是通过Delegate实现的回调)  
  189. #pragma mark- JPUSHRegisterDelegate  
  190. #ifdef NSFoundationVersionNumber_iOS_9_x_Max  
  191. // 当程序在前台时, 收到推送弹出的通知  
  192. - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {  
  193.       
  194.     NSDictionary * userInfo = notification.request.content.userInfo;  
  195.       
  196.     if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]])  
  197.     {  
  198.         [JPUSHService handleRemoteNotification:userInfo];  
  199.         NSString *message = [NSString stringWithFormat:@"will%@", [userInfo[@"aps"] objectForKey:@"alert"]];  
  200.         NSLog(@"iOS10程序在前台时收到的推送: %@", message);  
  201.         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil nil];  
  202.         [alert show];  
  203.     }  
  204.   
  205.     completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以设置  
  206. }  
  207.   
  208.   
  209. // 程序关闭后, 通过点击推送弹出的通知  
  210. - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {  
  211.       
  212.     NSDictionary * userInfo = response.notification.request.content.userInfo;  
  213.       
  214.     if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]])  
  215.     {  
  216.         [JPUSHService handleRemoteNotification:userInfo];  
  217.         NSString *message = [NSString stringWithFormat:@"did%@", [userInfo[@"aps"] objectForKey:@"alert"]];  
  218.         NSLog(@"iOS10程序关闭后通过点击推送进入程序弹出的通知: %@", message);  
  219.         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil nil];  
  220.         [alert show];  
  221.     }  
  222.    
  223.     completionHandler();  // 系统要求执行这个方法  
  224. }  
  225. #endif  
  226.   
  227. @end  

注: 极光的AppKey要自己到极光的官网申请哦

本文来自:http://blog.csdn.net/cloud_pro/article/details/52574637

转载地址:https://blog.csdn.net/cxiao_11/article/details/52860489 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:iOS 关于app上线app store由于定位功能被拒解决方案
下一篇:Xcode8打包APP上传到APPStore遇到的问题

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月03日 06时31分26秒