-
1.簡介
- 推送分為本地推送和遠程推送2種。可以在應用沒有打開甚至手機鎖屏情況下給用戶以提示。它們都需要注冊,注冊后系統會彈出提示框(如下圖)提示用戶是否同意,如果同意則正常使用;如果用戶不同意則下次打開程序也不會彈出該提示框,需要用戶到設置里面設置。一共有三種提示類型:
UIUserNotificationTypeBadge:應用圖標右上角的信息提示
UIUserNotificationTypeSound:播放提示音
UIUserNotificationTypeAlert:提示框
- 推送分為本地推送和遠程推送2種。可以在應用沒有打開甚至手機鎖屏情況下給用戶以提示。它們都需要注冊,注冊后系統會彈出提示框(如下圖)提示用戶是否同意,如果同意則正常使用;如果用戶不同意則下次打開程序也不會彈出該提示框,需要用戶到設置里面設置。一共有三種提示類型:
-
2.本地推送
-
2.1本地推送的注冊以及拿到userInfo (程序被殺死時,即沒有啟動程序時點擊通知)
// 一般在在啟動時注冊通知
// 程序被殺死,點擊通知后調用此程序
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([UIDevice currentDevice].systemVersion.floatValue >= 10.0) { //iOS10特有
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
//進行用戶權限的申請
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
// 遵守代理協議
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
//在block中會傳入布爾值granted,表示用戶是否同意
if (granted) {
//點擊允許
NSLog(@"注冊通知成功");
// 獲取用戶對通知的設置信息 對應ios8的didRegisterUserNotificationSettings:代理方法, ios10不會調用這個代理方法
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
NSLog(@"settings:== %@", settings);
}];
} else {
//點擊不允許
NSLog(@"注冊通知失敗");
}
}];
// 2.自動獲取當前設備的UDID, 以及, app bundle id , 向蘋果服務器發送請求, 獲取deviceToken
// 如果是注冊遠程推送,還是和以前一樣,需要加上下面這行代碼
[[UIApplication sharedApplication] registerForRemoteNotifications];
#endif
}else if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) { // iOS 8.0 - iOS 10(iOS8-9使用)
// 1.請求授權
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:setting];
// 2.自動獲取當前設備的UDID, 以及, app bundle id , 向蘋果服務器發送請求, 獲取deviceToken
// 如果是注冊遠程推送,還是和以前一樣,需要加上下面這行代碼
[[UIApplication sharedApplication] registerForRemoteNotifications];
} else { // iOS 8.0之前不用請求授權
// 2.自動獲取當前設備的UDID, 以及, app bundle id , 向蘋果服務器發送請求, 獲取deviceToken
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
// ios8之前不用設置setting 即registerForRemoteNotificationTypes == registerForRemoteNotifications;
}
// 點擊通知后調用改方法, 通過
launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]獲取本地通知內容
// launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] == 代理方法中的userInfo參數
if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
// 這里添加處理代碼, 根據不同的通知內容進行不同的頁面處理
}
return YES;
}
-
2.1本地推送拿到userInfo (處于前臺或后臺時,點擊通知)
// 程序沒有被殺死(處于前臺或后臺),點擊通知后會調用此程序
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
// 這里添加處理代碼, 根據不同的通知內容進行不同的頁面處理
}
-
總結:
// 點擊本地通知時: 如果程序處于前臺或者后臺時調用, notification.userInfo是通知的消息。
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
// 點擊本地通知時: 如果程序被殺死時調用, (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]是通知的消息userInfo。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
-
2.3發送本地通知
范例1:
- (IBAction)addLocalNotification {
// 1.創建一個本地通知
UILocalNotification *localNote = [[UILocalNotification alloc] init];
// 1.1.設置通知發出的時間
localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
// 1.2.設置通知內容
localNote.alertBody = @"這是一個推送這是一個推送";
// 1.3.設置鎖屏時,字體下方顯示的一個文字
localNote.alertAction = @"趕緊!!!!!";
localNote.hasAction = YES;
// 1.4.設置啟動圖片(通過通知打開的)
localNote.alertLaunchImage = @"../Documents/IMG_0024.jpg";
// 1.5.設置通過到來的聲音
localNote.soundName = UILocalNotificationDefaultSoundName;
// 1.6.設置應用圖標左上角顯示的數字
localNote.applicationIconBadgeNumber = 999;
// 1.7.設置一些額外的信息
localNote.userInfo = @{@"qq" : @"704711253", @"msg" : @"success"};
// 2.執行通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNote];
}
范例2:
// 設置本地通知
+ (void)registerLocalNotification:(NSInteger)alertTime alertBody:(NSString *)alertBody userDict:(NSDictionary *)userDict
{
UILocalNotification *notification = [[UILocalNotification alloc] init];
// 設置觸發通知的時間
NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:alertTime];
notification.fireDate = fireDate;
// 時區
notification.timeZone = [NSTimeZone defaultTimeZone];
// 設置重復的間隔
notification.repeatInterval = kCFCalendarUnitSecond;
// 通知內容
notification.alertBody = alertBody;
notification.applicationIconBadgeNumber = 1;
// 通知被觸發時播放的聲音
notification.soundName = UILocalNotificationDefaultSoundName;
// 通知參數
notification.userInfo = userDict;
// ios8后,需要添加這個注冊,才能得到授權
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)])
{
UIUserNotificationType type = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
// 通知重復提示的單位,可以是天、周、月
notification.repeatInterval = NSCalendarUnitDay;
}
else
{
// 通知重復提示的單位,可以是天、周、月
notification.repeatInterval = NSDayCalendarUnit;
}
// 執行通知注冊
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
-
2.3取消本地通知
取消所有的本地通知
// 取消所有本地通知
[application cancelAllLocalNotifications];
取消某個本地通知
// 取消某個本地推送通知
+ (void)cancelLocalNotificationWithKey:(NSString *)key
{
// 獲取所有本地通知數組
NSArray *localNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;
for (UILocalNotification *notification in localNotifications)
{
NSDictionary *userInfo = notification.userInfo;
if (userInfo)
{
// 根據設置通知參數時指定的key來獲取通知參數
NSString *info = userInfo[key];
// 如果找到需要取消的通知,則取消
if (info != nil)
{
[[UIApplication sharedApplication] cancelLocalNotification:notification];
break;
}
}
}
}
-
參考博客:
http://www.cnblogs.com/r360/p/5741136.html http://blog.csdn.net/u014220518/article/details/51489139