SMS User Consent API — 提升 UX 小撇步

邱懷民
一個被音樂耽誤的Android工程師
4 min readOct 20, 2019

前言

上禮拜剛好幫公司導入自動驗證簡訊 OTP 的功能,想說趁休假整理一下,分享給有需要的開發者朋友們參考!

簡訊驗證一直都是 App 註冊/登入很重要的一部分,但如果能跳過手動輸入直接自動驗證,對使用者絕對是非常貼心的舉動!我還記得第一次使用到有導入自動驗證 OTP 功能的 App 時,心裡面那種驚訝和溫馨的感覺 😂

Google 提供的 SMS Verification APIs 分為兩種,一種是需要客製化簡訊內容的 Automatic SMS Verification,這個 API 不需要使用者提供任何權限,但是需要跟 Backend server 互動;另一種則是相對簡易,也是今天要介紹的 One-tap SMS Verification,好處是可以只修改 Client 端就能實現,但是需要使用者提供一次性的簡訊讀取權限。

話不多說,直接來看如何實作吧!

實作

先導入 Play service 的 dependencies

implementation 'com.google.android.gms:play-services-auth:17.0.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:17.1.0'

接著啟動簡訊監聽服務

val task: Task<Void> = SmsRetriever.getClient(context)
.startSmsUserConsent(senderPhoneNumber /* or null */)

這邊要特別注意, SmsRetriever 必須要在寄送驗證碼前啟動,否則 Play service 不會攔截到簡訊喔!

在啟動服務後的五分鐘內,如果攔截到的簡訊符合下列三項條件的話,Play service 會寄送一則要求使用者一次性權限的 broadcast 給你。

  1. 簡訊內容包含了 4–10 位的英數字
  2. 寄送號碼不在使用者的通訊錄名單內
  3. 寄送號碼為指定的 senderPhoneNumber

創建 Broadcast Receiver 來處理 intent

當 Broadcast 收到了 Play service 發送的 intent 之後,我們要彈出一個視窗詢問使用者是否同意一次性的權限

最後回到 Activity 來處理 OTP

這邊我們要在 onCreateonDestroy 的時候 register/unregister 我們的 Broadcast Reciever,當使用者同意讀取簡訊權限後,我們會在 onActivityResult 拿到整封簡訊的內容,這時候再做相對應的 parse、取得 OTP code 填入欄位,最後再觸發驗證功能。

小結

其實實作完後發現沒有想像中的這麼難且耗時,雖然相對 Automatic SMS Verification 來說,使用者需要多按一顆按鈕來同意權限,但比起需要自己確認驗證碼後再手動填入,已經方便不少了 🙌

小弟在開發同時也找到 Google 在 androidx.autofill 的 beta 版中加入了 AUTOFILL_HINT_SMS_OTP 選項,官方表示只要使用者有打開自動填入簡訊驗證碼的功能就會自動啟用,但嘗試過後發現沒有成功,目前自己的做法是兩個方式都導入(說不定哪一天進正式版後功能就正常了)。如果有開發者朋友們嘗試過也歡迎交流一下心得 🙏

希望這篇文章對想要導入自動驗證簡訊 OTP 功能的人有點幫助,謝謝大家!

--

--

邱懷民
一個被音樂耽誤的Android工程師

喜歡抱著吉他彈彈唱唱,夢想是靠著寫程式改變世界。