如何在 Unity(C#,目前针对 iOS)中设置每周重复推送通知?

Posted

技术标签:

【中文标题】如何在 Unity(C#,目前针对 iOS)中设置每周重复推送通知?【英文标题】:How can I set a weekly repeat push notifications in Unity (C#, currently targeting iOS)? 【发布时间】:2020-05-14 03:42:53 【问题描述】:

我目前正在为我们用 Unity (C#) 编写的应用程序设置推送通知。下面草稿中的代码。

(总而言之:我获取用户当前登录时间,并将该时间指定为一周中相应日期的推送通知时间。如果一周中的其他日子有空时间(0 -6),我也将这个时间分配给那些人;否则,他们将被单独留下,因为在这种情况下,他们之前已被分配了一天中的适当时间。)

现在,我为下一个通知的日期、小时和分钟设置了通知触发器,并将“重复”设置为 true。在文档中,它声明通知将在每个“定义的时间段”重复 - 因此我假设,例如,如果我将 Day 设置为 2 月 6 日,将小时和分钟设置为 12:34p,这将在每年 2 月 6 日重复下午 12 点 34 分。

我希望每周重复一次通知。这在 Xcode 中很简单,因为您可以设置“工作日”而不是特定日期,就像这里的情况一样。是否有任何解决方案可以在一周中的某一天重复通知?

private void iosNotificationManager()

    // determine whether user has already allowed or disallowed notifications--won't run again if user has already made decision
    StartCoroutine(RequestAuthorization());

    // Schedule daily notification for user based on time of play
    // iOS uses local time, while android uses UTC
    DateTime userTime = DateTime.Now;

    // Set a reminder for this specific day of the week (0 = Sunday, 6 = Saturday).
    // Note that this will overwrite any previous time set for this day.
    GameData.PushNotificationTimes[(int)userTime.DayOfWeek] = userTime;

    // Schedule the week of push notifications for days that haven't already been scheduled
    for (var i = 0; i < 7; i++)
    
        if (GameData.PushNotificationTimes[i] == null)
        
            // get the number of days after which the notification should occur
            int daysToNotification = (i - (int)userTime.DayOfWeek + 7) % 7;
            DateTime nextDay = userTime.AddDays(daysToNotification);

            GameData.PushNotificationTimes[i] = nextDay;
        

        Debug.Log("The push notification time scheduled for day " + i + " is " + GameData.PushNotificationTimes[i]);
    

    for (var i = 0; i < 7; i++)
    
        DateTime pushNotificationTime = GameData.PushNotificationTimes[i];

        var calendarTrigger = new iOSNotificationCalendarTrigger()
        
            Day = pushNotificationTime.Day,
            Hour = pushNotificationTime.Hour,
            Minute = pushNotificationTime.Minute,
            // Indicate whether the notification is repeated every defined time period.
            // For instance if hour and minute fields are set the notification will be triggered every day at the specified hour and minute.
            Repeats = true
        ;
    

【问题讨论】:

【参考方案1】:

好的,在阅读了一些文档后,我想我找到了你想要的。 您可能想要使用 iOSNotificationTimeIntervalTrigger() 而不是 iOSNotificationCalendarTrigger()。这允许您传入 C# TimeSpan。然后您可以将其设置为 7 天。

上次我检查过它应该全年都可以工作;)

Calendar 变体专门用于“每 x 天或每 x 小时发送一次此通知”,因为它不允许几天,或者你可以在那里推 7*24 小时,我真的看不出有什么用那个变种那么多。然后我又在 Unity 的东西中看到了奇怪的东西。

让我知道这是否适合你!

【讨论】:

问题是我正在按星期几设置特定时间。关于修改上述语法以使用 TimeIntervalTrigger 的想法? @MikePandolfini 我已经查看了反编译的代码。虽然 NotificationTrigger 是一个接口,但如果您要实现它,它实际上并没有做那么多。它似乎不支持特定的偏移量(无论是几天还是几小时)但是您可以做的是使用日历触发器,请记住(在本地保存)weekday+ hours/minutes。然后编写一个只计划提前 X 天的循环。假设 3 周,不重复。每当用户再次打开应用程序时,您都会检查计划GetScheduledNotifications() 并再次填充 3 周。 我也有同样的想法,但希望有更优雅的东西。会接受你的回答,因为它肯定会起作用,但我真的很怀念 Xcode 版本——重复 .weekday。 我同意它一点也不优雅。但我觉得推送通知总是有点奇怪。或者根据我的经验,他们是。我肯定会尝试团结一致地提出这一点,以得到你所定义的。我不知道什么是最好的投诉渠道。也许是论坛?祝你的应用好运! 为了后人的缘故,对此答案的最后评论。在不深入细节的情况下,在 Android 上以这种方式设置推送通知非常慢,而在 iOS 上则相当慢,所以请注意您选择以这种方式设置的总天数。我发现超过 3 周的通知 (21) 在某些设备上造成了明显的减速,尤其是对于 Android。

以上是关于如何在 Unity(C#,目前针对 iOS)中设置每周重复推送通知?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WinForms 中设置面板的不透明度或透明度?

我如何在 unity 2018.1 中设置和使用 proGrids?

Unity,如何在Shader Graph中设置shader标签“DisableBatching”=“True”?

如何在 CustomPropertyDrawer 中设置 SerializedProperty.propertyType

如何在 C# 表达式树中设置字段值?

如何在 C# 中设置 HttpWebRequest 的内容?