iOS——本地推送
iOS——本地推送
首先我们要知道本地推送是什么,iOS开发中经常用到本地通知,有时也叫做本地推送,两者都是同一个类UILocalNotification,这个类可以用于开发者灵活控制一些需要推送到通知栏的信息,比如提示信息,日程提醒或者是一些其他应用信息,它和远程通知(也叫远程推送,RemoteNotification)本质没有多大区别,唯一区别在于发起的地方不同,本地通知在APP内发起,而远程通知由远端服务器发起通过APNS推送到设备,两者展示的方式都一样,都会出现在通知栏,都可以携带信息。下面用通过三个步骤来讲下本地通知的使用方法。
看看这张图:
是不是觉得很眼熟,这是在我们手机退出了QQ返回到桌面或者其他应用的时候,当QQ又来了消息时,在最顶部出现的一条关于QQ消息的推送个,这就是一个本地推送。其实基本上大多数app在不使用的时候也会有本地推送,推送一些可能让用户感兴趣的内容,用户感兴趣了或者有需求了就会点进去。
本地通知的使用
在iOS8及以后发送本地通知前需要先注册一个本地通知:
#import "AppDelegate.h"
#import <UserNotifications/UserNotifications.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self registerAPN];
return YES;
}
- (void)registerAPN {
if (@available(iOS 10.0, *)) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
}];
} else {
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:setting];
}
}
#import "ViewController.h"
#import <UserNotifications/UserNotifications.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor lightGrayColor];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self removeAllNotification];
}
- (IBAction)addLocalNoticeAction:(UIButton *)sender {
[self checkUserNotificationEnable];
[self addLocalNotice];
}
- (IBAction)gotoSettingAction:(UIButton *)sender {
[self goToAppSystemSetting];
}
- (void)addLocalNotice {
if (@available(iOS 10.0, *)) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
// 标题
content.title = @"注意休息";
content.subtitle = @"已经深夜了,好好休息";
// 内容
content.body = @"明天又是元气满满的一天";
// 声音
// content.sound = [UNNotificationSound defaultSound];
content.sound = [UNNotificationSound soundNamed:@"Alert_ActivityGoalAttained_Salient_Haptic.caf"];
// 角标 (我这里测试的角标无效,暂时没找到原因)
content.badge = @1;
// 多少秒后发送,可以将固定的日期转化为时间
NSTimeInterval time = [[NSDate dateWithTimeIntervalSinceNow:3] timeIntervalSinceNow];
// NSTimeInterval time = 10;
// repeats,是否重复,如果重复的话时间必须大于60s,要不会报错
UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:time repeats:NO];
/*
//如果想重复可以使用这个,按日期
// 周一早上 8:00 上班
NSDateComponents *components = [[NSDateComponents alloc] init];
// 注意,weekday默认是从周日开始
components.weekday = 2;
components.hour = 8;
UNCalendarNotificationTrigger *calendarTrigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES];
*/
// 添加通知的标识符,可以用于移除,更新等操作
NSString *identifier = @"noticeId";
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier content:content trigger:trigger];
[center addNotificationRequest:request withCompletionHandler:^(NSError *_Nullable error) {
NSLog(@"成功添加推送");
}];
}else {
UILocalNotification *notif = [[UILocalNotification alloc] init];
// 发出推送的日期
notif.fireDate = [NSDate dateWithTimeIntervalSinceNow:10];
// 推送的内容
notif.alertBody = @"你已经10秒没出现了";
// 可以添加特定信息
notif.userInfo = @{@"noticeId":@"00001"};
// 角标
notif.applicationIconBadgeNumber = 1;
// 提示音
notif.soundName = UILocalNotificationDefaultSoundName;
// 每周循环提醒
notif.repeatInterval = NSCalendarUnitWeekOfYear;
[[UIApplication sharedApplication] scheduleLocalNotification:notif];
}
}
// 移除某一个指定的通知
- (void)removeOneNotificationWithID:(NSString *)noticeId {
if (@available(iOS 10.0, *)) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) {
for (UNNotificationRequest *req in requests){
NSLog(@"存在的ID:%@\n",req.identifier);
}
NSLog(@"移除currentID:%@",noticeId);
}];
[center removePendingNotificationRequestsWithIdentifiers:@[noticeId]];
}else {
NSArray *array=[[UIApplication sharedApplication] scheduledLocalNotifications];
for (UILocalNotification *localNotification in array){
NSDictionary *userInfo = localNotification.userInfo;
NSString *obj = [userInfo objectForKey:@"noticeId"];
if ([obj isEqualToString:noticeId]) {
[[UIApplication sharedApplication] cancelLocalNotification:localNotification];
}
}
}
}
// 移除所有通知
- (void)removeAllNotification {
if (@available(iOS 10.0, *)) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center removeAllPendingNotificationRequests];
}else {
[[UIApplication sharedApplication] cancelAllLocalNotifications];
}
}
- (void)checkUserNotificationEnable { // 判断用户是否允许接收通知
if (@available(iOS 10.0, *)) {
__block BOOL isOn = NO;
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.notificationCenterSetting == UNNotificationSettingEnabled) {
isOn = YES;
NSLog(@"打开了通知");
}else {
isOn = NO;
NSLog(@"关闭了通知");
[self showAlertView];
}
}];
}else {
if ([[UIApplication sharedApplication] currentUserNotificationSettings].types == UIUserNotificationTypeNone){
NSLog(@"关闭了通知");
[self showAlertView];
}else {
NSLog(@"打开了通知");
}
}
}
- (void)showAlertView {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"通知" message:@"未获得通知权限,请前去设置" preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
[alert addAction:[UIAlertAction actionWithTitle:@"设置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self goToAppSystemSetting];
}]];
[self presentViewController:alert animated:YES completion:nil];
}
// 如果用户关闭了接收通知功能,该方法可以跳转到APP设置页面进行修改
- (void)goToAppSystemSetting {
dispatch_async(dispatch_get_main_queue(), ^{
UIApplication *application = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([application canOpenURL:url]) {
if (@available(iOS 10.0, *)) {
if ([application respondsToSelector:@selector(openURL:options:completionHandler:)]) {
[application openURL:url options:@{} completionHandler:nil];
}
}else {
[application openURL:url];
}
}
});
}
然后我们点击添加本地推送,就可以达到预期的效果了:
而且我们在锁屏的时候也会接到本地通知:
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgabbff
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01