APP誕生全紀錄 - 容易忽略的必要功能1:推播

更新於 2022/11/10閱讀時間約 13 分鐘
一個APP在規劃的時候可能覺得主要功能就只有這一兩個,實作起來應該不難,卻忘了現代人的胃口已經越養越大,很多不在你預期內但對於使用者來說卻是很基本的功能;另一種是商店上架或是第三方要求的必要功能
如果你還沒有閱讀過「APP誕生全紀錄」,建議可以先看一下,至少知道哪些可能是容易忽略的必要功能,今天這篇文章內容會比較偏向技術層面,我們先來探討其中重要的一項:推播〔Push Notification〕

簡介

推播示意 - 聖經種子
推播現在已經是手機中不可或缺的一個功能,無論是用來接收新的通知或是提醒,甚至是開發者想要對使用者傳遞的任何即時消息,都可以使用推播,這是個提升APP存在感並且增加留存率的實用工具。如果你今天開發出一款APP,在某些使用情境下,使用者直覺認為應該要收到提醒推播,但實際卻沒有任何通知跳出的話,那對於APP的留存率可是一大硬傷。今天我們就來介紹一下這個舉足輕重的功能,在Android中叫FCM,在iOS裡叫APNs,這兩個都是遠端推播,另外有一種是本地推播 (補充在最後),以上所有項目在本文章內都統稱推播。

設定

我們來使用Flutter + Firebase Cloud Messaging (FCM)實作看看,如果你還沒設定過Firebase,可以上網找一下相關資訊,有許多初始設定和使用介紹的文章可以參考,我們這裡就不再多加贅述,只針對推播這個功能來做說明。

Android

在AndroidManifest.xml中加入service描述(如果使用的Flutter Version >= 1.12可以不用設定這一部分)
<service
  android:name=".java.MyFirebaseMessagingService"
  android:exported="false">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT" />
  </intent-filter>
</service>
(Optional) 可選擇自訂的icon和顏色
<meta-data
  android:name="com.google.firebase.messaging.default_notification_icon"
  android:resource="@drawable/ic_stat_ic_notification" />
<meta-data
  android:name="com.google.firebase.messaging.default_notification_color"
  android:resource="@color/colorAccent" />

iOS

因為我們使用的套件統一接口都在FCM中,所以我們必須將你的 APNs 身份驗證密鑰上傳到 Firebase作串接。如果你還沒有 APNs 身份驗證密鑰,趕快去Apple Developer Member Center中啟動Push Notification功能並創建一個密鑰吧。
  1. 在 Firebase 控制台的項目中,選擇齒輪圖標,選擇Project Settings ,然後選擇Cloud Messaging選項卡。
  2. iOS app configuration下的APNs authentication key中,單擊Upload按鈕。
  3. 瀏覽到您保存密鑰的位置,選擇它,然後單擊打開。添加密鑰的密鑰 ID,然後單擊Upload 。。
  4. 在XCode中勾選Push Notification背景監聽
背景模式下獲取推播設定
開啟推播主要設定

安裝套件

在Flutter專案的pubspec.yaml中加入
dependencies:
  firebase_messaging: ^12.0.2

取得TOKEN

首先在啟動時我們需要先要求權限,並且儲存一下設備的Token,可以把這個token想成是使用者設備的地址,之後後台發送推播就是使用這組地址來發送指定的推播。
class PushNotification {
  init() async {
    //要求權限
    NotificationSettings settings = 
    await messaging.requestPermission(
    alert: true,
    announcement: false,
    badge: true,
    carPlay: false,
    criticalAlert: false,
    provisional: false,
    sound: true,
    );
    if (settings.authorizationStatus == AuthorizationStatus.authorized ||
    settings.authorizationStatus == AuthorizationStatus.provisional) {
       //如果權限有被使用者允許,拿一下Token地址吧!
      messaging.getToken().then((value) => _token = value);
    }
  }
}

推播監聽

接下來我們要在啟動時加入各種情境的監聽函式,總共有四種情境要處理。
  1. 程式在前景模式運作中
  2. 程式在背景模式
  3. 程式在背景模式點擊推播打開後
  4. 程式被關閉的狀態點擊推播打開後
// 背景模式收到推播後的處理函式註冊
// 這裡要注意的是此callback必須是個top-level的static function
FirebaseMessaging.onBackgroundMessage(messageOnBackground);
// 關閉的狀態點擊推播打開後的處理函式註冊
messaging
.getInitialMessage()
.then((message) => messageOpenedOnTerminated(message));
// 前景模式收到推播後的處理函式註冊
FirebaseMessaging.onMessage
.listen((message) => messageOnForeground(message));
// 背景模式中使用者點擊推播後的處理函式註冊 
FirebaseMessaging.onMessageOpenedApp
.listen((message) => messageOpenedOnBackground(message));
註冊的callback函式都會傳入一個結構體RemoteMessage,這個就是推播的結構體,我們通常最主要處理的會有title、body、和data。title會是推播顯示中的主標題,body會是推播顯示中的描述文字,而data就會是設計者想要傳遞給使用端的自訂結構。
就是這麼簡單!
最後你只要把收到推播資料的處理寫在對應的callback內就可以囉!
這裡要注意一下前景模式收到推播時,不會再另外跳出預設的通知訊息視窗,如果你想要跟背景模式下收到時一樣會跳出推播的提示視窗,必須另外使用Local Notification來發佈自訂的通知。

進階本地通知

補充說明一下本地通知,在兩種情況下會需要用到。一種是前面提到過的,當收到遠端推播資料時,APP正在前景模式的狀況下,不會跳出推播視窗;另一種是APP內觸發的推播,例如定時鬧鐘。
我們使用flutter_local_notifications這個套件來實作,Android使用前需要先設定一個channel id供套件使用。
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="bible_seed_channel" />
要使用前初始化一下
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();

final AndroidNotificationChannel channel = AndroidNotificationChannel(
  'bible_seed_channel', // id
  'BibleSeed Notifications', // title
  description: 'This channel is used for important notifications.', // description
  importance: Importance.max,
);
final InitializationSettings initializationSettings =
InitializationSettings(
  android: AndroidInitializationSettings("@mipmap/ic_launcher"),
  iOS: IOSInitializationSettings(),
);

await flutterLocalNotificationsPlugin.initialize(initializationSettings);
await flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannel(channel);
//iOS前景顯示選項設定
await FirebaseMessaging.instance
.setForegroundNotificationPresentationOptions(
  alert: true,
  badge: true,
  sound: true,
);
需要推播時呼叫流程如下
final NotificationDetails notificationDetails = NotificationDetails(
  android: AndroidNotificationDetails(
    'bible_seed_channel', // id
    'High Importance Notifications', // name
    channelDescription: 'This channel is used for BibleSeed important notifications.',
    importance: Importance.max,
    priority: Priority.high,
    icon: '@mipmap/ic_launcher',
  ),
  iOS: IOSNotificationDetails(),
);
final id = DateTime.now().millisecondsSinceEpoch ~/ 1000;
flutterLocalNotificationsPlugin.show(id, title,
body, notificationDetails);
在這個套件中,還可以設定各種定時的推播,詳細內容就請參閱相關文件囉。

結論

今天我們先介紹了第一種容易被忽略卻非常必要的一個APP功能,不知道你看完後是不是想要立馬加上這功能了呢?!期待後續有機會繼續介紹其他的重要功能,趕緊訂閱一下,不要錯過任何一篇精彩文章囉!!
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
3會員
7內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Amos的沙龍 的其他內容
「聖經種子」團隊當初在組成的時候,成員本就是散落在各地,因著我的邀請而聚集在一起。因為大家都在不同的城市,平日也有自己的工作,所以對於我們來說,該如何讓團隊中溝通討論順暢、設計協作合作順利、凝聚出向心力,就成了最大的課題。
今天當你完成了你心目中完美的作品,迫不及待的想要放到商店上讓大家下載使用,卻沒想到是噩夢的開始?!從上架前的審查,到上架後的各種問題浮現,讓你焦頭爛額了嗎?這裡和你分享一下4種在APP「上線期」會遇到的問題和解決方法,讓你上線沒煩惱。
很多人可能都想過要開發一款APP,雖然擁有許許多多創意的點子,但卻不知道該從何開始下手嗎?這篇文章將會分享一個實際從無到有、從創作開發到上線推廣的開發案例,讓你實際了解中間所有的過程、會踩到的問題點以及你可能從沒想過但開發中一定會遇到的困難處。
「聖經種子」團隊當初在組成的時候,成員本就是散落在各地,因著我的邀請而聚集在一起。因為大家都在不同的城市,平日也有自己的工作,所以對於我們來說,該如何讓團隊中溝通討論順暢、設計協作合作順利、凝聚出向心力,就成了最大的課題。
今天當你完成了你心目中完美的作品,迫不及待的想要放到商店上讓大家下載使用,卻沒想到是噩夢的開始?!從上架前的審查,到上架後的各種問題浮現,讓你焦頭爛額了嗎?這裡和你分享一下4種在APP「上線期」會遇到的問題和解決方法,讓你上線沒煩惱。
很多人可能都想過要開發一款APP,雖然擁有許許多多創意的點子,但卻不知道該從何開始下手嗎?這篇文章將會分享一個實際從無到有、從創作開發到上線推廣的開發案例,讓你實際了解中間所有的過程、會踩到的問題點以及你可能從沒想過但開發中一定會遇到的困難處。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
她是一個很特別的人。 談及結婚議題,是她人生目前最大難題,她愛對方可不想結婚但被嚴重逼婚,對有的人來說婚姻是一張紙、一個身分,有與沒有都不這麼重要,愛才是重點;對有的人來說結婚才有未來藍圖,才能以連結的身分「在一起」。 很多問題沒有對錯,感情更是,對我來說只是看事情的角度不一樣,即使換位思考也不
在app遇見各種形形色色的人,有的人想聊天,有人則是想找跑友運動,在一個加密空間裡,充斥著不負責任、脫離現實感的愉悅,加入如此簡單,退出也一樣容易,無痕。 在打完招呼後,配對到的對象直接來一句「工作好煩喔」,簡短一句卻道出身體裡最深刻的吶喊,對方說上班輕鬆但很無聊,想離職但到職不到2個月,觀察他的
Thumbnail
想要遠程控制家中捲門,不知道怎樣選擇? TUYA捲門控制面板 易微聯捲門控制開關 格來得捲門開關 遠程控制、語音開關
Thumbnail
還記得約莫在一年前,我有介紹過 Shiftscreen 這款能為 Apple 行動設備帶來類桌面操作體驗的工具吧,雖然那時候覺得它十分有潛力,但可惜後來作者似乎棄坑了,直到近期,我又找到了另一款類似的新秀,或許能填補這個空缺?
Thumbnail
「重要但不緊急」的事情每天做一點,便會發現重要緊急幾乎沒有發生的機會。 而「每天做一點」的秘訣在於持續,能讓持續不斷發生的,除了明確目標外,便是我們是否感到舒適自在了。
Thumbnail
如果說 3D 模型圖是人們熟知最真實的一切,那麼像素點陣圖就是人們懷念終要逝去的真實。應用程式名稱:八位元畫家( 8bit Painter )、發行日期:2015-08-15、最新版本:1.17.0、提供者:OneTap Japan、下載位置:iOS、Android
Thumbnail
這篇繼續介紹最近密集使用的斷捨離APP,拿取了好東西後,怎麼順利拿到手。 1、面交。0成本的方法 2、超商-全家。 3、i郵箱
全家:APP中當有人拿取自己的物品,會出現在「我的交易」,「產生寄件號碼」。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
她是一個很特別的人。 談及結婚議題,是她人生目前最大難題,她愛對方可不想結婚但被嚴重逼婚,對有的人來說婚姻是一張紙、一個身分,有與沒有都不這麼重要,愛才是重點;對有的人來說結婚才有未來藍圖,才能以連結的身分「在一起」。 很多問題沒有對錯,感情更是,對我來說只是看事情的角度不一樣,即使換位思考也不
在app遇見各種形形色色的人,有的人想聊天,有人則是想找跑友運動,在一個加密空間裡,充斥著不負責任、脫離現實感的愉悅,加入如此簡單,退出也一樣容易,無痕。 在打完招呼後,配對到的對象直接來一句「工作好煩喔」,簡短一句卻道出身體裡最深刻的吶喊,對方說上班輕鬆但很無聊,想離職但到職不到2個月,觀察他的
Thumbnail
想要遠程控制家中捲門,不知道怎樣選擇? TUYA捲門控制面板 易微聯捲門控制開關 格來得捲門開關 遠程控制、語音開關
Thumbnail
還記得約莫在一年前,我有介紹過 Shiftscreen 這款能為 Apple 行動設備帶來類桌面操作體驗的工具吧,雖然那時候覺得它十分有潛力,但可惜後來作者似乎棄坑了,直到近期,我又找到了另一款類似的新秀,或許能填補這個空缺?
Thumbnail
「重要但不緊急」的事情每天做一點,便會發現重要緊急幾乎沒有發生的機會。 而「每天做一點」的秘訣在於持續,能讓持續不斷發生的,除了明確目標外,便是我們是否感到舒適自在了。
Thumbnail
如果說 3D 模型圖是人們熟知最真實的一切,那麼像素點陣圖就是人們懷念終要逝去的真實。應用程式名稱:八位元畫家( 8bit Painter )、發行日期:2015-08-15、最新版本:1.17.0、提供者:OneTap Japan、下載位置:iOS、Android
Thumbnail
這篇繼續介紹最近密集使用的斷捨離APP,拿取了好東西後,怎麼順利拿到手。 1、面交。0成本的方法 2、超商-全家。 3、i郵箱
全家:APP中當有人拿取自己的物品,會出現在「我的交易」,「產生寄件號碼」。