เมื่อคุณเปิดตัวเวอร์ชันใหม่ของแอปพลิเคชัน คุณต้องการให้ผู้ใช้รู้เกี่ยวกับมัน ไม่ว่าคุณจะแก้ critical bug เพิ่มฟีเจอร์ใหม่ หรือแอปพลิเคชันทำงานราบรื่น/เร็วขึ้น – พวกเขาต้องรู้
ในฐานะนักพัฒนาแอปพลิเคชัน เราต้องการให้ผู้ใช้ทุกคนใช้เวอร์ชันล่าสุดของแอปพลิเคชันของเรา
แต่มันจะทำอย่างไรให้แน่ใจว่าผู้ใช้ทราบถึงเวอร์ชันใหม่?
คำตอบค่อนข้างง่าย: ทำไมไม่แจ้งเตือนพวกเขาเมื่อมีเวอร์ชันใหม่ออก?
คุณทำได้หลายวิธี:
- ใช้ push notification
- บอกพวกเขาตอนที่แอปพลิเคชันเปิด
เราจะไม่จัดการ push notifications ในบทความนี้ แทนที่จะโฟกัสที่การแสดง dialog ให้ผู้ใช้ทราบว่ามีเวอร์ชันใหม่ และจัดการกับการอัปเดต
รอ แล้วสิ่งนี้ไม่ได้รวมอยู่แล้วหรือ?
คุณคิดว่าฟังก์ชันนี้ควรมีใน mobile OS สมัยใหม่แล้ว และคุณถูกต้อง – แต่เพียงแค่ Android เท่านั้น
iOS (ปัจจุบัน) ไม่ให้นักพัฒนาเห็นว่ามีเวอร์ชันใหม่ของแอปพลิเคชันและแจ้งเตือนผู้ใช้ ใน Android คุณมี In-App Update library ที่เป็นส่วนหนึ่งของ Google Play libraries
เพราะฉะนั้น และเพราะ Flutter รองรับทั้งสองแพลตฟอร์ม ผมจะครอบคลุม 2 packages ที่โดดเด่นที่ช่วยจัดการ version updates:
- Upgrader
- In App Update
ทั้งคู่ให้ผลลัพธ์ที่ต้องการ แต่วิธีการแตกต่างกันมาก
ก่อนเริ่ม สำคัญมาก: คุณต้องมีเวอร์ชันของแอปพลิเคชันที่ติดตั้งโดยตรงจาก Google Play store นี่จำเป็นเพราะทั้งสอง packages ขึ้นอยู่กับ Google Play services และความสามารถในการตรวจสอบเจ้าของแอปพลิเคชัน
หากคุณล้มเหลวในการทำเช่นนั้น คุณจะเห็น error ต่อไปนี้เมื่อพยายามใช้หนึ่งใน packages:
_Install Error(-10): The app is not owned by any user on this device. An app is "owned" if it has been acquired from Play. (https://developer.android.com/reference/com/google/android/play/core/install/model/InstallErrorCode#ERROR_APP_NOT_OWNED)
วิธีใช้ Package In App Update
ตั้งแต่ต้น คุณควรทราบว่า package นี้ทำงานได้บน Android เท่านั้น เพราะมันขึ้นอยู่กับ in app update library สำหรับการทำงานภายใน
Package นี้โดยพื้นฐานคือ wrapper สำหรับ Android library ด้านล่างคือ API methods ที่ expose:
Future<AppUpdateInfo> checkForUpdate(): ตรวจสอบว่ามีอัปเดตหรือไม่Future<AppUpdateResult> performImmediateUpdate(): ทำ immediate update (เต็มจอ)Future<AppUpdateResult> startFlexibleUpdate(): เริ่ม flexible update (ดาวน์โหลดเบื้องหลัง)Future<void> completeFlexibleUpdate(): ติดตั้ง flexible update ที่พร้อม
✋ หากคุณอยากอ่านเพิ่มเติมเกี่ยวกับความแตกต่างระหว่าง immediate update และ flexible update ไปที่นี่
วิธีตั้งค่า Package
ก่อนอื่น เพิ่ม package ใน pubspec.yaml:
dependencies:
flutter:
sdk: flutter
in_app_update: ^3.0.0
จากนั้น pub get
ภายในแอปพลิเคชัน ที่คุณตั้งใจจะทำ logic จัดการ in app updates เพิ่ม import:
import 'package:in_app_update/in_app_update.dart';
เราจะต้องเพิ่ม logic ตรวจสอบว่ามีอัปเดตหรือไม่ ใช้ method checkForUpdate ค่าที่คืนเป็น Future ที่มีข้อมูลเกี่ยวกับ availability และ progress ของ app update
เราสามารถตรวจสอบว่ามีอัปเดตโดยใช้ property updateAvailability หากมีอัปเดต จะมีค่า UPDATE_AVAILABLE ดังนั้น method อาจเป็นแบบนี้:
InAppUpdate.checkForUpdate().then((updateInfo) {
if (updateInfo.updateAvailability == UpdateAvailability.updateAvailable) {
// Logic to perform an update
}
});
ต่อไป เราต้องตัดสินใจว่าจะ trigger update แบบไหน – flexible หรือ immediate
Immediate update ควรสงวนไว้สำหรับอัปเดตที่ critical สำหรับผู้ใช้ นั่นอาจหมายถึง version ที่แก้ critical bug หรือเพิ่มฟีเจอร์ใหม่
เพื่อเริ่ม immediate update ใช้ method performImmediateUpdate เมธอดนี้คืนค่า AppUpdateResult enum บอกว่า update สำเร็จหรือไม่
ก่อนเรียกเมธอดนี้ ต้องตรวจสอบว่าอนุญาตให้รัน immediate update ได้หรือไม่ โดยเข้าถึง flag immediateUpdateAllowed บน AppUpdateInfo object
หากต้องการ flexible update ใช้ startFlexibleUpdate รันในเบื้องหลัง คล้าย immediate update method คืนค่า AppUpdateResult enum ด้วย
หากในสถานการณ์นี้ update สำเร็จ เราต้องเรียก completeFlexibleUpdate เพื่อติดตั้งอัปเดตให้แอปพลิเคชัน
ดังนั้น หากเราดู code snippet ข้างบนและเพิ่ม logic สำหรับ update types ต่างๆ จะเป็นแบบนี้:
InAppUpdate.checkForUpdate().then((updateInfo) {
if (updateInfo.updateAvailability == UpdateAvailability.updateAvailable) {
if (updateInfo.immediateUpdateAllowed) {
// Perform immediate update
InAppUpdate.performImmediateUpdate().then((appUpdateResult) {
if (appUpdateResult == AppUpdateResult.success) {
// App Update successful
}
});
} else if (updateInfo.flexibleUpdateAllowed) {
// Perform flexible update
InAppUpdate.startFlexibleUpdate().then((appUpdateResult) {
if (appUpdateResult == AppUpdateResult.success) {
// App Update successful
InAppUpdate.completeFlexibleUpdate();
}
});
}
}
});
วิธีใช้ Package Upgrader
ต่างจากตัวเลือกแรก ตัวนี้เสนอโซลูชันสำหรับ iOS และ Android ทั้งคู่ มันขึ้นอยู่กับการเก็บข้อมูลจาก store และตรวจสอบกับข้อมูลปัจจุบันจากแอปพลิเคชันเอง
แทนที่จะมี API query data package นี้มี widgets ที่ทำ logic ภายใต้ฝาผืน
วิธีตั้งค่า Package
ก่อนอื่น เพิ่ม package ใน pubspec.yaml:
dependencies:
flutter:
sdk: flutter
upgrader: ^5.0.0
จากนั้น pub get
ภายในแอปพลิเคชัน ที่คุณตั้งใจจะทำ logic จัดการ in app updates เพิ่ม import:
import 'package:upgrader/upgrader.dart';
ความแตกต่างหลักระหว่างสองตัวเลือกนี้คือแค่ UI เลย เลือกตัวที่เหมาะสมที่สุดสำหรับคุณ
เพื่อรวม package นี้ คุณต้อง wrap body widget ด้วย UpgradeAlert หรือ UpgradeCard ตัวอย่างด้านล่าง:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: applicationName,
home: UpgradeAlert( /// <------------------
child: MainPage(
key: Key("YOUR_KEY"),
title: applicationName
),
),
);
}
}
หากมีเวอร์ชันใหม่ของแอปพลิเคชันใน store คุณจะเห็น:
เพื่อทดสอบ ให้เพิ่ม:
await Upgrader.clearSavedSettings()
ภายใน main method ใน main.dart
เพื่อความทราบ มี configurations 多く ที่คุณตั้งค่าได้สำหรับ Upgrader package ผมแนะนำให้ไปเช็คออก
วิธีทดสอบ Packages
ไม่ว่าคุณจะเลือก package ไหน คุณต้องรู้ว่า logic ทำงานถูกต้อง
แต่ทำอย่างไรโดยไม่ release official version? คุณสามารถใช้ internal testing option ใน Google Play Console ด้วยการ release เวอร์ชันใหม่ให้ internal testers มันจะไม่ใช่ public release และจะให้คุณทดสอบ upgrading functionality
นี่คือสิ่งที่คุณต้องทำ:
- Login Google Play Console และเข้าแอปพลิเคชันที่คุณกำลังทำงานเพื่อ updating logic
- Under Setup → Internal App Sharing, ไป Manage Testers และรับรองว่า allow testers ดาวน์โหลดและติดตั้ง shared application คุณเลือกได้ว่าผ่าน link หรือ email
- ไปที่ Testing → Internal Testing และคลิก Create new release button (มุมขวาบน)
- หลังจาก release แล้ว กลับไปหน้า Internal Testing หลัก และคลิกแท็บ Testers จะเห็นรายการ tester emails (ว่างอยู่) คลิกไอคอนลูกศรสีน้ำเงิน
- ในหน้านี้ คุณเพิ่มตัวเองเป็น internal tester (ใน Add email addresses)
- เมื่อเสร็จ กลับไปหน้า Internal Testing เลื่อนลงล่าง จะเห็น How testers join your test และปุ่ม Copy link
คุณกดปุ่มและส่งลิงก์ให้ตัวเอง เพื่อดาวน์โหลดเวอร์ชันใหม่ของแอปพลิเคชัน
หากคุณล้มเหลวในขั้นตอนใดขั้นตอนหนึ่ง ลิงก์ที่สร้างจะนำไป error 404:
หากทำทุกอย่างสำเร็จ คุณจะเห็นดังนี้เมื่อคลิกลิงก์ที่สร้าง:
หากเห็น error นี้:
_Install Error(-6): The download/install is not allowed, due to the current device state (e.g. low battery, low disk space, …). (https://developer.android.com/reference/com/google/android/play/core/install/model/InstallErrorCode#ERROR_INSTALL_NOT_ALLOWED)
อาจหมายถึงคุณรันบน emulator และต้องมี Google Play Store ติดตั้งและ login
สรุป
ผมเขียนบทความนี้เพราะผมต้องผ่านกระบวนการเดียวกันเมื่อรวม in app update package กับแอปของตัวเอง
ยินดีต้อนรับให้เช็คที่ Google Play Store:
และดูซอร์สโค้ดทั้งหมดที่นี่:
ขอบคุณที่อ่าน!
เรียนรู้การเขียนโค้ดฟรี หลักสูตรโอเพนซอร์สของ freeCodeCamp ช่วยให้ผู้คนมากกว่า 40,000 คนได้งานเป็นนักพัฒนา เริ่มต้นเลยวันนี้