2016-01-08 69 views
0

我有我的收藏的應用程序反應,在接受localNotifications我的分機代表的WatchOS 2 - 呈現另一WKAlertAction而現有仍被顯示

- (void)didReceiveLocalNotification:(UILocalNotification *)notification 

如下

WKAlertAction *okAction = [WKAlertAction actionWithTitle:@"OK" style:WKAlertActionStyleCancel handler:^(void) { 
DbgLog(@"Dismissed notification alert "); 
}]; 

NSArray *alertActions = @[okAction]; 

assert(extension.rootInterfaceController); 
[extension.rootInterfaceController presentAlertControllerWithTitle:notification.alertTitle message:notification.alertBody preferredStyle:WKAlertControllerStyleAlert actions:alertActions]; 

其中一期工程。如果手錶應用程序處於焦點狀態,則從我的應用程序觸發的本地通知會顯示在手錶上,就像在iPhone應用程序處於焦點時它們在iPhone上的操作方式一樣。如果手錶應用程序未對焦或其屏幕當前未通電,則回退到系統通知處理。

問題是這些本地通知可能會以相對較快的速度出現。當他們這樣做,相同的代碼被調用,並沒有任何提交..你不能提出另一個警報控制器的當前之一,並不是說我想,但我不認爲你可以解僱當前的警報,然後才能提出新的。

在iOS上也有類似的問題,但你可以通過使用正確的視圖控制器來呈現這樣

- (UIViewController *)myVisibleViewController 
{ 
    if ([self isKindOfClass:[UINavigationController class]]) 
    { 
    return [[(UINavigationController*)self topViewController] myVisibleViewController]; 
    } 

    if ([self isKindOfClass:[UITabBarController class]]) 
    { 
    return [[(UITabBarController *)self selectedViewController] myVisibleViewController]; 
    } 

    if (self.presentedViewController == nil || self.presentedViewController.isBeingDismissed) 
    { 
    return self; 
    } 

    return [self.presentedViewController myVisibleViewController]; 
} 

WatchOS使用的東西在新的但似乎並沒有提供這樣的能力避開他們。這意味着我的應用無法真正處理通知,以及我想要的。如果有什麼,我寧願總是讓系統處理通知的方式,當應用程序沒有對焦或手錶屏幕關閉時。但我不認爲在應用程序處於焦點時,您可以獲得這種行爲。

說實話,即使系統通知我發現一個小片狀,如果很多通知一次到達,我不認爲系統處理它很好,它往往是我會錯過一些通知的原因隱藏在其他人身後並且不適合向用戶展示,我希望Apple在後續的WatchOS版本中修復這些內容。

任何人有任何想法,或者它是不可能有一個WatchOS 2應用程序處理通知在演示時間重疊?

乾杯!

回答

1

不確定這將有助於'重疊'部分 - 但你似乎在這裏混合了兩個不同的'功能' - 本地通知和WKAlertControllers。

WKAlertController用於在應用程序處於活動狀態(即在監視屏幕上)時向用戶彈出警報窗口。你給它一個標題,消息,按鈕等。

本地(和遠程)通知是不同的。他們從手機中開槍,手機決定您當前正在使用哪個設備,並向該設備發出警報。如果是手錶,則通知界面(「短視」 - 不可自定義)用於顯示通知消息。然後是「Long Look」界面(您可以自定義)。您不要將手錶設置爲監聽本地/遠程通知 - 如果您在創建項目時啓用這些通知(或稍後添加功能),那麼默認情況下是在那裏。如果您想從Watch上創建本地通知,則可以通過WCSession將消息發送到手機中,然後由手機在該手機上進行處理。

請注意 - 如果您正在使用通知,則通知將顯示在手錶上,但如果您的實際應用程序處於活動狀態(屏幕顯示),則通知將不會顯示。電話上的情況也是如此 - 您可以在您的應用處於活動狀態時設置提醒,或者在應用處於後臺時設置本地通知。(但是通過手機,您可以在您的應用程序內收聽Local Notification並在發生警報時發出警報。)

總之 - 您無法使用本地(或遠程)通知調用WKAlertController。 編輯 - 其實是的,你可以!

希望這會有所幫助。不確定重疊警報是否是由任何這種情況引起的,但也許!

+0

感謝您的回答。也許我漫不經心就把這個問題弄糊塗了。我的應用程序主要運行在我的iPhone上,手錶僅僅是一個窗口,顯示手機上發生的事情。雖然我的應用程序在電話上運行,但它會不時生成本地通知,有時會連續發生。在手錶上,我試圖做你描述的內容,並讓用戶意識到通知。正如您在運行時所說的那樣,系統通知處理沒有完成,您的應用程序只會得到通知。在這個通知處理中,我提出警報。 – jimbobuk

+0

如果兩個通知在相似的時間到達,那麼當試圖顯示第二個通知的警報時,它只會失敗,從而使用戶不知道第二個通知已到達。我沒有看到解決方案,因爲無法在iOS中級聯警報 – jimbobuk

+0

我注意到文檔說只有一個警報可以隨時顯示,如果第二個警報顯示第一個應該被解僱辦法。這似乎沒有發生,所以也許我會記錄一個雷達 – jimbobuk

1

OK後重新閱讀您的文章幾次,並做一些挖掘自己,我想我更好地理解(因爲太長的評論!添加作爲另一個答案)。而且我也學到了一些東西。在應用程序處於活動狀態時,您可以從通知中啓動警報,與手機中的相同!所以謝謝。

現在我更瞭解您的問題了,我試了一下,看看您的意思是堆疊多個警報控制器。隨後的警報只需替換屏幕上已有的警報即可。根據Apple的文檔:

一次只能看到一個動作或警報表。如果您致電 此方法和工作表已可見,則此方法在顯示新工作表之前會取消上一張工作表。

我的測試似乎顯示隨後的警報被簡單地忽略,而不是取代它們,但是你去了。這聽起來像你正在經歷的?

我假設你想要用戶按OK(或Cancel)並關閉每個警報,以便他們能夠依次採取行動?我可以想到的一個潛在的解決方法(但還沒有嘗試過):也許你可以創建一個警報隊列,並利用這個事實:在解除模態警報控制器後,調用底層接口控制器的willActivate並檢查是否有更多警報在隊列中。所以它可以這樣工作:

1.)當您的didReceiveLocalNotification在擴展委託中選擇一個通知時,它檢查一個數組(假設爲alertQueue)的警報。如果數組爲空,它將添加新警報的詳細信息,然後調用警報。如果數組不是空的,它只是將此消息的詳細信息添加到數組,但不調用Alert。

2.)在willActivate檢查任何條目的alertQueue。如果有,顯示警報並從陣列中刪除該警報。當警報被用戶解僱時,willActivate將再次運行,如果新條目已被didReceiveLocalNotification添加,同時它可以遍歷它們,直到數組再次爲空。

也許不是那麼優雅,或者完全沒有想過,正如我所說我沒有嘗試過這個,但它似乎(在我的腦海裏!)這是一個可能的起點嗎?

+0

再次感謝您的答案。我寧願他們會堆疊您的建議可能允許的警報,但我不知道警報完成後會調用willActivate。可以看看這個。替換的默認行爲是好的,但堆疊可能更好。顯然,蘋果有一個缺陷可以解決。今天早上我在模擬器上測試了這一點,因爲即使手機模擬器被鎖定,它似乎仍然醒來通知,而不是通知出現在手錶模擬器上。第二次通知確實到達手錶,但它使測試這件事變得困難。乾杯! – jimbobuk

+0

我認爲他們限制了這一點,以控制資源使用情況,即如果一系列警報一個接一個地到達,那就是手錶需要處理(並且相互呈現)的很多接口控制器,以及最少的資源手錶可能會很快淹沒。 – travelnsam

+0

我傾向於將通知傳遞放在(Apple)神的圈中。你無法控制電話決定發送的位置 - 對我而言,只要通知出現在某處*,那麼我認爲這是成功的,並繼續前進。有一點要記住,使用Notifications以您的方式觸發應用內警報 - 在Watch OS2下,手機可能與手錶無法通信,因此可能無法將通知發送給它。如果您的應用程序設計爲獨立運行在Watch上,則最好僅在Watch上處理應用程序內警報。 – travelnsam