ios能不能静默unity 发邮件 iosdemo

一、消息推送原理:
在实现消息推送之前先提及几个于推送相关概念,如下图1-1:
1、Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服务端[消息的发起者]);
2、APNS:Apple
Push Notification Service[苹果消息推送服务器];
3、iPhone:用来接收APNS下发下来的消息;
App:IOS设备上的应用程序,用来接收iphone传递APNS下发的消息到制定的一个客户端&app[消息的最终响应者];
上图可以分为三个阶段:
阶段一:Provider[服务端]把要发送的消息,目的IOS设备标识打包,发送给APNS;
阶段二:APNS在自身的已注册Push服务的IOS设备列表中,查找有相应标识的IOS设备,并将消息发送到IOS设备;
阶段三:IOS设备把发送的消息传递给对应的应用程序,并且按照设定弹出Push通知。
具体过程,如下图1-2:
1、[Client App]注册消息推送;
2、[Client App]跟[APNS
Service]要deviceToken, Client App接收deviceToken;
3、[Client App]将deviceToken发送给[Provider]Push服务端程序;
4、当Push服务端程序满足发送消息条件了,[Provider]向[APNS
Service]发送消息;
5、[APNS Service]将消息发送给[Client
二、消息推送实现:
1、生成*.certSigningRequest文件,步骤如下:
[MacBook-应用程序-实用工具-钥匙串访问-证书助手-从证书机构求证书-证书信息(用户电子邮箱地址{填写您的邮箱,如:},常用名称{任意,如:PushDemo},请求是:{单选,选择‘存储到磁盘’})-继续-保存],这时会在您指定的地方生成你指定的文件,默认为CertificateSigningRequest.certSigningRequest文件,这里命名为:PushDemo.certSigningRequest.在此*.certSigningRequest已经生成,具体操作步骤如图所示。
如果生成成功,则会在[钥匙串访问|登录|密钥]栏目中列出与*.certSigningRequest关联的密钥,这里是PushDemo,如图所示:
2、新建一个App ID(在苹果开发者账号中配置)
(1)&登录,登录成功后,点击(iOS Provisioning Portal对应链接),如图所示:
(2)&创建New App ID[App IDsàManageàNew
App ID]( Description{填写您对此App ID&的描述,如:iShop},Bundle Seed ID(App ID Prefix){选择绑定App
ID前缀,如:默认选择Generate New},Bundle Identifier(App ID Suffix){填写绑定App
ID后缀,如:com.yourcorp.iShop}),如下图所示:
这样就会生成下面这条记录,如图所示:
(3)&配置上一步中生成的App ID,让其支持消息推送[点击2-6中的Configureà选中Enable
for Apple Push Notification serviceà点击Configure],如图所示:
&(4) Generate a Certificate Signing Request(生成部署请求认证)[点击2-7中的2ConfigureàContinueà步骤1生成的*certSigningRequest文件(这里是iShop.&certSigningRequest)-Generate-生成完成后将其下载下来,命名为:aps_developer.cer],双击aps_developer.cer证书{将证书与密钥关联,并将证书导入到MacBook中},如下图所示:
(5)&创建Development Provisioning Profiles[开发许可配置文件](Provisioning|
Development|New Profile),具体操作流程如下图所示:
点击图中Submit,生成Development Provisioning Profiles[开发许可配置文件],这里是:iShopDevprofile.mobileprovision如下图所示:
下载此开发许可证书(用于联机调试)。
总结,到现在为止,我们已经生成:A:*.certSigningRequest文件(在步骤(4)中使用,用于生成证书B)、B:aps_developer_identity.cer证书(在Provider[Push服务器]服务端应用使用)、C:*..mobileprovision开发许可配置文件(在Client
App客户端应用联机调试使用)。
3、新建一个项目
1. 创建一个&single view application& project,为省事,你设置的&Company Identifier& + &Production“必须和step 5创建的App ID的&bundle identifier&一致。
2. 在AppDelegate.m&file的&didFinishLaunchingWithOptions& method里,添加下列代码 (用于为app
register push notification feature):
//&Let&the&device&know&we&want&to&receive&push&notifications&&
[[UIApplication&sharedApplication]&registerForRemoteNotificationTypes:&&
&(UIRemoteNotificationTypeBadge&|&UIRemoteNotificationTypeSound&|&UIRemoteNotificationTypeAlert)];&&
3.&在AppDelegate.m&file里添加下列2个methods (用来handle register remote notification with device token和register
error的events)
-&(void)application:(UIApplication*)application&didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken&&
&&&&NSLog(@&My&token&is:&%@&,&deviceToken);&&
-&(void)application:(UIApplication*)application&didFailToRegisterForRemoteNotificationsWithError:(NSError*)error&&
&&&&NSLog(@&Failed&to&get&token,&error:&%@&,&error);&&
4. 运行该app in real device (simulator doesn't support push notification)。这时你会在device上看到一个popup window (该窗口只会出现一次,重装app不会再出现),提示你该app会send push
notification给你,如果同意则clickOK,不同意则click &Now allow”。如果选择了OK,那么在&Setting & Notifications“里会有你的app在list里。而且这时你的Xcode output console会显示你的device
5: export &PushDemo& private
key to a &.p12& file(该文件会在后面生成apns provider的.p12 or .pem file时用到)
1). right click &PushDemo“ private key and select &Export ...&PushDemo
2). Save the private key as “PushDemoKey.p12” file, click Save button
3). 这时会让你输入2次用于加密该.p12 file的密码,例如用&123321&,接着会要求你输入一次your mac account password
6: 在5中生成的“PushDemoKey.p12”
file和step 6生成的&aps_development.cer& file是用于APNS provider side的源文件,APNS Provider side进行push message时要用到的&cert + key& file就是通过这2个file来生成。该Step就是用来生成for
APNS provider side (php version)要用到这个&cert + key& pem file.
1)&open Terminal, go to Desktop (假设这2个file都在desktop里)
2)&执行下列命令来生成和apns cer file对应的pem file &PushDemoCert.pem&
openssl&x509&-in&aps_development.cer&-inform&der&-out&PushDemoCert.pem&&
3)&执行下列命令来生成和private key .p12 file对应的pem file &PushDemoKey.pem& (注意:执行过程会要求你输入&PushDemoKey.p12&创建时设置的密码,以及设置&PushDemoKey.pem”的密码)
openssl&pkcs12&-nocerts&-out&PushDemoKey.pem&-in&PushDemoKey.p12&&
4)&执行下列命令把step 11.2生成的cert pem file和step 11.3生成的key pem file合成为一个pem file&&&PushDemoCK.pem&
cat&PushDemoCert.pem&PushDemoKey.pem&&&PushDemoCK.pem &
7:&在5生成的“PushDemoKey.p12”
file和step 6生成的&aps_development.cer& file是用于APNS provider side的源文件,该step是简单测试这2个file是否有效
1)&open Terminal, go to Desktop (假设这2个file都在desktop里)
2) 执行下列命令来测试是否能够connect apple提供的不经加密(即不需使用任何证书!)的APNS
telnet&gateway.sandbox.&2195&&
如果你看到下列输出,则表示你的电脑可以connect APNS. 如果出现error,那么check你的firewall是否允许outgoing connections on port 2195。
Trying&17.172.233.65...&&
Connected&to&gateway.sandbox..akadns.net.&&
Escape&character&is&'^]'.&&
Press Ctrl+C to close the connection.
3)&&执行下列命令来测试是否能够connect apple提供的经加密(需使用2) and 3)生成的2个pem
file!)的APNS &sandbox“ server for development.
openssl&s_client&-connect&gateway.sandbox.:2195&-cert&PushDemoCert.pem&-key&PushDemoKey.pem&&
执行过程中会要你输入PushDemoKey.pem生成时设置的密码。如果connect server成功,就会等待你输入字串,你可以输入任意字串,然后回车,就会disconnect&server。如果连接不成功,则openssl会显示错误信息。
注意:实际上有2个APNS servers: the “sandbox” server (用于testing) the live server(用于production mode)。我们这里测试的是sandbox server。live apns server的操作类似。
8:&创建provider server side (php version)
1). Download&&code&to your mac machine and then unzip it.
2). 去掉SimplePush&folder里的pk.pem (它没用),把step 11.4生成的&PushDemoCK.pem& copy toSimplePush&folder
3). 修改simplepush.php&file下面几行:
// Put your device token here (without spaces):
//device token来自Step 10的第4点,在output console获取,注意:要去掉前后的尖括号,和中间的所有空格
$deviceToken&=
'43fcc3cff12bf0c575d0aeb0bf395fb7ff86b465';
// Put your private key's passphrase here:
//该值是 3)生成PushDemoKey.pem时设置的密码
$passphrase&= '123456';
// Put your alert message here:
$message&= 'My first push notification!';
//.....stream_context_set_option($ctx, 'ssl',
'local_cert', 'PushDemoCK.pem');
4). 在terminal window里,go to the simplepush folder,然后执行下列命令,你的iPhone应该会收到一条push message。
php&simplepush.php &
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:9601次
排名:千里之外
原创:36篇
(1)(15)(20)总所周知,苹果在iOS7.0后在后台任务上增加了如下新特性:
后台获取(Background Fetch)
推送唤醒(静默推送,Silent Remote Notifications)
后台传输(?Background Transfer Service)
由于最近项目需求上的变更,需要应用在退至后台时在某一个时间点唤醒设备更新一下UI,在用户下次点击应用图标进入应用的时候就能看到已经更新好的UI了。所以,研究了一下静默推送,下面我给小伙伴们一一呈现我所实现的整个过程。
首先,在官方文档中找到下面一段关于静默推送的描述:
Configuring a Silent Notification
The aps dictionary can also contain the content-available property. The content-available property with a value of 1 lets the remote notification act as a silent notification. When a silent notification arrives, iOS wakes up your app in the background so that
you can get new data from your server or do background information processing. Users aren’t told about the new or changed information that results from a silent notification, but they can find out about it the next time they open your app.
For a silent notification, take care to ensure there is no alert, sound, or badge payload in the aps dictionary. If you don’t follow this guidance, the incorrectly-configured notification might be throttled and not delivered to the app in the background, and
instead of being silent is displayed to the user.
说的很明白,要想实现静默推送,首先要在aps这个字典里增加content-available这个属性,并且这个属性的值要设置成1。之前在网上也查了一些资料,都千篇一律的贴着下面这张图:
大部分关于设置静默推送后台推送格式的贴图
可是,参照这张图的意思是,alert里面也是可以有内容的,可是事实上官方文档里的第二段话被好多人忽略了:take care to ensure there is no alert, sound, or badge payload in the aps dictionary。好吧,看来alert里面必须为空才行。本人亲测,alert里面有内容的话就是普通推送,是不能在当应用在后台挂起时唤醒应用的。OK,alert字段确认了,是必须为空的,那么sound呢?由于项目的推送SDK用的是个推,本人跟个推的技术支持交流了一下让服务端在设置sound的时候设成空串:
服务端推送格式
结果,静默推送虽然收到了,但是它是有声音的静默推送,后来个推的技术支持更正了传入的字段:
服务端推送格式
好了,静默推送收到了,整个世界也都清净了。
OK,到这儿,我们可以基本确认静默推送在后台的格式:(a) 增加content-available字段,并设成1 (b) alert字段必须为空,否则收到的就不是静默推送 (c)sound字段设不设不影响静默推送的接收,只不过会出现符不符合需求的问题。对了,还有一个badge属性,设置的话也不影响静默推送的接收,但是和sound一样,看需求是怎样的了。
最后,服务端关于静默推送就设置成了这样:
服务端静默推送代码
而前端收到静默推送时的log是这样的:
静默推送log
最后,总结一下,静默推送只能在应用在前台和应用在后台挂起时收到,也就是说,如果应用未启动或进程被杀掉,静默推送是唤醒不了设备的。应用在后台挂起时,收到静默通知时在appdelegate里实现-application:didReceiveRemoteNotification:fetchCompletionHandle:这个方法,在这个方法里执行想要在系统被唤醒时想做的比如更新UI,请求网络等想做的事。当应用在前台时,网上查资料说还是在这个方法里执行,可是我打断点却不走这个方法,不知道是不是我们的SDK用的是个推的原因,反而会走个推的接收payload的那个方法。
最后,提醒一下小伙伴们,实现静默推送别忘了Xcode这边还要勾选remote notifications选项:
Xcode里capabilities设置
在简书的处女作就是这篇了,感谢小伙伴们捧场,荆轲刺秦王!
转载自&/p/abe
本文已收录于以下专栏:
相关文章推荐
iOS 7 中, app 有四种后台运行模式 ,对应苹果的后台接口实现.
1. 无后台仅推送, 出现在 iOS 3.x 以下大部分系统版本, 表现为 按下 home 键就关闭退出,数据有 app...
网上看了几篇教程都是比较老的版本了,根据前人的智慧,然后自己摸索了下,简单几步实现了在手机上推送自定义的消息。
首先,在个注册个账号,开发阶段使用个人注册即可,个推注册地址
注册完进入配置页面,对应用...
程序员升职加薪指南!还缺一个“证”!
CSDN出品策划程序员9月规划,专为码农的升职加薪保驾护航,程序员的捷径,你get到了吗?听说阅读了这篇文章的人,都已实现了小梦想~快来揭秘!
要想实现静默推送,首先要在aps这个字典里增加content-available这个属性,并且这个属性的值要设置成1。
HBuilder+个推服务器(JAVA)实现推送(二)
导读:之前写过一篇文章是由个推网站推送给客户端消息,但是在实际的应用中是需要我们从自己的服务端来发送推送消息给客户端,所以我在服务端写了一个j...
HBuilder - Release Notes
【重要】Mac版HBuilder支持iOS10真机运行,解决32位Windows系...
一、准备工作
1、一台mac
2、一部iphone
3、苹果开发者认证的账号
1、用mac申请一个CertificateSigningRequest.certSigningRequ...
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)&>&&>&移动开发&>&iOS&>&IOS 调用系统发邮件功能demo非常好用
IOS 调用系统发邮件功能demo非常好用
上传大小:760KB
完美解析系统发邮件功能,发送事件+发送成功结果事件委托
综合评分:3.8(20位用户评分)
所需积分:
下载个数:170
审核通过送C币
iOS电子图书大全
创建者:qq_
[资源优选]第十八期:20个热门的SWIFT源码
创建者:nigelyq
【资源优选】第九期:最热门的20个iOS精品源代码
创建者:nigelyq
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var q = $("#form1").serializeArray();
console.log(q);
var res_area_r = $.trim($(".res_area_r").val());
if (res_area_r == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
var mess = $(".res_area_r").val();
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, _username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click",'.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
$(".res_area_r").val($.trim($(".res_area").val()));
评论共有16条
不错哦,谢啦
很好的参考,谢谢。
提示没有权限,不能运行
我是用不了,老提示The file “MailDemo.app” couldn’t be opened because you don’t have permission to view it.
You don’t have permission.
挺好用的demo。可以作为参考谢谢分享
能用,但是发到邮箱就不行,是不是系统api换了?
很好! 可以用!
好像用不了,报'pilers.llvmgcc42' selected for architecture 'armv7'错误
实例完整可用,不错。谢谢
不错,demo可以做参考。
上传者其他资源上传者专辑
ios7 spritekit 游戏demo
DTGridView
高仿百度搜索引擎搜索下拉提示框
可伸缩的UITableView,类似qq好友列表
移动开发热门标签
VIP会员动态
前端开发重难点
17年软考最新真题及解析
物联网全栈开发专题
二十大技术领域优质资源
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
CSDN&vip年卡&4000万程序员的必选
IOS 调用系统发邮件功能demo非常好用
会员到期时间:剩余下载个数:
请勿使用迅雷下载
积分不足!
资源所需积分
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分
当前拥有积分
VIP年卡全年1200个资源免积分下载
请勿使用迅雷下载
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:Pages: 1/2
主题 : 如何直接发邮件
级别: 侠客
可可豆: 825 CB
威望: 827 点
在线时间: 301(时)
发自: Web Page
如何直接发邮件&&&
现在做了一个程序需要发邮件,
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate =
[picker setSubject:@"The procedure and reading data sent by Transmedics App"];
NSArray *toRecipients = [NSArray arrayWithObject:@"[email]jiaojiao.[/email]"];
[picker setToRecipients:toRecipients];
NSString *emailBody = (@"Data is attached as a .CSV file");
[picker setMessageBody:emailBody isHTML:NO];
NSString *SavedDataPath = [TransMedicsResource dataFilePath];
NSString *path = SavedDataP
NSData *myData = [NSData dataWithContentsOfFile:path];
[picker addAttachmentData:myData mimeType:@"text/csv" fileName:@"ProcedureAndReadingsData.csv"];
[self presentModalViewController:picker animated:YES];
[picker release];使用上述代码即可,但是这样会弹出窗口,我想直接发,不弹出窗口,怎么办
级别: 精灵王
可可豆: 3869 CB
威望: 4654 点
在线时间: 2240(时)
发自: Web Page
- (void) sendUIEmail:(NSString *)to cc:(NSString*)cc subject:(NSString*)subject body:(NSString*)body {
if ([MFMailComposeViewController canSendMail]) {
MFMailComposeViewController *mailController = [[MFMailComposeViewController alloc] init];
mailController.mailComposeDelegate =
NSArray *toArray = [[NSArray alloc] initWithObjects:to,nil];
[mailController setToRecipients:toArray];
[toArray release];
NSArray *ccArray = [[NSArray alloc] initWithObjects:cc ,nil];
[mailController setCcRecipients:ccArray];
[ccArray release];
NSString *subject = @"some subject";
[mailController setSubject:subject];
NSString *body = @"An important email.";
[mailController setMessageBody:body isHTML:YES];
NSString *filePath = [[NSBundle mainBundle]
pathForResource:@"apple"
ofType:@"png"];
NSData *fileData = [NSData dataWithContentsOfFile:filePath];
[mailController addAttachmentData:fileData
mimeType:@"image/png"
fileName:@"apple"];
[self presentModalViewController:mailController animated:YES];
[mailController release];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Can't send email!"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
- (void)mailComposeController:(MFMailComposeViewController*)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError*)error {
switch (result)
case MFMailComposeResultCancelled:
case MFMailComposeResultSaved:
NSLog(@"mail was saved");
case MFMailComposeResultSent:
NSLog(@"mail was sent");
case MFMailComposeResultFailed:
NSLog(@"Error: %@",error);
[self dismissModalViewControllerAnimated:YES];
CocoaChina微群 :
级别: 侠客
可可豆: 825 CB
威望: 827 点
在线时间: 301(时)
发自: Web Page
先谢谢楼上这位大哥了,可是这样不是依然会 [self presentModalViewController:mailController animated:YES];弹出发邮件的窗口吗
级别: 新手上路
可可豆: 14 CB
威望: 14 点
在线时间: 52(时)
发自: Web Page
楼主你解决了吗?能告诉怎么解决的么
级别: 新手上路
可可豆: 5 CB
威望: 5 点
在线时间: 18(时)
发自: Web Page
知之为知之,不知为不知。倘若都不知,宅在家背诗!
级别: 新手上路
UID: 145812
可可豆: 127 CB
威望: 127 点
在线时间: 29(时)
发自: Web Page
这个不错,留名顶一下!·
级别: 精灵王
UID: 40471
可可豆: 3639 CB
威望: 3620 点
在线时间: 836(时)
发自: Web Page
系统提供的现成的api貌似不能解决你的需求,但是可以曲线救国:把邮件的所有数据发送到自己的server,后续让server给你做吧。
级别: 圣骑士
UID: 144596
可可豆: 654 CB
威望: 659 点
在线时间: 406(时)
发自: Web Page
第三方库啊,有个后台发邮件的skpsmtpmessage
级别: 新手上路
可可豆: 58 CB
威望: 58 点
在线时间: 230(时)
发自: Web Page
可以不用系统的界面,直接后台发邮件。我给你个demo,下载后一看便知。
描述:后台直接发邮件
(112 K) 下载次数:144
级别: 新手上路
可可豆: 35 CB
威望: 35 点
在线时间: 9(时)
发自: Web Page
Pages: 1/2
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版iOS开发——iOS静默推送介绍及使用场景 - 简书
iOS开发——iOS静默推送介绍及使用场景
先来看下普通推送和静默推送的区别:
普通推送:收到推送后(有文字有声音),点开通知,进入APP后,才执行-- (void)application:(UIApplication didReceiveRemoteNotification:(NSDictionary fetchCompletionHandler:(void result))handler )application )userInfo (^)(UIBackgroundFetchResult
静默推送:收到推送(没有文字没有声音),不用点开通知,不用打开APP,就能执行(void)application:(UIApplication )application)userInfo didReceiveRemoteNotification:(NSDictionary fetchCompletionHandler:(void (^)(UIBackgroundFetchResultresult))handler,用户完全感觉不到
所以静默推送又被我们称做 Background Remote Notification(后台远程推送)。静默推送是在iOS7之后推出的一种推送方式。它与其他推送的区别在于允许应用收到通知后在后台(background)状态下运行一段代码,可用于从服务器获取内容更新。功能使用场景:(多媒体)聊天,Email更新,基于通知的订阅内容同步等功能,提升了终端用户的体验。
所以我们对于静默推送的定义就是:后台远程推送,允许应用在收到通知后在后台运行一段代码,且能够马上执行-- (void)application:(UIApplication didReceiveRemoteNotification:(NSDictionary fetchCompletionHandler:(void result))handler )application )userInfo (^)(UIBackgroundFetchResult代理方法的一种推送方式
通过下面两张图片你就可以很清楚地看出静默推送和其他远程推送的区别:
Paste_Image.png
静默推送的使用:
静默推送不仅在定义上和其他的推送方式不同,在推送内容上也和其他推送不同。在后台给应用的推送内容中只要满足下面的条件,该推送就是静默推送:如果只携带content-available: 1 不携带任何badge,sound 和消息内容等参数,则可以不打扰用户的情况下进行内容更新等操作即为“Silent Remote Notifications”。下面我们通过Easy APNs Provider模拟推送软件看下静默推送的内容格式:
Paste_Image.png
静默推送的使用场景
假设我们现在有下面的需求:用户打开你的app,然后把你的app压到后台。这个时候如果你的app是有IM功能的,且即时通讯是用XMPP协议,或者MQTT协议,那你的即时通讯此时是会断开长连接的(应用处于后台会断开长连接),其他用户发消息给你,而你的的IM此时断开长连接,那么你就不会收到别人发给你的消息的推送。上面场景的解决办法有两个,
一:别人发消息给你其实是发到后台,后台再发送给你。那么你如果想你的应用在后台时其他用户发消息给你仍然可以出现推送,那你可以让后台在给用户发消息的时候,顺便将聊天内容发个推送给用户的app。这样,用户应用在后台时别人发消息给他他就会收到消息推送。但是这么做有个问题:会增加后台的工作量,且浪费用户的流量。可以想象下,如果你的应用有1000万活跃用户,当1000万用户同时进行聊天的时候,后台不仅需要发送消息,还要发送消息的推送,这就相当于后台需要承担多一倍的任务量。当大量进行数据收发的时候,就会容易出现问题。
二:我们可以利用静默推送:当后台需要发送第一条消息给应用处于后台状态用户的时候,可以先给用户发送一个静默推送,将用户的app唤醒,这个时候应用有20秒的时候可以用来处理消息。让应用在收到消息后,再去发送一个本地的推送,提醒用户有其他用户给他发了消息。这样就能减少后台的任务量。
所以如果你的推送使用的是原生的APNS消息推送,IM功能使用的是XMPP,MQTT协议,处理后台IM消息推送的时候就可以通过静默推送来完成消息的推送。极光推送本身也是这样进行处理的。
带着产品思维的程序员}

我要回帖

更多关于 ios开发 发邮件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信