Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone iOS徽章号码实时更新_Iphone_Ios_Xcode_Ipad_Sdk - Fatal编程技术网

Iphone iOS徽章号码实时更新

Iphone iOS徽章号码实时更新,iphone,ios,xcode,ipad,sdk,Iphone,Ios,Xcode,Ipad,Sdk,我为iOS创建了一个自定义日历,我正在尝试使用徽章编号来显示一天中的数字,但数字在一天之后并没有改变,我的意思是他们应该更新lively这里是我的代码:我需要类似weather live的应用程序,此应用程序不会发送任何推送通知 int a = [DateComponents showDay]; [UIApplication sharedApplication].applicationIconBadgeNumber = a ; 您如何以及在何处调用此方法?如果您将计时器设置为每

我为iOS创建了一个自定义日历,我正在尝试使用徽章编号来显示一天中的数字,但数字在一天之后并没有改变,我的意思是他们应该更新lively这里是我的代码:我需要类似weather live的应用程序,此应用程序不会发送任何推送通知

    int a = [DateComponents showDay];
    [UIApplication sharedApplication].applicationIconBadgeNumber = a ;

您如何以及在何处调用此方法?如果您将计时器设置为每x秒运行一次此代码,它将在下一次计时器触发时更新。

您应该能够使用UILocalNotification执行此操作

我不确定你是否可以将它设置为每天自动重复一次,但你可以通过垃圾邮件通知来模仿它


目前在iOS中实现这一点并不容易。你可以接近,但不能每天可靠地更新徽章,除非用户偶尔打开应用程序

您需要使用
UILocalNotification
。您可以创建并计划一个“无声”通知,用于更新应用程序徽标,而无需提醒用户或播放如下警报声音:

UILocalNotification* notification = [[UILocalNotification alloc] init];
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:seconds];
notification.timeZone = [NSTimeZone systemTimeZone];
notification.alertBody = nil;
notification.soundName = nil;
notification.applicationIconBadgeNumber = dayTomorrow;

[[UIApplication sharedApplication] scheduleLocalNotification:notification];
[notification release];
if ([[[UIApplication sharedApplication] scheduledLocalNotifications] count] < 10)
{
    //there are 10 or fewer days' worth of notifications scheduled, so create and
    //schedule more here, up to 64 in total.
}
其中,
daydomoryone
是一个月中明天的整数。而
seconds
是一个时间间隔-这可能类似于到午夜的时间间隔。发送此通知后,用户将不会收到警报或声音,但应用程序标记应更新为新值。您可以使用
repeatInterval
属性使此通知每天重复,但这里的问题是,第二天您需要将
daydroother
更改为不同的值,然后在第二天再次更改。但是重复的警报在
applicationBadgeNumber
中始终具有相同的值

因此,我认为实现任何接近您想要的目标的唯一方法是安排多个本地通知-您可以提前安排多达64个-每一个通知间隔一天,并且每个通知都将当天的值设置为
applicationBadgeNumber
。这些需要是非重复的,因此请确保将
repeatInterval
设置为nil(或者不要设置它,因为nil是默认值)。假设所有这些通知都由iOS可靠地发送,您将能够在长达64天的时间内无声地更新徽章号码,而不会打扰用户。之后,徽章将停止更新除非您同时安排了更多通知,即当用户打开应用程序时。您可以尝试在应用程序启动时取消所有现有的计划通知:

[[UIApplication sharedApplication] cancelAllLocalNotifications];
然后提前64天循环,为
applicationBadgeNumber
属性安排每天午夜的通知,通知日期为当月的正确日期。只要用户至少每64天打开一次你的应用程序,你就会保持徽章图标的最新状态。如果您设想您的应用程序用户经常打开应用程序(例如每天多次),那么优化方法可能是在取消现有通知并创建64个新通知之前检查计划的通知数量,如下所示:

UILocalNotification* notification = [[UILocalNotification alloc] init];
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:seconds];
notification.timeZone = [NSTimeZone systemTimeZone];
notification.alertBody = nil;
notification.soundName = nil;
notification.applicationIconBadgeNumber = dayTomorrow;

[[UIApplication sharedApplication] scheduleLocalNotification:notification];
[notification release];
if ([[[UIApplication sharedApplication] scheduledLocalNotifications] count] < 10)
{
    //there are 10 or fewer days' worth of notifications scheduled, so create and
    //schedule more here, up to 64 in total.
}
这里发生的是:

  • 我们使用
    [NSDate date]
    获取今天的日期,然后将其分解为要保留的组件(年、月、日),然后将时间组件(小时、分钟、秒)设置为午夜。这给了我们今天午夜的时间
  • 我们循环了64次,每次创建一个新的日期,即未来1到64天,方法是取
    MiddnightToday
    并将每天的秒数乘以我们希望该日期在未来的天数。我们使用此日期安排本地通知
  • 我们还需要计算出一个月的哪一天是徽章号码。因此,我们再次使用
    NSDateComponents
    将未来日期分解为我们感兴趣的组件-在本例中,这些组件只是日期,因此我们指定
    NSDayCalendarUnit
    。然后,我们可以将
    applicationBadgeNumber
    设置为
    components.day
  • 64个通知中的每一个都与UIApplication一起安排,在未来1到64天内交付

请注意,这可能只适用于使用Gregorian(西式)的用户日历-根据您的市场,您可能需要考虑世界各地使用的其他日历类型并支持这些日历。

如果退出应用程序,计时器将不运行,您可以在午夜发送ULICOL通知,以NSay日历日历单元的重复间隔。在AppDelegate中,在:-(void)application:(UIApplication*)application didReceiveLocalNotification:(UILocalNotification*)通知中更新徽章。非常感谢Rob帮助我,但是
SECONDS\u PER\u DAY
显示明天,而
i*SECONDS\u PER\u DAY
后天,我将其更改为:
60*60
;并删除了
i*
,因为我的日历是波斯日历,所以我等待明天看到更新徽章号码银行,很抱歉,这是一个巨大的文本墙-我对这个问题非常感兴趣,必须找到解决方案!在调试器中查看
futureDate
时,要小心,因为我认为它总是显示为GMT,而不是您自己的时区。但是,如果在设置
fireDate
后检查通知,它将显示为时区中的正确时间。所以一定要检查这个。我也在我的设备上安装了它,耐心地等待到明天,看看是否所有的更新都正确:)不幸的是,徽章号码没有更新!实际上什么都没发生,我想这是因为你使用了波斯日历。我已经在代码中添加了几个NSLog语句——您可以将它们添加到代码中并取消注释它们,然后查看记录日期时的样子吗。如果您的iOS设备设置为使用波斯日历,则不能使用NSGregorianCal