//这个方法无论是远程推送还是程序间调用都用到了
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//先注册远程通知
[self registerFromRemoteNotificationToGetToken];
//远程推送、程序件调用的判断
if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]!=nil) {
//收到远程推送 APP程序未启动时调
} else if ( [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey]){
//应用间调用设置根控制器
}
return YES; //如果返回NO则不会触发application: handleOpenURL:方法,导致程序之间不能调用
}
//注册通知
-(void)registerFromRemoteNotificationToGetToken {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings
settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
} else {
[[UIApplication sharedApplication]registerForRemoteNotificationTypes:
UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge];
}
}
//程序间调用触发方法
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
//可以设置widows的跟控制根
}
//注册远程通知后返回的Token,推送的标识
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
//将device token转换为字符串及格式处理(处理后的token时64位的数字字母组合)
NSString *deviceTokenStr = [NSString stringWithFormat:@"%@",deviceToken];
deviceTokenStr = [deviceTokenStr stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
deviceTokenStr = [deviceTokenStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//将deviceToken保存在NSUserDefaults
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:deviceTokenStr forKey:DeviceTokenStringKEY];
[userDefaults synchronize];
}
//注册通知失败重新注册
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
//如果device token获取失败则需要重新获取一次
[NSTimer scheduledTimerWithTimeInterval:1*60 target:self selector:@selector(registerFromRemoteNotificationToGetToken) userInfo:nil repeats:NO];
}
//收到远程通知 APP状态是活跃或者后台挂起
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
if (application.applicationState == UIApplicationStateActive) {//活跃
} else {//其他状态
}
}