问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ios远程推送消息时运行在前台怎么处理

发布网友 发布时间:2022-05-06 18:37

我来回答

1个回答

热心网友 时间:2022-07-01 18:55

当你的iPhone收到推送信息后到底会发生什么呢?总共有三种可能性:

app在前台运行. 接收到推送信息时屏幕上不会有任何显示,也不会有提示音,但你的app delegate会收到这个推送信息。你可以在这里加入代码来处理接收到的信息。
app不在前台运行。iPhone可能停留在主界面或者另一个app正在运行.一个提示窗口会弹出,可能伴随着提示音。用户可以点击Close按钮来关闭这个窗口或者点击View按钮来打开你的app。如果用户点击的时Close按钮,那你的app不会处理这个推送的信息。
iPhone在锁屏状态下. 同样一个提示窗口弹出,并伴随着提示音,但是这个窗口不会有Close和View按钮。屏幕解锁后会自动进入你的app。
因为app delegate是接收推送信息的地方,我们对app的最后改动都是在AppDelegate.m文件中。我们需要修改两处:

application:didFinishLaunchingWithOptions:函数. 如果推送信息到达时你的app不在前台运行,而用户在弹出窗口点击了“View”按钮,你的app会重新运行然后这个信息会作为参数注入到application:didFinishLaunchingWithOptions:函数中。
application:didReceiveRemoteNotification:函数. 如果信息到达时你的app正在前台运行,那这个函数就会被调用。在iOS4.0或更新的版本,如果你的app从暂停状态进入前台,这个函数也会被调用。你可以用UIApplication的applicationState属性来检查你的app是否是从暂停状态苏醒。
上述的两个函数都会有一个字典参数其中包含了JSON格式的推送信息内容。OS已经帮我们把JSON格式的信息转换成Objective-C字典了。将下面的代码加到didFinishLaunchingWithOptions:函数的return语句前:   if (launchOptions != nil)
{
NSDictionary* dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (dictionary != nil)
{
NSLog(@"Launched from push notification: %@", dictionary);
[self addMessageFromRemoteNotification:dictionary updateUI:NO];
}
}

我们先确保launchOptions参数不是nil以及launchOptions中包含了推送信息。然后调用addMessageFromRemoteNotification函数来处理这个信息。
把下面的函数加到AppDelegate.m文件中:  - (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
  {
  NSLog(@"Received notification: %@", userInfo);
[self addMessageFromRemoteNotification:userInfo updateUI:YES];
  }

这个函数同样依靠addMessageFromRemoteNotification来完成处理信息的工作。
将下面这个函数复制粘贴到didFinishLaunchingWithOptions:函数上面:- (void)addMessageFromRemoteNotification:(NSDictionary*)userInfo updateUI:(BOOL)updateUI
{
Message* message = [[Message alloc] init];
message.date = [NSDate date];

NSString* alertValue = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];

NSMutableArray* parts = [NSMutableArray arrayWithArray:[alertValue componentsSeparatedByString:@": "]];
message.senderName = [parts objectAtIndex:0];
[parts removeObjectAtIndex:0];
message.text = [parts componentsJoinedByString:@": "];

int index = [dataModel addMessage:message];

if (updateUI)
[self.chatViewController didSaveMessage:message atIndex:index];

[message release];
}

我保证这是最后一点代码了。然我们解释一下这段代码。Message* message = [[Message alloc] init];
message.date = [NSDate date];

首先我们创建一个Message对象。我们会把推送信息的内容提取出来,填入到这个对象中然后将这个对象加入到DataModel中。NSString* alertValue = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];

上面的代码从推送信息中获取了信息的内容。推送信息的JSON的格式看起来是这样的:{
"aps":
{
"alert": "SENDER_NAME: MESSAGE_TEXT",
"sound": "default"
},
}

服务器把信息内容以及信息作者的昵称放到了“alert”栏中。我们对这个字典中的其他内容并不感兴趣。NSMutableArray* parts = [NSMutableArray arrayWithArray:[alertValue componentsSeparatedByString:@": "]];
message.senderName = [parts objectAtIndex:0];
[parts removeObjectAtIndex:0];
message.text = [parts componentsJoinedByString:@": "];

上面的代码将发送者的昵称和信息内容分解出来放入到Message对象中。发送者昵称是分号和空格之前的字符串。int index = [dataModel addMessage:message];

现在我们可以把这个Message对象加入到DataModel中了。if (updateUI)
[self.chatViewController didSaveMessage:message atIndex:index];

最后,我们让ChatViewController加入这个新的信息。但是,如果推送信息是在didFinishLaunchingWithOptions函数中收到的,那我们就不能刷新这个视图,因为那时ChatViewController的表格还没有加载。视图加入这个信息会导致系统崩溃的。
就这些了。编译并运行现有的程序。用test_message.html中的表格来发送一些信息。你应该在app的聊天视图中看到这些信息气泡出现。自定义提示信息
你应该还记得我们之前在介绍推送信息时曾说过你可以自定义提示设置。比如你可以在有信息时播放一个自定义的提示音。我在app的resources文件夹中放了一个音频文件叫做beep.caf。
打开api.php文件并在makePayload()函数中将下面这行代码:$payload = '{"aps":{"alert":"' . $nameJson . ': ' . $textJson . '","sound":"default"}}';

改为:$payload = '{"aps":{"alert":"' . $nameJson . ': ' . $textJson . '","sound":"beep.caf"}}';

你不需要改变app本身的任何代码,甚至不用重新编译。但你还是应该在设备上关闭打开了的app。因为如果我们的app正在前台运行,那提示音是不会响的。现在用test_message.html给app发一个信息。当提示窗口出现时,提示音是不是不同了?
你也可以实验修改其他的选项。比如提供自定义按钮,或者给app设定数量小图标。(如果你想实验数量小图标,别忘了让app注册接收数量图标。现在我们的app只会有提示音和提示窗口。)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
可以提前退出“三支一扶”计划吗 能提前退出“三支一扶”计划吗 绒沙金礼品制作工艺 什么叫绒沙金 榖皮巾的意思是什么 IPOD新版本安装会不会影响内存 我的是ipod 4 8G的,我下载了东西以后发现内存是占了,但是显示不出来东西... 为什么我的IPOD下载程序只用了4G却显示用了6.4G 间谍过家家阿尼亚表情包汇总(间谍过家家阿尼亚次子) 关于"化物语"中的女主 战场原黑仪(戦场ヶ原ひたぎ)的1440*900宽屏壁纸... “你”猜灯谜打一成语 猜灯谜:遇事不求人打一成语是什么成语 ios个推怎么配置 ios开发使用jpush极光推送有时候刚运行会导致应用白屏是什么原因 极光ios 推送不能直接推送链接吗 电锤钻头刀头采用什么材质 ios push notifications 要打开吗 榆林至定边高速路况查询? iOS JPush为什么收到推送没有声音 物联网WIFI连接有了机顶盒能看很多免费电影吗? 联通电视盒子怎么看网络电影? ios push成功 推送失败 怎样查看失败原因 昆广数字机顶盒如何播放电影 中信银行信用卡商城上分期付款的天梭手表是正品吗?怎么客服电话是4008278999? 职工保险要交哪几种? 仁怀天梭手表维修售后在哪里? 我到邮政存款,工作人员给我推荐华夏保险公司的保险,这是骗人的吗 我到邮政存款,工作人员给我推荐华夏保险公司的保险,这是骗人的吗? 在邮局办了个终身寿险,每年五万连缴五年第八年能取出,这种保险可靠吗? iphone5要出来了么 APNs Production iOS 和 Apple Push Services的区别 猜灯谜,浮云终日行。打一个成语 联优6324中性笔批发商 助学贷款怎么申请,与还款方式 助学贷款还款方式的注意事项 三菱中性笔um151和um138哪个好 增值税降低有何影响? 疯狂猜灯谜 七绝打一成语 早上刚起床就有喘不上气的感觉是为什么? 元宵节猜灯谜:无底洞<打一成语> 猜灯谜,空心元宵打一成语 制造业增值税减税对公司有何影响 早上五点醒了,喘不上气憋气,胸闷胸疼,以前不这样,这两天才开始,是不是得肺癌了? 猜灯谜:春节过后捷很多(打一成语) 提问:制造业增值税减税对公司有何影响 早上起来后胸闷气短喘不上气全身无力没有 早上起来头晕,喘不上气来,胸闷,感觉要死了似得怎么回事啊? 早上起床深呼吸的时候感觉呼吸道难受喘不上气 我早上起床非常累,很乏力,头晕晕的,好像喘不上气。 增值税税率下调,对钢企有多大影响