App在后臺的情況希望通知用戶看到信息時使用本地推送通知實現(xiàn)。
1.導(dǎo)入系統(tǒng)框架
#import <UserNotifications/UserNotifications.h>
2.注冊本地通知樣式
UIApplication* application = [UIApplication sharedApplication];
if ([application currentUserNotificationSettings]) {
UIUserNotificationSettings* setting = [UIUserNotificationSettings
settingsForTypes:UIUserNotificationTypeBadge |
UIUserNotificationTypeSound |
UIUserNotificationTypeAlert
categories:nil];
[application registerUserNotificationSettings:setting];
}
3.清除之前注冊通知
[application cancelAllLocalNotifications];
如果不清除歷史通知,可能會收到之前的全部通知。
4.設(shè)置本次通知內(nèi)容
UILocalNotification* localNotif = [[UILocalNotification alloc] init];
// 發(fā)送時間
localNotif.fireDate =[NSDate dateWithTimeIntervalSinceNow:0];
// 在通知中心要展示的通知內(nèi)容
localNotif.alertBody = @"本地推送通知";
// 通知攜帶的內(nèi)容信息,開發(fā)者自行處理
localNotif.userInfo = @{@"userid":@(123), @"message":@"通知"};
// 自定義同事提示聲音,必須是.caf格式音頻文件
localNotif.soundName = @"voip_call.caf";
// 通知唯一標識,可以是msgId,用戶刪除、查找通知
localNotif.alertAction = @"notificationId";
[application scheduleLocalNotification:localNotif];
以上方法在 iOS10之后被棄用,iOS 開始使用UNUserNotificationCenter
具體邏輯大概類似。UNUserNotificationCenter的內(nèi)容更加豐富,可以通過它自行定義通知顯示樣式,功能更加強大。
UNUserNotificationCenter* center =
[UNUserNotificationCenter currentNotificationCenter];
UNMutableNotificationContent* content =
[[UNMutableNotificationContent alloc] init];
content.body = @"本地推送通知";
UNNotificationSound* sound =
[UNNotificationSound soundNamed:@"voip_call.caf"];
content.sound = sound;
content.userInfo = @{@"userid":@(123), @"message":@"通知"};
UNTimeIntervalNotificationTrigger* tirgger =
[UNTimeIntervalNotificationTrigger triggerWithTimeInterval:0.1
repeats:NO];
/// Identifier 通知唯一標識,用于刪除、查找通知
UNNotificationRequest* request =
[UNNotificationRequest requestWithIdentifier:@"notificationId"
content:content
trigger:tirgger];
[center addNotificationRequest:request
withCompletionHandler:^(NSError* _Nullable error) {
NSLog(@"%@本地推送 :( 報錯 %@", @"notificationKey", error);
}];
最后接收本地推送通知
- (void)application:(UIApplication*)application
didReceiveLocalNotification:(UILocalNotification*)notification {
}
iOS10之后
// 點擊推送消息后回調(diào)
- (void)userNotificationCenter:(UNUserNotificationCenter*)center
didReceiveNotificationResponse:(UNNotificationResponse*)response
withCompletionHandler:(void (^)(void))completionHandler {
NSLog(@"center content : %@", response.notification.request.content.userInfo);
}
有時候需要刪除通知中心的通知,類似微信撤回消息時會撤回通知
- (void)deleteAVChatLocalNotificationId:(NSString *)notificationId {
__block BOOL has = NO;
UIApplication* application = [UIApplication sharedApplication];
if (@available(iOS 10.0, *)) {
UNUserNotificationCenter* center =
[UNUserNotificationCenter currentNotificationCenter];
[center getPendingNotificationRequestsWithCompletionHandler:^(
NSArray<UNNotificationRequest*>* _Nonnull requests) {
for (UNNotificationRequest* request in requests) {
if ([request.identifier isEqualToString:notificationId]) {
has = YES;
break;
}
}
}];
if (has) {
[center
removeDeliveredNotificationsWithIdentifiers:@[notificationId]];
}
} else {
NSArray* localNotifications = [application scheduledLocalNotifications];
for (UILocalNotification* local in localNotifications) {
if ([local.alertAction isEqualToString:notificationId]) {
[application cancelLocalNotification:local];
has = YES;
break;
}
}
}
if (has) {
NSInteger num = [application applicationIconBadgeNumber];
if (num > 1) {
[application setApplicationIconBadgeNumber:num - 1];
} else {
[application setApplicationIconBadgeNumber:0];
}
}
}
mp3轉(zhuǎn) caf
第一步:獲取MP3文件路徑,為了方便測試,這里把文件放到了桌面上,地址為 :/Users/Mina/Desktop/1.mp3
第二步:設(shè)置CAF文件的輸出路徑,這里也放到了桌面上,路徑為:/Users/Mina/Desktop/2.caf
第三步:打開終端輸入命令:
afconvert /Users/Mina/Desktop/1.mp3 /Users/Mina/Desktop/2.caf -d ima4 -f caff -v
(注:不要忘記空格)