10

我正在製作一個包含今日延伸的應用程序。今天的擴展顯示了一個定時器列表,如果用戶選擇了其中一個定時器,我想爲該定時器創建並安排一個本地通知。從今日延長內安排本地通知

我的問題是,通知的調度與這行代碼來完成:

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 

所以在擴展運行的模塊訪問UIApplication.sharedApplication()因爲這段代碼實際上嘗試安排的通知,但系統沒有爲EXTENS準備離子要求顯示警報的權限,所以它失敗(這就是它似乎無論如何)。

我該如何解決這個問題?

此外,我知道我可以啓動我的應用程序使用一個URL並安排來自應用程序的通知正常,但這是而不是用戶firendly。擁有今天擴展的全部目的是讓用戶不必打開應用程序來安排通知。交互必須是快速,簡單和透明的,並將用戶從他們所在的應用程序中拖出來,只需運行幾行代碼,然後完成它就不是我想要做的事情。

回答

3

這是不太可能的工作。附加應用信息不允許訪問sharedApplication。事實上,可以防止編譯器注意到你正在這樣做並不會改變這一點。如果你在調試器中試試這個,我猜想sharedApplication實際上是返回零,這就是代碼失敗的原因。

如果你可以找到一些方法使其工作,不要依賴它。蘋果幾乎肯定會將此視爲一個錯誤,並在未來的版本中進行修復,從而在未發出警告的情況下中斷您的擴展。

+0

嗨,您有任何信息表明Apple修復了嗎? – 2015-04-05 10:33:15

+0

@RomanBarzyczak沒有什麼解決。這是蘋果做的目的... – orenk86 2015-04-22 07:21:37

+2

@ orenk86好,謝謝,也許你有任何想法如何從擴展調度本地通知? – 2015-04-22 18:31:42

5

我認爲,如果你這樣做,這可能成爲可能:

  1. 每當你想安排本地通知,讓你今天擴展創建通知,寫它的信息在共享容器的文件。

  2. (你需要一個服務器)聯繫你的服務器形式你今天的擴展,請求你的服務器發送一個簡單的推送通知(content-available:1),然後將喚醒你的主應用程序。

  3. 當你的應用程序是由遠程通知喚醒時,讀取從共享容器步驟1中創建的文件,安排本地通知,然後接着睡。

+1

沒有什麼地方對這種做法。在這一點上是從遠程通知幾乎沒有區別。 – 2016-12-27 17:49:12

4

如果有人來這個問題,這是現在可以在iOS 10中實現,它是新的UserNotifications框架。要從您的附加應用程序擴展安排本地通知,您可以在您的擴展程序中調用以下代碼行:

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