iOS 推送通知注册设备
示例
要为您的设备注册推送通知,请在didFinishLaunchingWithOptions方法中将以下代码添加到您的AppDelegate文件中:
迅速
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { //应用程序启动后用于自定义的替代点。 if UIDevice.currentDevice().systemVersion.compare(v, options: .NumericSearch) == NSOrderedAscending { // Register for Push Notitications, if running iOS < 8 if application.respondsToSelector("registerUserNotificationSettings:") { let types:UIUserNotificationType = (.Alert | .Badge | .Sound) let settings:UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: nil) application.registerUserNotificationSettings(settings) application.registerForRemoteNotifications() } else { //在iOS8之前注册推送通知 application.registerForRemoteNotificationTypes(.Alert | .Badge | .Sound) } } else { var center = UNUserNotificationCenter.currentNotificationCenter() center.delegate= self center.requestAuthorizationWithOptions((UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge)) {(granted: Bool, error: NSError) -> Void in if !error { UIApplication.sharedApplication().registerForRemoteNotifications() //要求该应用程序完全执行关于推送通知的操作 print("推送注册成功。") } else { print("Push registration FAILED") print("ERROR: \(error.localizedFailureReason!) - \(error.localizedDescription)") print("SUGGESTIONS: \(error.localizedRecoveryOptions) - \(error.localizedRecoverySuggestion!)") }) } return true }
目标C
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending) if( SYSTEM_VERSION_LESS_THAN( @"10.0" ) ) { if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) { //iOS8通知 [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; [application registerForRemoteNotifications]; } else { // iOS < 8 Notifications [application registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)]; } } else { UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate= self; [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) { if( !error ) { [[UIApplication sharedApplication] registerForRemoteNotifications]; //要求该应用程序完全执行关于推送通知的操作 NSLog( @"推送注册成功。" ); } else { NSLog( @"Push registration FAILED" ); NSLog( @"ERROR: %@ - %@", error.localizedFailureReason,error.localizedDescription); NSLog( @"SUGGESTIONS: %@ - %@", error.localizedRecoveryOptions,error.localizedRecoverySuggestion); } }]; } //从推送通知中检查您的应用午餐 //--------------------------------------------------- //HandelPush通知 if (launchOptions != nil) { //这里的应用程序将通过推送通知打开 //RemoteNotification NSDictionary* dictionary1 = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; //LocalNotification NSDictionary* dictionary2 = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; if (dictionary1 != nil) { //远程通知有效负载 NSLog(@"Launched from push notification: %@", dictionary1); //在这里处理您的推送通知 } if (dictionary2 != nil) { NSLog(@"Launched from dictionary2dictionary2dictionary2 notification: %@", dictionary2); double delayInSeconds = 7; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ //[selfaddMessageFromRemoteNotification:dictionary2updateUI:NO]; }); } } else {} //------------------------------------------------
上面的代码将尝试与APNs服务器通信以获取设备令牌(前提是您在iOS设置配置文件中启用了APNs)。
一旦与APNs服务器建立可靠的连接,该服务器就会为您提供设备令牌。
在添加完上面的代码之后,将这些方法添加到AppDelegate类中:
迅速
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { print("DEVICE TOKEN = \(deviceToken)") } func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) { print(error) }
目标C
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString * deviceTokenString = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""] stringByReplacingOccurrencesOfString: @">" withString: @""] stringByReplacingOccurrencesOfString: @" " withString: @""]; NSLog(@"The generated device token string is : %@",deviceTokenString); } - (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error { NSLog(@"Failed to get token, error: %@", error.description); }
根据注册成功或失败情况调用上述方法。
成功方案调用:
迅速
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { print("DEVICE TOKEN = \(deviceToken)") }
在Swift3中:
@objc(userNotificationCenter:willPresentNotification:withCompletionHandler:) @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { //在前台显示通知。 print("Userinfo2 \(notification.request.content.userInfo)") }
目标C
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { if(application.applicationState == UIApplicationStateInactive) { NSLog(@"Inactive - the user has tapped in the notification when app was closed or in background"); //做一些任务 [self handelPushNotification:userInfo]; } else if (application.applicationState == UIApplicationStateBackground) { NSLog(@"application Background - notification has arrived when app was in background"); [self handelPushNotification:userInfo]; } else { NSLog(@"application Active - notication has arrived while app was opened"); //显示应用内横幅 //做任务 } }
失败情况调用:
迅速
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) { print(error) }
目标C
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
注意
如果以上方法均未调用,则您的设备无法与APNs服务器建立可靠的连接,这可能是由于Internet访问问题所致。