天天看點

自定義通知界面

自定義通知界面含有兩個獨立的界面:一個靜态界面,一個動态界面。動态界面顯示了完整的自定義通知内容樣式,并且它可以包含由 WatchKit 擴充提供的定制内容和圖形。靜态界面是一個簡單的界面,它僅僅隻含有通知的提示資訊,以及您在設計時配置的靜态圖像以及文本資訊。

當您在 storyboard 檔案中添加新的通知界面控制器的時候,Xcode 将會建立一個獨立的 storyboard 場景,其中包含有一個動态界面和一個靜态界面,如圖15-1所示。靜态界面是必需的,如果需要的話您可以删除動态界面。如果靜态界面已經可以顯示您想要的全部資訊,那麼您就可以删除動态界面。動态界面和靜态場景都和相同的通知類型相關聯,而這個通知類型可以用來指定使用何種通知類别來關聯靜态界面。

圖15-1 靜态界面和動态界面

自定義通知界面

當合适類型的通知抵達時,WatchKit便嘗試顯示動态界面。如果您并未提供靜态界面,或者出于某些原因您的動态界面不可用,那麼Apple Watch 将會用靜态界面來代替。Apple Watch 同樣也會在您明白告知使用靜态場景時顯示靜态界面。配置動态界面需要調用didReceiveRemoteNotification:withCompletion:或didReceiveLocalNotification:withCompletion:方法。如果 這些方法使用WKUserNotificationInterfaceTypeDefault常量來調用完成處理程式的話,那麼 Apple Watch将會顯示靜态場景。

配置自定義界面的通知類型

每個通知界面必須配置設定一個通知類型,以告知 Apple Watch 何時使用它。到來的通知可以在消息載體中包含類别值。Apple Watch 使用這些類别值來決定顯示何種通知場景。如果到來的通知并未包含類别值,那麼Apple Watch會展示一個類型被設定為`default`的通知界面。

要給通知界面配置設定通知類型,請在 storyboard 中配置和場景對應的通知類别(Notification Catagory)對象。該對象的屬性檢查器含有一個Name 屬性,如圖15-2所示。在這個屬性中輸入通知類型的類别名稱。您同樣也可以使用該對象來指定窗扇的顔色。每個通知場景的Name 屬性不能相同。

圖15-2 配置通知類型資訊

自定義通知界面

當生成遠端通知時,您的伺服器要通過在其`aps`字典中包含category鍵的值來指定通知類型。`category`的鍵值要和您在 iOS 應用以及您在通知類别對象中的 Name 屬性指定的一樣。例如,在圖15-2中,類别文本是`MeetingInvite`。

提示:類别字元串同樣定義了被添加到通知界面末端的操作按鈕(如果存在的話)。欲了解關于支援自定義按鈕動作的更多資訊,請參閱Adding Action Buttons to Notifications

配置靜态通知界面

使用靜态通知界面來定義一個自定義通知界面的基本樣式。使用靜态界面的目的是在 WatchKit 擴充不能及時配置動态界面的時候,提供一個回退界面。建立靜态界面的規則如下:

· 所有的圖像必須駐留在 Watch 應用包中

· 界面不能包含控件、表格、地圖,以及其他互動元素

· 界面的`notificationAlertLabel`輸出口必須與某個标簽相關聯。标簽的文本設定為通知的警告資訊。其他的标簽文本不變,并且隻能夠在設計時設定。

圖15-3顯示了在一個月曆應用當中的靜态和靜态場景,其使用了自定義通知界面。通知箭頭指向了靜态場景,其中包含了自定義圖示和兩個标簽。“Message”标簽和`notificationAlertLabel`輸出口連接配接,是以它将在運作時接收通知的警告資訊。

圖15-3 單一通知類型的靜态和動态場景

自定義通知界面

除了和`notificationAlertLabel`輸出口相連的标簽外,在靜态通知場景中的标簽和圖像是不能夠改變的。當您在設計界面時請記住這條準則,并確定每個标簽的文本是合适的。

配置動态通知界面

動态通知界面給使用者提供了一個更豐富的通知體驗。借助動态界面,您可以顯示很多的内容。您可以添加額外的資訊,配置多個标簽,動态地生成内容,等等。

實作動态通知界面需要建立一個自定義的WKUserNotificationInterfaceController子類。該子類的實作代碼負責在通知需要顯示時配置界面。

設計動态界面

配置動态界面和配置其他界面控制器場景十分相似。

您可以在子類中包含标簽、圖像以及場景中的其他對象,并使用這些輸出口以在運作時配置場景的内容。單擊通知界面将啟動應用,是以通知界面不應當包含互動控制。

· 可在絕大多數界面上使用标簽、圖像、組以及分隔符。

· 您可能想要在需要的時候使用表格和地圖。

· 不要包含有按鈕、開關,或者其他互動控件。

在運作時配置動态界面

界面初始化之後,WatchKit将負載資料傳輸到通知界面控制器的不同方法中。對于遠端通知來說,WatchKit 調用didReceiveRemoteNotification:withCompletion:方法。對于本地通知來說,它調用didReceiveLocalNotification:withCompletion:方法。請使用接受到的資料來配置您的通知界面。界面配置完成後,您必須要調用所提供的完成處理代碼塊來讓 WatchKit 知道您的界面已經準備就緒。圖15-4顯示了處理遠端通知的初始化和配置程序。

圖15-4 顯示自定義通知界面

自定義通知界面

始終選擇使用 didReceiveRemoteNotification:withCompletion:和 didReceiveLocalNotification:withCompletion:方法來配置您的通知界面。當實作完這兩個方法後,盡快運作所提供的完成處理方法來配置界面。然後盡快運作這個代碼塊。如果您等待了太長時間,那麼Ale Watch将會使用靜态界面。

代碼表15-1顯示了`didReceiveRemoteNotification:withCompletion:`方法的實作例程。這個方法被一個發送遠端通知的虛構月曆應用所實作,用來提示某個新的會議邀請。這個方法從遠端通知負載中擷取資料,然後使用這個資料來設定通知界面的标簽值。為了簡便,這個示例假定伺服器發送的鍵值中都有合适的對應值,但是您自己的代碼應該執行必要的錯誤檢查,來保證複雜資料是由有效的。在配置完标簽後,這個方法将調用完成處理器,來讓 WatchKit 知曉自定義界面已經就緒。

代碼表15-1 配置遠端通知的自定義界面

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

// Standard remote notification payload keys.

NSString* apsKeyString = @

"aps"

;

NSString* titleKeyString = @

"title"

;

// Payload keys that are specific to the app.

NSString* customDataKey = @

"cal"

;

NSString* invitationDateKey = @

"date"

;

NSString* invitationLocationKey = @

"loc"

;

NSString* invitationNotesKey = @

"note"

;

- (void)didReceiveRemoteNotification:(NSDictionary *)remoteNotification withCompletion:(void(^)(WKUserNotificationInterfaceType interface)) completionHandler {

// Get the aps dictionary from the payload.

NSDictionary* apsDict = [remoteNotification objectForKey:apsKeyString];

// Retrieve the title of the invitation.

NSString* titleString = [apsDict objectForKey:titleKeyString];

[self.titleLabel setText:titleString];

// Extract the date and time from the custom section of the payload.

// The date/time information is stored as the number of seconds since 1970.

NSDictionary* customDataDict = [remoteNotification objectForKey:customDataKey];

NSNumber* dateValue = [customDataDict objectForKey:invitationDateKey];

NSDate* inviteDate = [NSDate dateWithTimeIntervalSince1970:[dateValue doubleValue]];

// Format the date and time strings.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

// Call a custom method to get the localized date format string for the user.

// The default date format string is "EEE, MMM d".

dateFormatter.dateFormat = [self dateFormatForCurrentUser];

NSString *formattedDateString = [dateFormatter stringFromDate:inviteDate];

// Call a custom method to get the localized time format string for the user.

// The default time format string is "h:mm a".

dateFormatter.dateFormat = [self timeFormatForCurrentUser];

NSString *formattedTimeString = [dateFormatter stringFromDate:inviteDate];

// Set the date and time in the corresponding labels.

[self.dateLabel setText:formattedDateString];

[self.timeLabel setText:formattedTimeString];

// Set the location of the meeting.

NSString* locationString = [customDataDict objectForKey:invitationLocationKey];

[self.locationLabel setText:locationString];

// Set the invitation's notes (if any).

NSString* notesString = [customDataDict objectForKey:invitationNotesKey];

[self.notesLabel setText:notesString];

// Tell WatchKit to display the custom interface.

completionHandler(WKUserNotificationInterfaceTypeCustom);

}

當調用完成處理代碼塊時,如果你想 WatchKit 要顯示靜态界面的話,請指定WKUserNotificationInterfaceTypeDefault的内容。

測試您的自定義界面

當您準備在模拟器測試您的自定義界面時,如果您還沒有确定擴充已制作完成的話,請建立一個自定義編譯方案來運作您的通知。使用 Xcode 模闆提供的`RemoteNotificationPayload.json`檔案來指定您的負載資料。要了解更多關于設定編譯方案以及配置負載資料的内容,請參閱The Build, Run, Debug Process。