【问题标题】:iOS Push Notifications - update badge without alert?iOS 推送通知 - 更新徽章而不发出警报?
【发布时间】:2013-02-19 23:09:21
【问题描述】:

有没有办法在不显示警报或打开应用程序的情况下更新徽章中的数字?

我正在编写一个应始终在图标徽章中显示当前未读消息数量的应用,但我想这样做而不向用户显示任何警报。

我正在为 iOS 5.0+ 开发。

编辑:为了更清楚,我在问一种方法来做到这一点当应用程序没有运行时。我希望服务器在不显示警报的情况下推送新的徽章编号。这可能吗?

【问题讨论】:

  • AFAIK 完全由操作系统处理。您是否有任何不想显示警报的具体原因?
  • 该应用程序是为非常高的消息频率而构建的,我不想给用户带来错误。所以根据你所说的 - 如果用户去,我只能实现这种行为通知中心并禁用警报?
  • @Pandu1251 没听懂你最后一句。你在说什么逻辑?
  • @Ran,如果你使用推送通知服务,那么收到推送会一直显示提示信息,这是iOS的默认属性。如果应用程序已关闭,它还会显示警报消息。但是您不想显示警报消息,而是想显示徽章编号。因此,您不应该使用推送通知,因为它会自动显示警报消息。您可以执行定期服务器请求以获取当前徽章编号以显示为本地通知。而且这段代码需要在后台运行。
  • @sumon 我希望这与 Windows Phone 磁贴通知类似......哦,好吧。谢谢你的回答。

标签: iphone ios ipad push-notification apple-push-notifications


【解决方案1】:

你可以使用

[UIApplication sharedApplication].applicationIconBadgeNumber = aNumber;

【讨论】:

  • 对不起,我没有说清楚,我的意思是当应用程序关闭时。查看我的编辑。
【解决方案2】:

您应该使用applicationIconBadgeNumber 在本地处理您的应用徽章编号

[UIApplication sharedApplication].applicationIconBadgeNumber = number_of_notifications;

就从远程通知添加徽章计数器而言,我认为没有警报是不可能的。您应该阅读APN Service,在您的情况下,您可以注册UIRemoteNotificationTypeBadge,您应该阅读Local & Push Notification Programming guide

【讨论】:

  • 对不起,我没有说清楚,我的意思是当应用程序关闭时。查看我的编辑。
  • 在这种情况下,您将拥有方法 didReceiveRemoteNotification,您可以在此方法中做任何您想做的事情
  • 我想在用户不运行应用程序的情况下更新徽章,如果用户已经打开应用程序,它对我没有任何价值。有点像 iOS 内置的邮件应用程序。
  • 您将注册该特定通知,例如在您的情况下可能是UIRemoteNotificationTypeBadge,您应该仔细阅读远程通知的处理方式
  • 也许我遗漏了一些东西,但didReceiveRemoteNotification 在应用启动时不会执行吗?我不想启动应用程序,只更新徽章而不运行任何应用程序代码。
【解决方案3】:
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

{

    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
}

使用这个方法....这对你有帮助。

【讨论】:

    【解决方案4】:

    你可以做到。 可以在没有警报的情况下发送推送通知。 您甚至可以将您的应用程序注册为标记通知,在这种情况下,提供程序服务器甚至无法发送警报或声音。

    通知负载

    每个推送通知都带有一个有效负载。有效载荷 指定如何提醒用户注意等待的数据 下载到客户端应用程序。允许的最大尺寸 通知负载为 256 字节;苹果推送通知服务 拒绝任何超过此限制的通知。请记住 通知的传递是“尽力而为”,不能保证。

    对于每个通知,提供者必须组成一个 JSON 字典对象 严格遵守 RFC 4627。该字典必须包含 另一个由键 aps 标识的字典。 aps 词典 包含一个或多个指定以下操作的属性:

    向用户显示的警告消息

    用于标记应用程序图标的数字

    要播放的声音

    请注意,上面写着one or more of the properties。警报属​​性是可选的。您甚至可以使用空的 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 本地和推送通知编程指南。

    【讨论】:

    • Eran,我有一个后续问题。如果我的应用程序在后台监控用户位置运行,该应用程序是否可以在用户不知道或打开应用程序的情况下接收通知并执行一些代码?如果收到推送通知,我希望应用程序将其位置发送到服务器...
    • 是否可以在有效负载中发送没有徽章编号的推送通知,因为我不想使用徽章概念。或者我应该设置为徽章编号“0”。
    • @siva 当然可以。徽章参数是可选的。
    • 更新:在 iOS 8 及更高版本中,通知负载允许的最大大小为 2 KB
    • @Raptor 如果使用二进制方法,则为 2K,如果使用 HTTP/2,则为 4K
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2014-05-06
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多