有没有办法更新徽章中的号码而不显示提醒或打开应用程序?
我正在编写一个应该始终在图标徽章中显示当前未读邮件数的应用程序,但我希望这样做而不向用户显示任何警报。
我正在为iOS 5.0 +开发。
编辑:为了更清楚,我问的是在应用未运行时的方法 。我希望服务器在没有显示警报的情况下推送新的徽章编号。这可能吗?
答案 0 :(得分:25)
你可以做到。 可以在没有警报的情况下发送推送通知。 您甚至可以将您的应用程序注册到徽章通知,在这种情况下,提供商服务器甚至无法发送警报或声音。
通知有效负载
每个推送通知都带有一个有效载荷。有效载荷 指定如何提醒用户等待的数据 下载到客户端应用程序。允许的最大大小 通知有效载荷为256字节; Apple推送通知服务 拒绝任何超出此限制的通知。记住这一点 通知的发送是“尽力而为”,并不能保证。
对于每个通知,提供者必须编写JSON字典对象 严格遵守RFC 4627.此字典必须包含 由关键的aps识别的另一个字典。 aps字典 包含一个或多个指定以下操作的属性:
要显示给用户的警告消息
使用
标记应用程序图标的编号播放声音
请注意,它显示为one or more of the properties
。 alert属性是可选的。您甚至可以使用空aps
字典发送通知(即仅发送自定义属性)。
示例5.以下示例显示了一个空的aps字典; 因为缺少徽章属性,显示任何当前徽章编号 在应用程序图标上删除。 acme2自定义属性是一个 两个整数的数组。
{
"aps" : {
},
"acme2" : [ 5, 8 ]
}
用户将看到警报的唯一警告,询问他/她是否允许推送通知。该警报仅在安装后第一次启动应用程序时显示。
在此示例中,您注册了非警报通知(仅限徽章和声音):
Listing 2-3 Registering for remote notifications
- (void)applicationDidFinishLaunching:(UIApplication *)app {
// other setup tasks here....
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
}
// Delegation methods
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
const void *devTokenBytes = [devToken bytes];
self.registered = YES;
[self sendProviderDeviceToken:devTokenBytes]; // custom method
}
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
NSLog(@"Error in registration. Error: %@", err);
}
所有报价均来自Apple Local and Push notifications编程指南。
答案 1 :(得分:1)
您可以使用
[UIApplication sharedApplication].applicationIconBadgeNumber = aNumber;
答案 2 :(得分:1)
您应该使用applicationIconBadgeNumber
在本地处理您的应用徽章编号
[UIApplication sharedApplication].applicationIconBadgeNumber = number_of_notifications;
就远程通知添加徽章计数器而言,我认为没有警报是可能的。您应该阅读APN Service,在您的情况下,您可以注册UIRemoteNotificationTypeBadge
,您应该阅读Local & Push Notification Programming guide
答案 3 :(得分:1)
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
}
使用这种方法....这将有助于你。