前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ios入门之消息推送

ios入门之消息推送

作者头像
xiangzhihong
发布于 2018-02-06 03:28:59
发布于 2018-02-06 03:28:59
2.1K00
代码可运行
举报
文章被收录于专栏:向治洪向治洪
运行总次数:0
代码可运行

前言

在去年的苹果大会上,苹果带来的iOS 10 系统中将之前繁杂的推送通知统一成UserNotifications.framework 来集中管理和使用通知功能,还增加一些实用的功能——撤回单条通知、更新已展示通知、中途修改通知内容、在通知中显示多媒体资源、自定义UI等功能。 那么在ios10之前,ios的消息推送是怎么分类的呢?

ios 10之前

在ios之前,iOS推送分为Local Notifications(本地推送) 和 Remote Notifications(远程推送)。

本地推送

不需要服务器支持(无需联网)就能发出的推送通知,app本地创建通知,加入到系统的Schedule里,如果触发器条件达成时会推送相应的消息内容,如常见的定时任务闹钟等。

使用上也是非常简单。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 @property(nonatomic,copy) NSDate *fireDate;
 @property(nonatomic,copy) NSTimeZone *timeZone; 时区

 @property(nonatomic) NSCalendarUnit repeatInterval; 重复间隔(枚举)
 @property(nonatomic,copy) NSCalendar *repeatCalendar; 重复日期(NSCalendar)

 @property(nonatomic,copy) CLRegion *region 设置区域(设置当进入某一个区域时,发出一个通知)

 @property(nonatomic,assign) BOOL regionTriggersOnce YES,只会在第一次进入某一个区域时发出通知.NO,每次进入该区域都会发通知

 @property(nonatomic,copy) NSString *alertBody;      

 @property(nonatomic) BOOL hasAction;                是否隐藏锁屏界面设置的alertAction
 @property(nonatomic,copy) NSString *alertAction;    设置锁屏界面一个文字

 @property(nonatomic,copy) NSString *alertLaunchImage;   启动图片
 @property(nonatomic,copy) NSString *alertTitle

 @property(nonatomic,copy) NSString *soundName;

 @property(nonatomic) NSInteger applicationIconBadgeNumber;

 @property(nonatomic,copy) NSDictionary *userInfo; // 设置通知的额外的数据
 */

- (IBAction)addLocalNote:(id)sender {
    // 创建一个本地通知
    UILocalNotification *localNote = [[UILocalNotification alloc] init];

    // 设置本地通知的一些属性(通知发出的时间/通知的内容)
    // 设置通知发出的时间
    localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5.0];
    //设置通知的内容
    localNote.alertBody = @"吃饭了吗?";
    //设置锁屏界面的文字
    localNote.alertAction = @"查看具体的消息";
    //设置锁屏界面alertAction是否有效
    localNote.hasAction = YES;
    //设置通过点击通知打开APP的时候的启动图片(无论字符串设置成什么内容,都是显示应用程序的启动图片)
    localNote.alertLaunchImage = @"111";
    //设置通知中心通知的标题
    localNote.alertTitle = @"222222222222";
    //设置音效
    localNote.soundName = @"buyao.wav";
    //设置应用程序图标右上角的数字
    localNote.applicationIconBadgeNumber = 1;
    //设置通知之后的属性
    localNote.userInfo = @{@"name" : @"张三", @"toName" : @"李四"};

    //调度通知
    [[UIApplication sharedApplication] scheduleLocalNotification:localNote];
}

当用户点击本地推送通知的时候,会自动打开app,这里有2种情况:app在后台运行,或者被系统进程杀死,对于这两种情况,我们怎么处理呢?

app后台运行

这时候我们只需要调用下AppDelegate方法即可。代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    // 跳转逻辑
    if (application.applicationState == UIApplicationStateActive) return;

    if (application.applicationState == UIApplicationStateInactive) {
        // 当应用在后台收到本地通知时执行的跳转代码
        [self jumpToSession];
    }

    NSLog(@"local notifacation %@", notification);
}

- (void)jumpToSession
{
    UILabel *redView = [[UILabel alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(0, 100, 300, 400);
    redView.numberOfLines = 0;
    // redView.text = [NSString stringWithFormat:@"%@", launchOptions];
    [self.window.rootViewController.view addSubview:redView];
}

app被杀死

对于app被杀死的情况,要先启动app,启动完毕会调用AppDelegate方法。 需要特别注意的是:在iOS8.0以后本地通知有了一些变化,如果要使用本地通知,需要得到用户的许可。 部分代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define IS_iOS8 ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    /*
     UIUserNotificationTypeNone    = 0,      不发出通知
     UIUserNotificationTypeBadge   = 1 << 0, 改变应用程序图标右上角的数字
     UIUserNotificationTypeSound   = 1 << 1, 播放音效
     UIUserNotificationTypeAlert   = 1 << 2, 是否运行显示横幅
     */

    [application setApplicationIconBadgeNumber:0];

    if (IS_iOS8) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
    }

    // 如果是正常启动应用程序,那么launchOptions参数是null,其他方式需要对launchOptions设置
    if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
        // 当被杀死状态收到本地通知时执行的跳转代码
        // [self jumpToSession];
        UILabel *redView = [[UILabel alloc] init];
        redView.backgroundColor = [UIColor redColor];
        redView.frame = CGRectMake(0, 100, 300, 400);
        redView.numberOfLines = 0;
        redView.text = [NSString stringWithFormat:@"%@", launchOptions];
        [self.window.rootViewController.view addSubview:redView];
    }

    return YES;
}

远程推送

远程推送指从远程服务器推送给客户端的通知(需要联网),远程推送服务一般采用苹果的APNS (Apple Push Notification Service)。

要实现远程推送,一般会涉及到三个阶段:

  1. APNS Pusher应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。
  2. APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
  3. iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。
基本配置

条件:新建一个对应你bundle的push 证书,打开Push Notifications 开关(XCode7不打开也可以正常使用,XCode8以后必须打开)。

代码实现: 注册接受APNs通知。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
        // 1.注册UserNotification,以获取推送通知的权限
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];
        [application registerUserNotificationSettings:settings];

        // 2.注册远程推送
        [application registerForRemoteNotifications];
    } else {
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    }
    return YES;
}

调用AppDelegate方法,获取到用户的deviceToken。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // <32e7cf5f 8af9a8d4 2a3aaa76 7f3e9f8e 1f7ea8ff 39f50a2a e383528d 7ee9a4ea>
    // <32e7cf5f 8af9a8d4 2a3aaa76 7f3e9f8e 1f7ea8ff 39f50a2a e383528d 7ee9a4ea>
    NSLog(@"%@", deviceToken.description);
}

推送通知,和本地通知一样有两种状况。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 当接受到远程退职时会执行该方法(当进入前台或者应用程序在前台)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"%@", userInfo);

    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(100, 100, 100, 100);
    [self.window.rootViewController.view addSubview:redView];
}

苹果建议使用方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 1.开启后台模式
 2.调用completionHandler,告诉系统你现在是否有新的数据更新
 3.userInfo添加一个字段:"content-available" : "1" : 只要添加了该字段,接受到通知都会在后台运行
 */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"%@", userInfo);
    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(100, 100, 100, 100);
    [self.window.rootViewController.view addSubview:redView];

    completionHandler(UIBackgroundFetchResultNewData);
}

UserNotitfication

iOS10 中统一了本地推送和远程推送的 API,在 UserNotifications.framework 来统一处理与推送相关任务,并增加了图片、音频、视频,自定义通知 UI 等新特性。

通知界面

多媒体

在此次版本中,iOS10 不仅新增消息的3dtouch等,还对图片、音频、视频等多媒体做了改进和优化。

类型

限制大小

图片

10M

音频

5M

视频

50M

多媒体推送代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if #available(iOS 10.0, *) {
      let content = UNMutableNotificationContent()
      content.title = "iOS10 推送测试"
      content.body = "附件"
      content.userInfo = ["icon":"1","mutable-content":1]
      content.categoryIdentifier = "InputSomething"

      let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)

      let requestIdentifier = "imageLocal"
      if let imageURL = Bundle.main.url(forResource: "avatar@2x", withExtension: "png"), let attachment = try? UNNotificationAttachment(identifier: "imageAttachment", url: imageURL, options: nil) {

        content.attachments = [attachment]
      }

      let request = UNNotificationRequest(identifier: requestIdentifier, content: content, trigger: trigger)

      UNUserNotificationCenter.current().add(request, withCompletionHandler: { (error) in
        if (error != nil) {
          print("error: \(error.debugDescription)")
        }
      })
    }

通常在做多媒体自定义推送的时候,一般会用到UNNotificationServiceExtension应用扩展,通过在 payload 中增加 mutable-content 字段来触发扩展。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "aps":{
        "alert":"IOS10 推送测试",
        "sound":"default",
        "badge":1,
        "mutable-content":1,
        "category":"InputSomething"
    },
    "image":"https://ws1.sinaimg.cn/mw690/934b5ef8gw1fapg2ssteej20oz0oz420.jpg"
}

当推送达到 app 时,会启动扩展并回调 didReceive 方法。在该方法里面可以对推送的 UNMutableNotificationContent 做出相应的修改。在 didReceive 回调方法中的 request 包含了推送的具体信息,可以通过其 userInfo 属性来解析出多媒体的 url。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let imageURL = Bundle.main.url(forResource: "lufei", withExtension: "jpg")

值得注意的是这里 Bundle 指的是扩展的沙盒,不是 app 的沙盒,所以资源的路径要正确。

而读取远程资源比读取本地资源一般要多一步保存操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private func downloadAndSave(url: URL, handler: @escaping (_ localURL: URL?) -> Void) {
    let task = URLSession.shared.dataTask(with: url, completionHandler: {
      data, res, error in

      var localURL: URL? = 下载完之后保存到本地并返回本地的 url

      handler(localURL)
    })

    task.resume()
  }

得到本地的 url 之后操作就一样了,都是通过 url 来生成一个 UNNotificationAttachment 对象。一切都操作完之后将这个 UNMutableNotificationContent 对象返还 contentHandler(bestAttemptContent)。

自定义界面

除了上述功能外,苹果还新增了自定义界面,这个绝对是大招。

其中上面的黄色区域可以理解成一个 ViewController 操作,下面绿色部分就是 Title 之类的显示内容。这部分是可以隐藏的。在扩展的目录下的 info.plist 编辑一些界面相关的东西。

说明:

  • UNNotificationExtensionCategory 触发 Extension 的 category 这里需要在注册才能有效的触发 字符串类型
  • UNNotificationExtensionInitialContentSizeRatio 上图黄色区域的长宽比,float 类型
  • UNNotificationExtensionDefaultContentHidden 默认内容是否隐藏,Bool 类型
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-03-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Fastqc安装中可能遇到的问题
一、安装JAVA环境 这一步个人并非按照xiaoming老师的步骤所做,而是直接输入sudo apt-get install default-jre完成,因为并不确定该方法是否会造成某些问题,大家姑且当做优先级较低的那一个吧
戈贝尔光和热
2018/12/27
5.1K0
生物信息学软件工具的大致分类
其中网页工具和云平台都不是针对专门的生物信息学工程师设计的,因为并不需要使用者会编程语言,所以使用起来非常简单。下面来一一介绍一下它们:
生信技能树
2023/11/21
6840
生物信息学软件工具的大致分类
RNA-seq 保姆教程:差异表达分析(一)
RNA-seq 目前是测量细胞反应的最突出的方法之一。RNA-seq 不仅能够分析样本之间基因表达的差异,还可以发现新的亚型并分析 SNP 变异。本教程[1]将涵盖处理和分析差异基因表达数据的基本工作流程,旨在提供设置环境和运行比对工具的通用方法。请注意,它并不适用于所有类型的分析,比对工具也不适用于所有分析。此外,本教程的重点是给出一般的分析流程。对于更大规模的研究,强烈建议使用集群来增加内存和计算能力。
数据科学工厂
2023/02/27
1.9K0
RNA-seq 保姆教程:差异表达分析(一)
chatGPT只能给你提示没办法代替你解决单细胞报错
EBI (European Bioinformatics Institute) 和 NCBI (National Center for Biotechnology Information) 都是全球领先的生物信息学研究机构,它们提供了大量的生物信息学数据库和工具,对全球的科研工作者开放。
生信技能树
2023/09/04
5410
chatGPT只能给你提示没办法代替你解决单细胞报错
RNAseq分析之FastQC
FastQC——高通量测序质量控制工具。用于检查原始数据以确认是否存在质量问题或偏差。它可以作为交互式应用程序用于少量文件的即时分析,也可以非交互式地运行,适合于作为大规模分析流程的一部分。FastQC与特定的测序技术无关,因此可以用于查看各种组学的测序数据(包括不限于 WGS、WES、RNAseq、ChIP-seq、BS-Seq等)
生信菜鸟团
2023/11/08
6981
RNAseq分析之FastQC
RNA-seq(3):sra到fastq格式转换并进行质量控制
把RNA-seq(2)-2下载的sra文件转换为fastq格式的测序文件,并且用fastqc软件测试测序文件的质量,理解各指标的意义。
Y大宽
2018/09/10
2.1K0
RNA-seq(3):sra到fastq格式转换并进行质量控制
学员的转录组实战笔记之胰腺癌差异
第一个数据集是胰腺癌的癌症和癌旁或者其它对照组织差异,就12个样品,处理起来比较方便,第二个数据集样品数量稍微有一点点多,后面有机会再处理它。文章描述的转录组测序数据的生物信息学处理方法非常陈旧了:
生信技能树
2023/09/04
3110
学员的转录组实战笔记之胰腺癌差异
转录组分析 | fastqc进行质控与结果解读
做转录组测序,通常公司是不给分析的,分析也要自己多花钱,当然不同公司收费不一样,有的可能带有简单的分析。之前测序的第一家公司给了简单的分析,后面换了一家测序公司,不给分析。所以我得自己分析啦,在分析的时候顺便写一下教程。分享给大家,要分析转录组数据,首先得知道测序原理【参考文章:illumina、Sanger、第三代和第四代测序技术原理】,还有就是了解生信分析中一些文件格式【参考文章:生信中常见的数据文件格式】,当然,还有其他一些生物背景知识,除此以外,还需要会Linux,这个是一个漫长的学习过程。本文就介绍转录组数据分析的第一步分析:质控,主要就是fastqc这个软件的使用和结果解读。
DoubleHelix
2020/09/23
14K1
转录组分析 | fastqc进行质控与结果解读
我的第一次ChIP-seq实践
1. 软件安装 整个过程基本是从零开始,也就是说服务器没有安装任何所需软件。因为我平时会用到Python,所以第一步安装的是Anaconda,版本是Anaconda3-4.4.0-Linux-x86_64.sh. Ananconda是一个用于科学计算的Python发行版,能够方便解决多版本Python并存(后面会看到)、切换以及各种第三方包安装问题(最大的好处)。 Anaconda和整个ChIP-seq分析没关系,提到它是因为安装Anaconda后可以用BIOCONDA,能够方便安装管理生物信息软件,无需自
生信技能树
2018/03/08
2.9K0
我的第一次ChIP-seq实践
很多事情不一定有答案(但是可以有交流渠道)
不过,最近几年我的教程都是conda和aspera高速下载啦,但即使是这样,仍然是很多人反馈下载失败,有一些是Linux命令不熟悉,自己把代码写错,有一些是数据库下载源的问题,部分数据缺失是数据库的责任,并不是你的错!还有一些是网络问题,甚至是玄学,比如前两天可以,今天就不可以,或者说前面奋战了两个星期都失败,但是今天却无缘无故下载成功了!
生信技能树
2021/01/18
1.1K0
很多事情不一定有答案(但是可以有交流渠道)
Ubuntu16.04:apt、dpkg使用
apt会解决和安装模块的依赖问题,并会咨询软件仓库, 但不会安装本地的deb文件, apt是建立在dpkg之上的软件管理工具。
新码农
2021/01/04
1.1K0
看优秀本科生如何一周内学会Linux进而搞定RNA-seq上游分析
我是武汉大学基础医学专业第一届的学生,2016年9月刚进大学的时候就选了导师进入实验室接受科研训练。虽然我们实验室不是专门做生物信息学的,但第一次和导师正式交流的时候,她就建议我要学点生信。(巧合的是2016年9月也是生信菜鸟团转型生信技能树的时间点,如果所有的导师都如此明智就好了)
生信技能树
2020/04/14
8.9K1
看优秀本科生如何一周内学会Linux进而搞定RNA-seq上游分析
FastQC | 对测序数据进行质控及质控报告解读
本期将演示如何使用FastQC对二代测序数据进行质控以及对质控报告进行全方位的解读。
生信real
2022/08/18
5.1K0
FastQC | 对测序数据进行质控及质控报告解读
Ubuntu翻译之man(8)apt-get
apt-get - APT package handling utility -- command-line interface
可学了些精致的淘气
2024/08/30
1280
Ubuntu 包管理的 20 个“apt-get”命令
使用 apt-get 命令,您可以在系统上安装、删除、升级、搜索和管理软件包。然而,从 Ubuntu 16.04 和 Debian 9 开始,apt 命令成为推荐的包管理命令行工具,尽管 apt-get 仍然可用且功能齐全。
数据科学工厂
2023/08/10
6960
Ubuntu 包管理的 20 个“apt-get”命令
Ubuntu翻译之man(8)apt
apt [-h] [-o=config_string] [-c=config_file] [-t=target_release] [-a=architecture] {list | search | show | update |
可学了些精致的淘气
2024/08/28
1610
ubuntu使用MAC主题
ubuntu使用MAC主题,步骤如下: 1. 下载mac壁纸(Download MacBuntu OS Wallpapers and extract to pictures directory) cd ~/Download wget http://drive.noobslab.com/data/Mac/MacBuntu-Wallpapers.zip unzip MacBuntu-Wallpapers.zip ---- 2:安装 MacBuntu OS Y Theme、Icons 和 cursors(I
若与
2018/04/25
2.2K0
ubuntu使用MAC主题
分享 | ATAC-Seq 分析流程
ATAC-Seq 是“Assay for Transposase-Accessible Chromatin with high-throughput Sequencing”的缩写。 ATAC-Seq 方法依赖于使用高活性转座酶 Tn5 的下一代测序(NGS)文库的构建。将 NGS 接头连接到转座酶上,该转座酶可以使染色质断裂并同时将这些接头整合到开放的染色质区域中。构建的文库可通过 NGS 测序,并使用生物信息学分析具有可及或可访问染色质的基因组区域。
用户7010445
2024/06/18
1.2K0
分享 | ATAC-Seq 分析流程
如何在 Linux 上使用 Apt 命令
apt是一个命令行工具,它用来安装,升级,移除和类似的管理操作 deb 软件包,它存在于 Ubuntu, Debian, 和相关 Linux 发行版中。它将经常使用的apt-get和apt-cache工具聚合在一起,并给一些选项设置默认值。
雪梦科技
2020/05/11
3K0
如何在 Linux 上使用 Apt 命令
一个优秀的ATAC-seq数据分析资源实战(一)
之前我们给大家介绍了两篇ATAC-Seq数据分析pipeline的优秀综述:综述:ATAC-Seq 数据分析工具大全 和 Omni-ATAC:更新和优化的ATAC-seq协议(NatProtoc),我们今天就来实战介绍!
生信技能树
2025/02/27
1910
一个优秀的ATAC-seq数据分析资源实战(一)
相关推荐
Fastqc安装中可能遇到的问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档