Ios 从今日扩展中计划本地通知

Ios 从今日扩展中计划本地通知,ios,cocoa-touch,notifications,uilocalnotification,ios8-today-widget,Ios,Cocoa Touch,Notifications,Uilocalnotification,Ios8 Today Widget,我正在制作一个包含今日扩展的应用程序。today扩展显示计时器列表,如果用户选择其中一个计时器,我想为该计时器创建并安排本地通知 我的问题是通知的调度是通过以下代码行完成的: UIApplication.sharedApplication().scheduleLocalNotification(notification) 不幸的是,它依赖于无法从扩展访问的UIApplication.sharedApplication() 因此,我的问题是:如何在“今日”分机内安排本地通知? 有趣的是,我可以用

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

我的问题是通知的调度是通过以下代码行完成的:

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

因此,我的问题是:如何在“今日”分机内安排本地通知?

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

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
未能从13636继承CoreMedia权限:(null)
正在尝试安排本地通知{火灾日期=2014年11月1日星期六下午1:01:48西欧标准时间,时区=(null),重复间隔=0,重复计数=UILocalNotificationInfiniteRepeatCount,下一次火灾日期=2014年11月1日星期六下午1:01:48西欧标准时间,用户信息=(null)}具有警报,但尚未收到用户显示警报的权限
正在尝试安排本地通知{火灾日期=2014年11月1日星期六下午1:01:48西欧标准时间,时区=(null),重复间隔=0,重复计数=UILocalNotificationInfiniteRepeatCount,下一次火灾日期=2014年11月1日星期六下午1:01:48西欧标准时间,用户信息=(null)}具有声音,但尚未收到用户播放声音的权限
因此,在扩展中运行的模块可以访问
UIApplication.sharedApplication()
,因为该代码实际上试图安排通知,但系统没有准备好让扩展请求显示警报的权限,因此它失败了(不管怎么说,似乎是这样)

我怎样才能解决这个问题


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

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


如果你能找到办法让它工作,不要依赖它。苹果几乎肯定会认为这是一个bug,并在未来的版本中修复它,在没有任何警告的情况下破坏您的扩展。

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

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

  • (您需要一台服务器)从今日扩展中联系您的服务器,要求您的服务器发送一个静默推送通知(可用内容:1),然后将唤醒您的主应用程序

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


  • 如果有人问这个问题,这在iOS 10和新的UserNotifications框架中是可以实现的。要计划应用程序扩展的本地通知,您可以从扩展中调用以下代码行:

    UNUserNotificationCenter.current().add(<#UNNotificationRequest#>)
    
    UNUserNotificationCenter.current().add()
    
    @orenk86好的,谢谢,也许你知道如何安排分机的本地通知吗?@RomanBarzyczak,你没在听。苹果不支持这一点。如果您认为他们应该支持它,请与它一起提交增强请求。这在目前是不可能的。这种方法没有任何地方特色。在这一点上,它几乎无法与远程通知区分。我无法发送它。。。什么也没发生。notificationCenter.add(请求)未返回任何错误,但未显示任何通知。。。有什么建议吗?顺便说一句,我是从NetworkExtension调用它的