iOS 推送通知

  • 注意:通知是一个应用程序级别的操作UIApplication

推送通知 与 NSNotification 区别

  • NSNotification是抽象的,不可见的
  • 推送通知是可见的(能用肉眼看到)

iOS中提供了2种推送通知

  • 本地推送通知(Local Notification)
  • 远程推送通知(Remote Notification)

推送通知的作用

  • 可以让不在前台运行的app,告知用户app内部发生了什么事情

推送通知的呈现效果总结

  • 用户接收的推送通知,都会展示在“通知中心”
    • 从屏幕顶部往下滑,就能调出“通知中心”
  • 显示横幅还是UIAlertView,取决于用户的设置

总结一下,推送通知有5种不同的呈现效果

  • 在屏幕顶部显示一块横幅(显示具体内容
  • 在屏幕中间弹出一个UIAlertView(显示具体内容
  • 在锁屏界面显示一块横幅(锁屏状态下,显示具体内容
  • 更新app图标的数字(说明新内容的数量
  • 播放音效(提醒作用

推送通知的使用细节

  • 发出推送通知时,如果当前程序正运行在前台,那么推送通知就不会被呈现出来

  • 点击推送通知后,默认会自动打开发出推送通知的app

  • 不管app打开还是关闭,推送通知都能如期发出

本地推送

  • AppDelegate.h文件
#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    /*
     UIUserNotificationTypeNone    = 0,      无类型(不给用户发通知)
     UIUserNotificationTypeBadge   = 1 << 0, 是否可以改变应用图标右上角的提示数字
     UIUserNotificationTypeSound   = 1 << 1, 该通知是否会有声音
     UIUserNotificationTypeAlert   = 1 << 2, 是否有弹出提示
     */
    if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
    }
    
    if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
        // 跳转
        UILabel *label = [[UILabel alloc] init];
        label.frame = CGRectMake(0, 300, 300, 300);
        label.backgroundColor = [UIColor redColor];
        label.text = [NSString stringWithFormat:@"%@", launchOptions];
        label.font = [UIFont systemFontOfSize:14];
        label.numberOfLines = 0;
        [self.window.rootViewController.view addSubview:label];
    }
    
    return YES;
}

/**
 *  点击通知打开应用的时候会执行该方法
 *  应用在前台的时候,收到通知也会执行该方法
 *
 *  @param notification 通知
 */
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    UILabel *label = [[UILabel alloc] init];
    label.frame = CGRectMake(0, 0, 300, 300);
    label.backgroundColor = [UIColor redColor];
    label.text = [NSString stringWithFormat:@"%@", notification];
    label.font = [UIFont systemFontOfSize:14];
    label.numberOfLines = 0;
    [self.window.rootViewController.view addSubview:label];
//    if (application.applicationState == UIApplicationStateBackground) {
//        
//    }
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return YES;
}

@end
  • 推送
#import "ViewController.h"

@interface ViewController ()

/**
 *  点击按钮后添加本地通知
 */
- (IBAction)addLocalNote;
/**
 *  移除通知(不常用)
 */
- (IBAction)removeLocalNote;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

/**
 *  点击按钮后添加本地通知
 */
- (IBAction)addLocalNote {
    
    /*
     @property(nonatomic,copy) NSDate *fireDate;
     @property(nonatomic,copy) NSTimeZone *timeZone;
     @property(nonatomic) NSCalendarUnit repeatInterval;
     @property(nonatomic,copy) NSCalendar *repeatCalendar;
     @property(nonatomic,copy) CLRegion *region NS_AVAILABLE_IOS(8_0);
     @property(nonatomic,assign) BOOL regionTriggersOnce NS_AVAILABLE_IOS(8_0);
     
     @property(nonatomic,copy) NSString *alertBody;
     @property(nonatomic) BOOL hasAction;
     @property(nonatomic,copy) NSString *alertAction;
     @property(nonatomic,copy) NSString *alertLaunchImage;
     @property(nonatomic,copy) NSString *soundName;      UILocalNotificationDefaultSoundName
     @property(nonatomic) NSInteger applicationIconBadgeNumber;
     
     
     @property(nonatomic,copy) NSDictionary *userInfo;
     */
    // 1.创建一个本地通知
    UILocalNotification *localNote = [[UILocalNotification alloc] init];
    
    // 1.1.设置通知发出的时间
    localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
    
    // 1.2.设置通知发出的内容
    localNote.alertBody = @"吃饭了吗?";
    
    // 1.3.是否弹出提示框
    localNote.hasAction = YES;
    
    // 1.4.设置提示框
    localNote.alertAction = @"赶紧查看";
    
    // 1.5.设置启动的图片
    localNote.alertLaunchImage = @"1111";
    
    // 1.6.设置启动的音效
    localNote.soundName = UILocalNotificationDefaultSoundName;
    
    // 1.7.设置应用图标提醒的数字
    localNote.applicationIconBadgeNumber = 999;
    
    // 1.8.如果想将通知的信息传递过去,必须使用userInfo属性
    localNote.userInfo = @{@"msg" : @"吃饭了吗", @"date" : localNote.fireDate};
    
    // 2.调度通知
    [[UIApplication sharedApplication] scheduleLocalNotification:localNote];
    
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
}

- (IBAction)removeLocalNote {
    [[UIApplication sharedApplication] cancelAllLocalNotifications];
//    [UIApplication sharedApplication] cancelLocalNotification:(UILocalNotification *)
}
@end

远程推送

  • 1.appDelegate.h文件
#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) {
        // 1.向用户请求可以给用户推送消息
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
        [application registerUserNotificationSettings:settings];
        
        // 2.注册远程通知(拿到用户的DeviceToken)
        [application registerForRemoteNotifications];
    } else {
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    }
    
    if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
        // 页面的跳转
    }
    
    [application setApplicationIconBadgeNumber:0];
    
    return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // 5e8cf393 9e950137 86ac8375 12185078 19eb3ebd 936777e1 f061caec a48cb236
    // 将用户的用户名和deviceToken发送给服务器,让服务器进行保存备份即可
    NSLog(@"%@", deviceToken);
}

/**
 *  当接受到远程通知的时候会调用该方法
 *
 *  @param userInfo    远程通知的信息
 */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    // 在这里可以跳转的其他页面
    NSLog(@"%@", userInfo);
}

/**
 *  如果接受到远程通知时,想要后台执行任务,则实现调用该方法
 *
 *  @param userInfo
 *  @param completionHandler 后台执行完之后要告知系统,是否更新成功
 */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"%@", userInfo);
    
    completionHandler(UIBackgroundFetchResultNewData);
}

@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容