从 Today 扩展中安排本地通知

Posted

技术标签:

【中文标题】从 Today 扩展中安排本地通知【英文标题】:Scheduling local notification from within a Today extension 【发布时间】:2014-11-01 13:09:16 【问题描述】:

我正在制作一个包含 Today Extension 的应用。今天的扩展显示了一个计时器列表,如果用户选择其中一个计时器,我想为该计时器创建并安排一个本地通知。

我的问题是通知的调度是用这行代码完成的:

UIApplication.sharedApplication().scheduleLocalNotification(notification)

不幸的是,它依赖于无法从扩展程序访问的UIApplication.sharedApplication()

所以我的问题是:如何在 Today 扩展中安排本地通知?

有趣的是,我可以使用我的应用程序和我的扩展程序之间共享的代码创建一个框架,并且我可以在该框架中调用:

func schedule() 
    // ...
    let settings = UIUserNotificationSettings(forTypes: .Sound | .Alert, categories: nil)
    UIApplication.sharedApplication().registerUserNotificationSettings(settings)
    // ...
    UIApplication.sharedApplication().scheduleLocalNotification(notification)
    // ...

如果我从我的扩展中导入该框架并调用schedule(),我会得到以下输出:

Failed to inherit CoreMedia permissions from 13636: (null)

Attempting to schedule a local notification <UIConcreteLocalNotification: 0x7feaf3657a00>fire date = Saturday, November 1, 2014 at 1:01:48 PM Western European Standard Time, time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Saturday, November 1, 2014 at 1:01:48 PM Western European Standard Time, user info = (null) with an alert but haven't received permission from the user to display alerts

Attempting to schedule a local notification <UIConcreteLocalNotification: 0x7feaf3657a00>fire date = Saturday, November 1, 2014 at 1:01:48 PM Western European Standard Time, time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Saturday, November 1, 2014 at 1:01:48 PM Western European Standard Time, user info = (null) with a sound but haven't received permission from the user to play sounds

因此,在扩展程序中运行的模块可以访问UIApplication.sharedApplication(),因为此代码实际上试图安排通知,但系统没有准备好扩展程序请求显示警报的权限,因此它失败了(看起来就是这样无论如何)。

我该如何解决这个问题?

另外,我知道我可以使用 url 启动我的应用程序并像往常一样安排来自应用程序的通知,但那是 不是 用户友好的。拥有今天扩展的全部目的是让用户不必打开应用程序来安排通知。交互必须快速、简单和透明,并且将用户从他们所在的应用程序中拉出来只是为了运行几行代码然后完成它不是我想做的事情。

【问题讨论】:

【参考方案1】:

如果有人提出这个问题,现在可以在 ios 10 中实现,它是新的 UserNotifications 框架。要从您的应用扩展程序安排本地通知,您只需从您的扩展程序中调用这行代码:

UNUserNotificationCenter.current().add(<#UNNotificationRequest#>)

【讨论】:

我无法发送它...没有任何反应。 notificationCenter.add(request) 没有返回错误但没有显示通知......有什么建议吗?顺便说一句,我从 NetworkExtension 调用它【参考方案2】:

如果你这样做,我认为这可能会成为可能:

    每当您想安排本地通知时,让您的 Today 扩展程序创建通知并将其信息写入共享容器中的文件。

    (您需要一个服务器)通过您的 Today 扩展程序联系您的服务器,要求您的服务器发送一个静默推送通知(内容可用:1),然后唤醒您的主应用程序。

    当您的应用被远程通知唤醒时,从共享容器中读取从第 1 步创建的文件,安排本地通知然后返回睡眠状态。

【讨论】:

这种方法没有任何地方性。在这一点上,它与远程通知几乎没有区别。【参考方案3】:

这极不可能奏效。不允许应用扩展访问sharedApplication。可以防止编译器注意到您正在这样做的事实并不会改变这一点。如果您在调试器中尝试此操作,我猜sharedApplication 实际上返回 nil,这就是代码失败的原因。

如果您可以找到使其工作的方法,请不要依赖它。 Apple 几乎肯定会认为这是一个错误并在未来的版本中修复它,在没有警告的情况下破坏您的扩展。

【讨论】:

@orenk86 好的,谢谢,也许你知道如何从扩展安排本地通知? @RomanBarzyczak 你没在听。苹果不支持这个。如果您认为他们应该支持它,请向它提交增强请求。目前不可能。

以上是关于从 Today 扩展中安排本地通知的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 10 中安排和处理本地通知

在本机反应中安排本地通知不起作用

如何在 iOS 中安排可以暂停或删除的本地通知?

如何在 Windows Phone 应用程序 8.1 rt 中安排本地通知?

在 PhoneGap/Cordova 中安排本地通知在 iOS 模拟器上不起作用

如何通过应用程序扩展(iWatch)取消预定的本地通知(在 iPhone 上)