IOS手把手輕松實現靈動島(Live activity)

首先,我們先簡單了解下靈動島

緊湊視圖.png
拓展視圖.png
鎖屏視圖.png

Live Activities 依賴于 Widget 實現 函數和頁面,而與Widget不同,Live Activities無法訪問網絡或接收位置更新,更新Live Activities可以使用ActivityKit和遠程推送,同時ActivityKit可以控制Live Activities的開始,更新和結束。

靈動島的啟用由我們進行控制,且一個程序可以實現多個靈動島,但啟用最多展示兩個

靈動島一共有三種樣式展示:

1. 只有一個Live Activities活動時,如下圖,將在靈動島的左右兩個部分顯示信息(緊湊級),點擊打開App查看詳細信息
image
2. 而同時有多個Live Activities活動時,系統最多展示只兩個(最小級)Live Activities活動,一個將緊貼靈動島,一個單獨展示在圓圈內,如下圖:
image
3. 手指按中其中任何一個,系統將展示(拓展視圖),如下圖:
image

靈動島拓展區域劃分見下圖:

image

一個Live Activities可以運行12小時,靈動到運行8小時,到達8小時系統將自動結束并移到鎖屏界面,在鎖屏界面可以保持4小時,這是涌用戶可以移除或達到4小時系統自動移除。

下面是手把手實現靈動島功能

1. 創建Live Activities,如下圖步驟
image
image
image
2. 完成創建Live Activities后,在主項目的Info.plist中添加NSSupportsLiveActivities = YES。
image
3. 下一步,根據[ActivityAttributes] 結構代碼定義Live Activities所需的靜態和動態數據,如圖,在主項目創建:
image
4. 根據剛才創建的[ActivityAttributes]來創建靈動島頁面,如下圖:
image

靈動島頁面需要實現的部分有4個

  1. 不支持靈動島的機型 或 鎖屏時的 顯示
  2. 緊湊級展示(即左右貼合靈動島的展示)
  3. 多Live activity時的展示(即極小視圖,左貼合,右分離)
  4. 拓展視圖(長按時觸發)
5. 完成上面步驟,Live activity 已經創建好了,下面是啟動:
image

靈動島的活動狀態一共有3種:

  1. active 處于活動中
  2. ended 已經終止且不會有任何更新,但依舊在鎖屏界面展示
  3. dismissed 結束且不再展示
6. 更新靈動島數據(更新的就是在ActivityAttributes中聲明的動態數據):
image

Live activity也支持遠程推送更新,根據文檔以下9點要求實現(Activity遠程通知每小時有通知預算<數量未明確>,超出后系統將關閉通知)

  1. 確保主程序已經開通了遠程推送功能
  2. 確保啟動activity時[request(attributes:contentState:pushType:)傳入pushType參數(.token)
  3. 獲取啟動后的activity的推送令牌pushToken,傳給服務端用來推送更新activity
  4. 服務端推送的更新內容字段需要和ActivityAttributes的ContentState 中定義的動態數據字段對應
  5. 設置推送的報頭apns-push-type的值為liveactivity
  6. 設置推送的報頭apns-topic的值為<your bundleID>.push-type.liveactivity
  7. 正確的推送對應的內容和狀態
  8. 使用pushTokenUpdates監聽pushToken變化,如有變化,就令牌失效,需要將新的令牌傳給服務器
  9. 當Activity結束時,服務器端的pushToken將失效

下面是官方提供的示例:


  { 

  "aps": { 

  "timestamp": 1168364460, 

  "event": "update", 

  "content-state": { 

  "driverName": "Anne Johnson", 

  "estimatedDeliveryTime": 1659416400

  }, 

  "alert": { 

  "title": "Delivery Update", 

  "body": "Your pizza order will arrive soon.", 

  "sound": "example.aiff"

  } 

  } 

  } 

可以在aps內設置dissall -date 字段來告訴系統在什么時候移除activity ,eg: “dismissal-date”: 1663177260

*** 不用為推送提供聲音 , 如果推送延遲,在activity結束后收到時將被忽略,avtivity每小時有通知預算(數量未明確),超出后系統將關閉通知***
7. 結束Activity:
image

結束分為兩種:

  1. .default 系統默認,結束后在鎖屏界面保留4小時
  2. .immediate 立即結束,不會在鎖屏界面停留

項目鏈接:點擊跳轉示例查看

界面實現參照:界面參照

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容