iOS本地通知或者本地推送的使用
遠端推送基本都沒啥問題,按規範來走,證書做好給伺服器,本地載入上證書基本都是可以實現的。
本地通知就需要自己建立通知,傳送通知,比遠端多了這兩步,一般的會有幾個需要注意的地方:
1,iOS8-iOS10是一套發通知方法,10以後是一套方法;
2,通知可能不顯示,可能會覆蓋,只顯示一個;
3,iOS10以前,APP在前臺時收到通知不下拉自動顯示(搞了很久,有實現的留言探討下);
4,APP在前臺,下拉檢視通知列表時,如果此時有通知發出,程式會呼叫在後臺開啟通知的方法。如果程式碼裡顯示通知內容是進行頁面跳轉,這個時候就實現了頁面跳轉,接收幾個通知,就顯示幾個頁面;
使用通知先註冊通知:在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中註冊以下程式碼:
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings];
}
先看iOS10以後傳送本地通知,程式碼如下:
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.title = @"title";
content.body = @"body";
content.sound = [UNNotificationSound defaultSound];
content.userInfo =
@{@"userInfo":data,@"type" : [NSString stringWithFormat:@"%ld",(long)type]};
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier: [[NSUUID UUID] UUIDString] content:content trigger:nil];
[center addNotificationRequest:request withCompletionHandler:^(NSError *_Nullable error) {
NSLog(@"成功新增推送");
}];
注意設定代理,注意設定唯一identifier,如果不設定,會覆蓋,只顯示一個通知。下面實現代理,在傳送通知的頁面實現以下代理方法:
//iOS10新增:處理前臺收到通知的代理方法
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
NSDictionary * userInfo = notification.request.content.userInfo;
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {//應用處於前臺時的遠端推送接受
} else {//應用處於前臺時的本地推送接受
completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge);//
}
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler{
if (@available(iOS 10.0, *)) {
UNNotificationContent *content = response.notification.request.content;
// 如果在上面的通知方法中設定了一些,可以在這裡列印額外資訊的內容,就做到監聽,也就可以根據額外資訊,做出相應的判斷
NSData *data = [content.userInfo objectForKey:@"userInfo"];
NSString *type = [content.userInfo objectForKey:@"type"];
NSUInteger c = [type integerValue];
AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
[app processNotificationData:c data:data];
} else {
// Fallback on earlier versions
}
}
第一個方法是顯示通知用的,第二個是接收通知用的。可以在第二個方法進行頁面操作。
再來看iOS10以前,發通知程式碼:
// 1.建立本地通知
UILocalNotification *localNote = [[UILocalNotification alloc] init];
// 2.設定本地通知的內容
// 2.1.設定通知發出的時間
localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:3.0];
// 2.2.設定通知的內容
localNote.alertBody = @"在幹嗎?";
// 2.3.設定滑塊的文字(鎖屏狀態下:滑動來“解鎖”)
localNote.alertAction = @"解鎖";
// 2.4.決定alertAction是否生效
localNote.hasAction = NO;
// 2.5.設定點選通知的啟動圖片
localNote.alertLaunchImage = @"launch.png";
// 2.6.設定alertTitle
localNote.alertTitle = @"title";
// 2.7.設定有通知時的音效
localNote.soundName = @"buyao.wav";
// 2.8.設定應用程式圖示右上角的數字
NSInteger i = [UIApplication sharedApplication].applicationIconBadgeNumber;
localNote.applicationIconBadgeNumber = i +1;
// 2.9.設定額外資訊
localNote.userInfo = @{@"userInfo":data,@"type" : [NSStringstringWithFormat:@"%ld",(long)type]};
// 3.呼叫通知
[[UIApplication sharedApplication] presentLocalNotificationNow:localNote];
再來看接收通知的方法,在APPdelegate實現:
/*
應用程式在進入前臺,或者在前臺的時候都會執行該方法
*/
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
// 必須要監聽--應用程式在後臺的時候進行的跳轉
if (application.applicationState == UIApplicationStateInactive) {
NSLog(@"UIApplicationStateInactive");
// 如果在上面的通知方法中設定了一些,可以在這裡列印額外資訊的內容,就做到監聽,也就可以根據額外資訊,做出相應的判斷
NSData *data = [notification.userInfo objectForKey:@"userInfo"];
NSString *type = [notification.userInfo objectForKey:@"type"];
NSUInteger c = [type integerValue];
[self processNotificationData:c data:data];
}else if (application.applicationState == UIApplicationStateActive){
NSLog(@"UIApplicationStateActive");
}else{
NSLog(@"UIApplicationStateBackground");
}
}
注意,如果在didReceiveLocalNotification實現了,
application.applicationIconBadgeNumber = 0;
那通知也不會實現.
Good luck!
如果能對您有幫助,請幫忙點贊!