iOS Push詳述,瞭解一下?

来源:https://www.cnblogs.com/qcloud1001/archive/2018/10/26/9855041.html
-Advertisement-
Play Games

歡迎大家前往 "騰訊雲+社區" ,獲取更多騰訊海量技術實踐乾貨哦~ 本文由 "WeTest質量開放平臺團隊" 發表於 "雲+社區專欄" 作者:陳裕發, 騰訊系統測試工程師 商業轉載請聯繫騰訊WeTest獲得授權,非商業轉載請註明出處。 原文鏈接: " http://wetest.qq.com/lab ...


歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~

本文由WeTest質量開放平臺團隊發表於雲+社區專欄

作者:陳裕發, 騰訊系統測試工程師

商業轉載請聯繫騰訊WeTest獲得授權,非商業轉載請註明出處。

原文鏈接:http://wetest.qq.com/lab/view/380.html

WeTest 導讀


本文主要對iOS Push的線上push、本地push及離線(遠程)push進行梳理,介紹了相關邏輯,測試時要註意的要點以及相關工具。小小的Push背後蘊藏著大大的邏輯!


Push種類

一、線上push


線上push:當用戶線上(APP在前臺)時,收到的狀態欄的消息提醒,稱為線上push。這個功能與蘋果系統無關,是我們自己的APP開發的一種功能,該push與設置中是否打開“通知”無關。

這裡以iOS Qzone為例,當APP在前臺時,自己發的說說被點贊了,收到的線上push如下:

img1.png

              Qzone線上push 

二、離線(遠程)push


離線push:當APP在離線(kill掉進程、切到後臺、鎖屏)時,收到的消息提醒,稱為離線push。離線push是需要經過蘋果的APNs伺服器才可以推送到某台設備的某個APP上的,這是和本地push的本質區別。push與設置中是否打開“通知”有關。

這裡最簡單的以大家常用的手機QQ為例,當APP在後臺、鎖屏或者被kiil了進程時,收到了消息:

img2.png

   離線push 

1、靜默push

靜默push用的場景不較少,這裡只做簡要介紹。

首先我們看看離線(遠程)push與靜默push的區別:

普通離線(遠程)push:收到推送後(有文字有聲音),點開通知,進入APP後,才執行-- (void)application:(UIApplication didReceiveRemoteNotification:(NSDictionary fetchCompletionHandler:(void result))handler )application )userInfo (^)(UIBackgroundFetchResult

靜默push:收到推送(沒有文字沒有聲音),不用點開通知,不用打開APP,就能執行(void)application:(UIApplication )application)userInfo didReceiveRemoteNotification:(NSDictionary fetchCompletionHandler:(void (^)(UIBackgroundFetchResultresult))handler,用戶完全感覺不到。

所以靜默push又被我們稱做 Background Remote Notification(後臺遠程推送)。靜默推送是在iOS7之後推出的一種推送方式。它與其他推送的區別在於允許應用收到通知後在後臺(background)狀態下運行一段代碼,可用於從伺服器獲取內容更新。

三、本地push


本地push:本地推送和遠程推送的功能是一樣的,都是要提醒用戶去做某些事情。但是和遠程推送不同的就是本地推送是不需要設備聯網的,而遠程推送是必需要設備聯網的,因為只有聯網狀態下,才能和蘋果的APNs伺服器建立長連接,從而推送消息。本地推送是由App自己設定的,並且發送給安裝此App的這台設備,屬於一對一的對應關係。比較典型的應用是鬧鐘類似的場景。該push與設置中是否打開“通知”有關。

最容易看到本地push的場景,可以直接在手機設置一個計時器,計時器時間到了就會彈出本地push:

img3.png

         本地push

img4.png

由於本地push原理和作用相對於線上push和離線push都更為簡單明瞭,下文主要介紹線上push和離線push。

本地push實現

一、 iOS10以前本地push彈出方式


試驗過iOS10以前的本地push方法在iOS10+的系統也能使用,不過可能有些參數不生效。

1、立即展示( iOS10以前)

本地push稍微簡單,有兩種方式可以調用,一種是presentLocalNotificationNow方法,立即展示本地push:

img5.png

2、延遲展示( iOS10以前)

另一種是用scheduleLocalNotification方法按計劃來彈本地推送:

img6.png

如果使用這種方法,需要對推送的時間進行設置,舉個例子,設為5秒後:

img7.png

二、設置本地push內容( iOS10以前)


img8.png

其中alertBody是消息內容鎖屏與不鎖屏時效果如下:

img9.png

     本地push效果

applicationIconBadgeNumber是消息數量,我們可以看到這裡設置為66:

img10.png

      消息數

三、處理本地push ( iOS10以前)


1、 App沒有啟動情況下處理本地push

這種情況下,當點擊通知時,會啟動App,而在App中,開發人員可以通過實現AppDelegate中的方法:- (BOOL)application:(UIApplication)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions,然後從lauchOptions中獲取App啟動的原因,若是因為本地通知,則可以App啟動時對App做對應的操作,比方說跳轉到某個畫面等等。

img11.png

2、App運行在後臺及前臺

上面的2種情況的處理基本一致, 不同點只有當運行再後臺的時候,會有彈窗提示用戶另外一個App有通知,對於本地通知單的處理都是通過AppDelegate的方法:- (void)application:(UIApplication )application didReceiveLocalNotification:(UILocalNotification *)notification來處理的。

img12.png

四、iOS10以後本地push彈出方式


iOS10以後,本地通知可以由使用 UNUserNotificationCenter來管理。

創建方法:

img13.png

接下來需要需創建一個包含待通知內容的 UNMutableNotificationContent 對象:

img14.png

在iOS上可以通過以下幾種觸發器來觸發本地push:

● UNCalendarNotificationTrigger 傳送本地通知的日期和時間。

● UNTimeIntervalNotificationTrigger 傳遞本地通知之前必須過期的時間。

● UNLocationNotificationTrigger 用戶必須達到的地理位置才能提供本地通知。

● UNPushNotificationTrigger 表示通知是從Apple推送通知服務發送的對象。

假如以時間間隔(TimeInterval)來觸發,則設置觸發器代碼為:

img15.png

推送本地push的代碼為:

img16.png

線上、離線(遠程)push流程

一、線上push流程


線上push相對簡單,因為是內部實現,具體流程如上面所示。

1、判斷app是否線上

此處可以根據APP自身的後臺策略如上一次與後臺交互的時間等方法來判斷APP是否線上或者離線。認為線上,會發送線上push,否則,發送離線push。

2、線上push特點

● 線上push有以下幾個特點:

● 不需要經過蘋果APNs。

● 需要自己實現長鏈接。

● 代碼在app內部實現。

二、離線(遠程)push流程


img17.png

離線push流程

主要流程為:

● 伺服器端將消息先發送到蘋果的APNs

● 由蘋果的APNs將消息推送到客戶的設備端

● 由iOS系統將接收到的消息傳遞給相應的App。

簡而言之離線push是蘋果系統的行為,與app狀態無關,能夠直接推送到指定手機的指定app。

在進一步瞭解離線push前,我們有必要先瞭解幾個名詞。

1、離線push名詞解釋

—APNs

APNs:Apple Push Notification service(蘋果推送通知服務)。

APNs主要用於以下場景:當用戶主動殺掉 APP,或者 APP 進入後臺超過約定時長時,APP會被kill,這樣保障了前臺 APP 的流暢性,也延長了手機的使用時長,獲得了較好的用戶體驗,但是這也意味著,伺服器無法主動和用戶交互(如推送實時消息等),所以蘋果推出了 APNs,允許設備和伺服器分別與蘋果的推送通知伺服器保持長連接狀態。

關於APNs的更新有以下幾點

● iOS 8以後,APNs推送的位元組是2k,iOS8以前是256位元組

● iOS 9以後APNs支持HTTP/2協議棧,優化長連接,具有標準的HTTP返回和管道復用技術

● iOS 10以後,推送的位元組是4k,APNs可根據推送消息的唯一標示符查詢某條消息是否被用戶閱讀,可更新某一推送消息,而不用發重讀的多條消息

關於APNs更全面的介紹可以看官方文檔:

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1

—payload

什麼是payload?對於每一條發送給APNs的推送消息,都包含一個payload,通常是組成了一個JSON的Dictionary,這其中必不可少的是aps屬性,它對應的value也是一個Dictionary,包含一些但不限於以下內容:標題、副標題、內容、附件、category等,如

img18.png

—device token

什麼是device token?我們看一下官方的簡介:

device token: APNs uses device tokens to identify each unique app and device combination. It also uses them to authenticate the routing of remote notifications sent to a device.(device token是APNs用於區分識別每個iOS設備和設備上不同app的一個標識符,還可以用於APNs通過它將推送消息路由到指定設備上)

即:device token里包含了device id和bundle id的信息,但是device id和bundle id不會確定唯一的device token。

但是,這裡有個坑,查資料得知,iOS8及之前的iOS系統,對於同一部手機,如果卸載後重裝APP的話,device token是不會變的,在token變了以後,老的token,就被認為是無效了,蘋果不會對這部分無效的token推送。但是,對iOS9及以後的iOS系統,對於同一部手機,卸載後重裝APP的device token是會發生變化的,而且老的token不會無效,還可以正常推送,這應該是蘋果的一個bug,但是蘋果也沒有修複這個問題,所以這個需要開發者自己來解決,否則容易出現一個app收到多個push的問題。官方的說法是:

To protect user privacy, do not use device tokens to identify user devices. Device tokens change when the user updates the operating system and when a device’s data and settings are erased. As a result, apps should always request the current device token at launch time.(即此舉為了保護用戶隱私,device token會在更新系統、擦除設置重置後變化,在一定時間後會過期)

2、離線push詳細流程

知道了以上概念後我們重新來看一下離線(遠程)push的詳細流程:

img19.png

    離線push詳細流程

1) 首先是應用程式註冊消息推送。

2) iOS跟APNS Server要deviceToken。應用程式接受deviceToken。

3) 應用程式將deviceToken發送給PUSH服務端程式。

4) 服務端程式向APNS服務發送消息。

5) APNS服務將消息發送給iPhone應用程式。

值得註意的是,當由於用戶反覆卸載重裝程式(雖然概率很小)等原因導致多個device Token指向同一臺設備的同一個app,又把多個device Token發給APNs時,用戶就會收到多條push。蘋果APNs是不會對多個device Token是否指向同一臺設備的同一個app做校驗的,所以需要後臺來做去重等處理保證用戶不會收到多條push。

三、對離線(遠程)push的響應


1、iOS 7以上對離線(遠程)push時的響應

iOS 7以上關於接受離線push有兩個函數

img20.png

那麼這兩個函數有什麼區別呢?其實這兩個方法都是用來處理離線push的。

差別就是,如果app在前臺是收到離線(遠程)push,那麼就會調用

img21.png

相對的,如果在後臺或者殺進程情況下,點擊收到的離線push,那麼就會調用,如果沒有實現

img22.png

則會調用

img23.png

若實現了前者,就只調用前者。

2、iOS 10以上對離線(遠程)push的響應

iOS10對push的處理主要增加了兩個方法

img24.png

其中前者是對APP在前臺時收到push時的處理,後者是點擊push進入APP執行的函數。

用得比較多的是後者,我們可以舉個例子,點擊push進入APP後如何獲取push的消息、角標、標題等內容:

img25.png

iOS 10關於push的一些新特性

iOS10新增的UserNotifications框架,主要有了這樣幾方面的更新:

● 用UserNotifications框架替換了原先與通知相關的介面,通知文字可分為title、subtitle和body三部分,通知可攜帶附件

● 系統在展示通知之前,可以喚起app附帶的service extension,並且允許它改動通知的內容

● 用戶在對通知右滑查看、下拉或者3d touch的時候,通知會展開,展開後頁面的佈局可以由app附帶的content extension來決定

一、push的多樣性


iOS10以前的push只有文字,甚至沒有標題。

iOS10以後的push更加多樣化,可以有主標題,副標題,甚至還有附件,這裡以我司的騰訊新聞為例(有標題,內容,和附件):

img26.png

 騰訊新聞push

3D touch點入詳情以後:

img27.png

   騰訊新聞push詳情

這裡我們驚奇的發現,除了可以攜帶圖片這樣的附件、push還能展開詳情以外,進入詳情以後,下麵還多了“打開”、“收藏”、“不感興趣”這些選項,這裡就涉及到以下iOS10的新特性。

二、push攜帶附件


因為payload有大小限制,所以如果remote notification想要攜帶附件,那麼payload上只能帶上如附件下載地址之類的信息,等通知到達客戶端後由service extension下載附件到本地,然後在初始化UNNotificationAttachment對象時傳入附件在本地的URL。

img28.png

初始化UNNotificationAttachment對象時,可以傳入option參數。這裡的option參數可以強制指定附件的類型,可以選擇是否展示縮略圖,以及縮略圖截取自附件的哪一幀、哪一部分。

目前iOS10通知只將幾種格式的圖片、音頻和視頻作為附件,附件的大小也有一定限制,具體可以看官方文檔中的限制說明。

關於附件的更加詳細的說明,可以參考官方文檔:

https://developer.apple.com/documentation/usernotifications/unnotificationattachment?language=objc

三、攜帶action的通知


上面提到的“打開”、“收藏”、“不感興趣”這些選項其實就是push攜帶的action,其實從iOS8開始,通知已經可以攜帶action了。而在iOS10中,通知的action被放在了更明顯的位置,與action相關的介面也有了很大變化。

決定一個通知應該有哪些action呢?在payload中,這是由category欄位決定的。如果我們希望一個通知能攜帶若幹個action,我們就需要將若幹個action和一個category綁定起來。通知到達前端後,系統會根據category的名字來決定要給這個通知展示哪些action:

img29.png

怎麼得知用戶選了哪個action並做出相應操作呢?這需要給UNUserNotificationCenter指定一個delegate:

img30.png

然後在delegate的類中實現

img31.png

方法:通過response.notification.request.content.categoryIdentifier和response.actionIdentifier就可以得知用戶選擇的action了。

四、改變push內容


這裡主要講應用的比較多的離線(遠程)push的改變push方法

1、改變本地push內容

本地push,只要request的id一樣,那麼就可以更新推送:

更新的例子:

img31.png

img32.png

此外,還有刪除所有推送等,都在UNUserNotificationCenter.h中實現。

2、改變離線(遠程)push內容

目前遠程push只支持更新push內容,更新需要通過新的欄位apps-collapse-id來作為唯一標示。方法是在HTTP/2 請求頭中使用相同的apns-collapse-id,這樣收到同樣的apns-collapse-id的push時,push內容便會更新。

使用場景:比較容易理解的一個場景就是球賽比分,比如現在是1:0,如果變成1:1的話,只需要刷新原來的新聞,這樣用戶就不會因為同一場比賽收到多條push。

五、兩個extension


有兩個與push相關的extension,可能我們會好奇這兩個extension有什麼不同,為什麼需要兩個?它們分別實現什麼功能呢?

img33.png

    push相關extension

1、notification service extension

給app添加notification service extension後,系統會在收到通知後喚醒它,並允許它修改通知的內容,之後再展示這個通知。

service extension只對remote notification起作用,local notification是無法喚起它的。

如果想要讓系統喚起service extension的話,payload必須符合這樣幾個條件:

1) 必須增加mutable-content欄位併為1,這表示允許客戶端修改這個通知:

payload(舉例)如下:

img34.png

2)這個通知必須展示一個alert,如果只是一個修改badge的通知的話,是不會喚起service extension的

3)靜默推送是不能喚起service extension的,所以payload中不能有”content-available” : 1欄位

所以,通過這個notification service extension,你可以在接收到推送之後、展示推送之前處理一些事情,比如說更新一下推送內容,或者在後臺做一些其他事情。

2、notification content extension

另一項notification content extension用於完全自定義推送展開後的視圖。上面騰訊新聞的展開後的視圖就是通過這個notification content extension實現的。

依然以騰訊新聞為例子:

img35.png

      展開界面

這裡Notification Content Extension大展拳腳的地方,在這裡可以自定義繪製不同的內容,將希望展現給用戶的額外信息可以載入這裡。

下半部分的notification action的實現就是在上面提到的“攜帶action的通知”。

測試要點

img36.png

Q&A

Q:離線push,支持角標(badge)在本地角標數值上+1這樣的操作嗎?

A:不支持。如果是自己實現push服務的話,需要自己的後臺將角標值badge發送個APNs伺服器,有些APP使用第三方push SDK除外。

Q:如果重覆收到離線push,可能是什麼情況

A:

1)iOS9之後卸載重裝後生成新的deviceToken,後臺對多個deviceToken都發送了push

2)後臺對註銷了的賬號也發送了push。

總而言之一般是後臺的邏輯出現了問題,而不是APNs伺服器出現問題。

Q:直接卸載APP,還能收到離線push嗎?

A:不會收到。直接卸載APP,雖然後臺不知道APP被卸載了,仍然會對之前的賬號發送push,但是由於手機上沒有對應APP,所以並不會收到push。

Q:為什麼有時候全新安裝APP就立馬有紅點角標?

A:這是因為卸載該APP時有紅點角標。每個 APP 的角標都是存在 iOS 手機系統里的,開發無法修改,所以此時卸載前有角標,重新安裝也會有角標。但是,APP 卸載之後超過一天的時間再重裝,那麼角標就會被系統清空,屆時也不會有新安裝的 APP 就有角標的情況存在。

相關工具

Knuff離線push工具下載鏈接:https://github.com/KnuffApp/Knuff/releases

使用方法也比較簡單

img37.png

比如我的payload輸入如下:

img38.png

得到的應該是有“Knuff測試”文字,和角標數變為999,我們可以看下結果,與預料是一致的:

img39.png

     預期結果

有了這個工具也更加方便了我們的iOS push的調試。

參考資料iOS推送之遠程推送(iOS Notification Of Remote Notification):https://www.jianshu.com/p/4b947569a548玩轉 iOS 10 推送 —— UserNotifications Framework(合集):https://www.jianshu.com/p/f57e2045f711用iOS10 UserNotifications框架來接收remote notification:https://www.jianshu.com/p/b6be6310f866iOS10推送通知進階(Notification Extension):https://www.jianshu.com/p/78ef7bc04655

相關閱讀
系統負載能力淺析
搭建公眾號自動回覆功能
【每日課程推薦】機器學習實戰!快速入門線上廣告業務及CTR相應知識

此文已由作者授權騰訊雲+社區發佈,更多原文請點擊

搜索關註公眾號「雲加社區」,第一時間獲取技術乾貨,關註後回覆1024 送你一份技術課程大禮包!

海量技術實踐經驗,盡在雲加社區


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.首先檢查我們的代碼: 二.註冊在主活動上的代碼需要補上: 從中我們可以看到我們註冊在XML界面上,<intent-filter>後面的代碼為<action android:name="com.example.lenovo.activitytest.ACTION_START"/>,action中間 ...
  • 任務Runnable定義了一個可以獨立運行的代碼片段,通常用於界面控制項的延遲處理,比如有時為了避免同時占用某種資源造成衝突,有時則是為了反覆間隔刷新界面從而產生動畫效果。運行一個任務也有多種形式,既可在UI線程中調用處理器對象的post或者postDelayed方法,也能另外開啟分線程來執行Runn ...
  • 微信里搜“青少兒書畫”就行了。任何人可以任意發佈自己的寶寶的作品啊。發佈作品方式有2種,一種是電腦登錄網站上用瀏覽器(chrome瀏覽器、opera瀏覽器,firefox瀏覽器等,ie的不行)發佈作品。網址是https://zsj.itdos.com/project/26171另外一種方式是用小程式 ...
  • 註釋以 <!-- 開始並以 --> 結束,例如 <!--註釋內容-->。註釋可以出現在文檔序言中,包括文檔類型定義 (DTD);文檔之後;或文本內容中。 註釋不能出現在屬性值中。 不能出現在標記中。分析器在遇到 > 時,就認為註釋已結束;然後繼續將文檔作為正常的 XML 處理。 因此,字元串 > 不 ...
  • 筆者在進行安卓開發時,發現自己的代碼語法完全沒有問題。尤其是創建intent對象的時候,語法完全是正確的,但是Android Stuidio卻顯示報錯,Intent類顯示為紅色,如圖所示: 代碼如下所示: 利用滑鼠指向Intent編譯器就會顯示: 我相信很多朋友也遇到了這個問題,至於我們該如何解決這 ...
  • 本篇針對Surface模塊進行分析,從Java層的Activity創建開始,到ViewRoot、WindowsManagerService,再到JNI層和Native層。 首先推薦一個Android源碼查看的網站:http://androidxref.com/ Surface的創建涉及三個部分: A ...
  • 有些App在點擊下載按鈕的時候,可以在按鈕上顯示進度,我們可以通過繼承原生Button,重寫onDraw來實現帶進度條的按鈕。 Github:https://github.com/imcloudfloating/ProgressBar 1.效果: 2.原理: 創建三個GradientDrawable ...
  • 這次想來講講系統應用集成過程中遇到的一些坑,尤其是 so 文件相關的坑。 背景 埋這些坑的最初來源是由於測試人員在集成新終端設備時提了個 bug: app 在這個設備上無法啟動。 隨後拋來了一份日誌,過濾了下,最重要的其實就一條,crash 日誌: app 使用了 fresco 圖片庫,最初猜想是不 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...