我有推送通知的工作和管理应用程序时,被带到前台更新图标徽章计数。
我有点困惑这个虽然...的iPhone收到通知,并出现启动我的应用程序弹出消息,徽章才刚刚开始应用后,我更新。
这不健全的权利在用户体验方面。 我的理解是,徽章计数应告知需要什么行动,通过增加的计用户,但是这能源部没有发生,直到后期阶段时,应用程序是活的。
那么,有没有办法告诉应用程序时收到推送通知,并同时在后台更新它的徽章计数?
请注意,我的应用程序不使用的位置和我有UIRemoteNotificationTypeBadge
在通知注册请求。
欢呼声
Answer 1:
由于推送通知是由iOS和不是你的应用程序处理,你不能改变在接收到推送通知应用徽章。
但是你可以在推送通知的有效载荷发送证件号码,但你将不得不做计算服务器端。
你应该阅读本地和推送通知编程指南 ,特别是通知有效载荷 。
有效载荷看起来是这样的:
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 9
}
}
现在,应用程序图标徽章将显示9。
Answer 2:
我们可以改变徽章数量,当我们在通过推送通知包发送“徽章”参数的背景状态。 作为@rckoenes指出JSON
参数徽章必须是INTEGER。
做同样的样本PHP代码
// Create the payload body
$body['aps'] = array(
'alert' => $message,
'badge' => 1,
'sound' => 'default'
);
badge => 1
,其中1是一个整数不是字符串(即,具有出apostrophies)
Answer 3:
**This is the APNS payload get back from server.**
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
},
"acme1" : "bar",
"acme2" : 42
}
关键徽章的值被自动视为徽章count.On iOS应用方面无需计算或处理计数。 在上面的例子中9徽章count.So您的应用程序图标将显示9。
注:当你的应用有你无法在你的own.Thats为什么我们使用徽章钥匙从APNS有效载荷有关的通知更好的澄清处理徽章看文档
如果你想降低您own.Decrement徽章计数的数量和更新yourself.as如下
Answer 4:
如果您正在使用NotificationServiceExtension的您可以更新该徽章。
var bestAttemptContent : UNMutableNotificationContent? //
bestAttemptContent.badge = 0//any no you wanna display
您的应用程序收到通知,您的每一次服务扩展将是called.Save用户默认该值并显示出来。 要共享的应用和推广之间的用户默认值,你需要启用应用程序组中的应用。 在这里阅读更多
Answer 5:
由于iOS的10你可以开发你的应用程序通知服务的扩展。 它将由系统当你收到通知,你可以计算出徽章的有效号码,并设置其启动。
看看文档: https://developer.apple.com/documentation/usernotifications/unnotificationserviceextension
Answer 6:
其实在iOS的10远程通知将调用全自动didReceiveRemoteNotification
方法在AppDelegate中。
你有在后台更新的徽章计数的2种方式。
我也这样做了我目前的应用程序。 你并不需要通知服务Exetension eithier。
1路
发送APS徽章键与有效载荷APN。
这将根据您的徽章的有效载荷你的整数值更新徽章计数。 例如:
// Payload for remote Notification to APN
{
"aps": {
"content-available": 1,
"alert": "Hallo, this is a Test.",
"badge": 2, // This is your Int which will appear as badge number,
"sound": default
}
}
第二路
您可以将您application.applicationState和更新您的徽章计数时applicationState是在.background
。 但你必须发送给APN前时要小心不要设置您的通知有效载荷的徽章关键参数
// Payload to APN as silent push notification
{
"aps": {
"content-available": 1
}
}
相应地处理徽章更新的应用程序状态
这里是没有在有效载荷APN徽章键徽章计数更新我的工作代码。
func application(_ application: UIApplication, didReceiveRemoteNotification
userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print("APN recieved")
// print(userInfo)
let state = application.applicationState
switch state {
case .inactive:
print("Inactive")
case .background:
print("Background")
// update badge count here
application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1
case .active:
print("Active")
}
}
复位徽章计数
不要忘记,当您的应用程序回来到激活状态重置您的徽章计数。
func applicationDidBecomeActive(_ application: UIApplication) {
// reset badge count
application.applicationIconBadgeNumber = 0
}
Answer 7:
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
application.applicationIconBadgeNumber = 0;
NSLog(@"userInfo %@",userInfo);
for (id key in userInfo) {
NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]);
}
[application setApplicationIconBadgeNumber:[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]];
NSLog(@"Badge %d",[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]);
}
Answer 8:
正如@rckoenes说,你将不得不做计算服务器端,但你怎么能知道什么时候增加你应该在有效载荷发送徽章数值?
会当你启动应用程序发送消息到您的服务器,表明应用程序已经启动。 因此,在服务器端,您从徽章= 0重新开始,虽然没有通过服务器收到的消息增加与每一个推送通知有效载荷的证件号码。
Answer 9:
在有效载荷APNS必须定义“内容可用”:1用于在背景模式下更新徽章计数
func application(_ application: UIApplication, didReceiveRemoteNotification
userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// increase badge count, but no need if you include content-available
application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1
}
func applicationDidBecomeActive(_ application: UIApplication) {
// reset badge count
application.applicationIconBadgeNumber = 0
}
对于如。
"aps":{
"alert":"Test",
"sound":"default",
"content-available":1
}
Answer 10:
接收当您打开应用程序的远程通知后,
获得“当前徽章数量didBecomeActive
您的”方法AppDelegate
。
文件中使用下面的代码:
int badgeCount = [UIApplication sharedApplication].applicationIconBadgeNumber;
badgeCount = badgeCount + 1;
文章来源: Update badge with push notification while app in background