iPadOS คือระบบปฏิบัติการของ Apple สำหรับ iPad ที่แยกออกจาก iOS ในปี 2019 การพัฒนาสำหรับ iPad คำนึงถึงความสามารถพิเศษ: การทำงานหลายอย่างพร้อมกันแบบ Split View และ Stage Manager, การป้อนข้อมูล Apple Pencil แบบหน่วงเวลาต่ำ และ Safari สำหรับเดสก์ท็อป
ประเด็นสำคัญ
iPadOS คือระบบปฏิบัติการของ Apple สำหรับ iPad ที่เปิดตัวครั้งแรกในปี 2019 ในฐานะสาขาหนึ่งของ iOS (เวอร์ชัน 13) ก่อนหน้านี้ iPad ใช้ iOS เดียวกับ iPhone การแยก iPadOS ทำให้ Apple สามารถแนะนำฟีเจอร์เฉพาะสำหรับหน้าจอขนาดใหญ่: การทำงานหลายอย่างพร้อมกัน, Safari สำหรับเดสก์ท็อป, การลากและวาง และการรองรับจอภาพภายนอก
iPadOS รักษาความเข้ากันได้อย่างสมบูรณ์กับแอป iOS: แอป iPhone ใดๆ ก็สามารถทำงานบน iPad ในโหมดปรับขนาดได้ อย่างไรก็ตาม ประสบการณ์ผู้ใช้ที่มีคุณภาพจำเป็นต้องมีการปรับเปลี่ยน: การใช้ Size Classes, UISplitViewController และการรองรับแป้นพิมพ์ลัด ตามข้อมูลของ Apple (WWDC 2025) 80% ของเวลาบน iPad ผู้ใช้ใช้ไปกับเวอร์ชันที่ปรับแต่งสำหรับแท็บเล็ต ไม่ใช่เวอร์ชันที่ปรับขนาด
iPadOS 13 (2019) นำเสนอ Slide Over และ Split View iPadOS 14 (2020) เพิ่ม Apple Pencil Scribble และอินเทอร์เฟซแบบกะทัดรัด iPadOS 15 (2021) นำเสนอ Quick Note และการปรับปรุงการทำงานหลายอย่างพร้อมกัน iPadOS 16 (2022) นำ Stage Manager และการรองรับจอภาพภายนอก iPadOS 17 (2023) เพิ่มวิดเจ็ตแบบโต้ตอบและการปรับแต่งหน้าจอล็อก
| เวอร์ชัน iPadOS | ปี | นวัตกรรมสำคัญ |
|---|---|---|
| iPadOS 13 | 2019 | Slide Over, Split View, Safari สำหรับเดสก์ท็อป |
| iPadOS 14 | 2020 | Scribble สำหรับ Apple Pencil, การโทรแบบกะทัดรัด |
| iPadOS 15 | 2021 | Quick Note, ตัวจัดการการทำงานหลายอย่างพร้อมกันที่ปรับปรุงแล้ว |
| iPadOS 16 | 2022 | Stage Manager, จอภาพภายนอก 6K |
| iPadOS 17 | 2023 | วิดเจ็ตแบบโต้ตอบ, หน้าจอล็อก |
| iPadOS 18 | 2024 | เครื่องคิดเลข Math Notes, Smart Script |
iPadOS ใช้เคอร์เนล XNU และ Darwin เดียวกับ iOS แต่ใช้เชลล์ UIKit ที่ปรับเปลี่ยนเพื่อรองรับหลายหน้าต่างและขนาดหน้าจอตามต้องการ ความแตกต่างทางสถาปัตยกรรมที่สำคัญคือการรองรับ UIScene ซึ่งนำเสนอใน iOS 13
ใน iPadOS แต่ละหน้าต่าง (รวมถึงใน Split View) คือ UISceneSession ที่แยกจากกันโดยมีวงจรชีวิตของตัวเอง ต่างจาก iPhone ที่แอปหนึ่งมี UIWindowScene เดียว บน iPad แอปหนึ่งสามารถมี UIScene หลายอัน (หลายหน้าต่าง, Slide Over, Stage Manager) SceneDelegate จัดการสถานะของแต่ละหน้าต่างอย่างอิสระ
import UIKit
import SwiftUI
/// SceneDelegate สำหรับรองรับหลายหน้าต่างบน iPadOS
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var splitVC: UISplitViewController?
func scene(_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
// การสร้าง UISplitViewController สำหรับการนำทางบนแท็บเล็ต
let splitVC = UISplitViewController(style: .tripleColumn)
splitVC.primaryBackgroundStyle = .sidebar
let sidebar = SidebarViewController()
let primary = PrimaryViewController()
let detail = DetailViewController()
splitVC.viewControllers = [sidebar, primary, detail]
let window = UIWindow(windowScene: windowScene)
window.rootViewController = splitVC
window.makeKeyAndVisible()
self.window = window
}
// การปรับเปลี่ยนเมื่อขนาดหน้าต่างเปลี่ยน (Split View)
func windowScene(_ windowScene: UIWindowScene,
didUpdate previousCoordinateSpace: UICoordinateSpace,
interfaceOrientation previousOrientation: UIInterfaceOrientation) {
let isMultitasking = windowScene.traitCollection.horizontalSizeClass == .compact
print("iPadOS multitasking mode: \(isMultitasking ? "compact" : "regular")")
}
}UISplitViewController ในสไตล์ .tripleColumn แสดงสามคอลัมน์พร้อมกัน: แถบด้านข้าง (การนำทาง), หลัก (รายการ) และรายละเอียด (เนื้อหา) เมื่อเปลี่ยนไปใช้โหมดกะทัดรัด (Split View กับแอปอื่น) UIKit จะยุบคอลัมน์ลงในสแต็กการนำทางโดยอัตโนมัติ นักพัฒนาไม่ต้องจัดการพฤติกรรมนี้ด้วยตนเอง — UIKit ปรับเค้าโครงผ่าน traitCollection
iPadOS มีให้: การรองรับพื้นที่จัดเก็บภายนอกผ่าน Files (USB-C/Thunderbolt), โหมดเทอร์มินัล Safari พร้อมการตรวจสอบองค์ประกอบ, แป้นพิมพ์ลัดผ่าน UIKeyCommand, ตัวจัดการดาวน์โหลดของระบบ, การลากและวางระหว่างแอป และ Picture in Picture พร้อมหน้าต่างที่ปรับขนาดได้
การทำงานหลายอย่างพร้อมกัน คือฟีเจอร์สำคัญของ iPadOS ที่ทำให้แตกต่างจาก iOS โดยพื้นฐาน ผู้ใช้สามารถทำงานพร้อมกันกับหลายแอปบนหน้าจอเดียว นักพัฒนาต้องมั่นใจว่าแอปทำงานได้อย่างถูกต้องในทุกโหมดการทำงานหลายอย่างพร้อมกัน
Split View แบ่งหน้าจอ iPad ระหว่างสองแอปในอัตราส่วน 50/50 หรือ 33/67 แต่ละแอปจะได้รับ UISceneSession ของตัวเองพร้อมหน่วยความจำและวงจรชีวิตของตัวเอง เมื่อความกว้างของหน้าจอน้อยกว่า 600 จุด UIKit จะบังคับให้แอปเปลี่ยนเป็น size class แนวนอนแบบกะทัดรัด แอปต้องจัดการการเปลี่ยนแปลงนี้อย่างถูกต้อง
Slide Over คือหน้าต่างลอยเหนือแอปที่ทำงานอยู่ (กว้าง 320 จุด) แอปใน Slide Over จะเปลี่ยนเป็น size class แนวนอนแบบกะทัดรัด (.compact) สิ่งสำคัญคือการปรับอินเทอร์เฟซให้เหมาะสมสำหรับหน้าจอแคบ ใน Slide Over แอปสามารถเรียกใช้ได้โดยการปัดจากขอบขวาหรือผ่าน Dock ผู้ใช้สามารถลาก Slide Over ไปยัง Split View หรือปัดไปทางขวาเพื่อปิด
Stage Manager (iPadOS 16+, M1 ขึ้นไป) คือตัวจัดการหน้าต่างที่อนุญาตให้สร้างหน้าต่างที่ซ้อนทับกันในขนาดที่กำหนดเองได้ รองรับสูงสุด 4 หน้าต่างบนหน้าจอ iPad และสูงสุด 4 บนจอภาพภายนอก (รวม 8) แอปจะได้รับเหตุการณ์ UISceneWillConnectNotification สำหรับแต่ละหน้าต่างใหม่ Stage Manager เปลี่ยนกฎวงจรชีวิต: หน้าต่างในพื้นหลังจะไม่ถูกแช่แข็ง แต่ยังคงทำงานด้วยทรัพยากรที่จำกัด
| โหมด | จำนวนหน้าต่าง | ขนาดหน้าต่าง | Size Class |
|---|---|---|---|
| เต็มหน้าจอ | 1 | 100% ของหน้าจอ | Regular |
| Split View 50/50 | 2 | 50% ของหน้าจอ | Regular (iPad Pro 12.9) หรือ Compact |
| Split View 33/67 | 2 | 33% / 67% | Compact สำหรับ 33% |
| Slide Over | 1 + ลอย | 320 pt | Compact |
| Stage Manager | 1–4 | กำหนดเอง | ขึ้นอยู่กับขนาด |
Apple Pencil คือสไตลัสแอคทีฟของ Apple ที่รองรับการเอียง แรงกด และการตรวจจับ hover (iPad Pro M2+) ความหน่วงระหว่างการเคลื่อนที่ของปากกาและการแสดงหมึกคือ 9–20 มิลลิวินาที ขึ้นอยู่กับรุ่น PencilKit เป็นเฟรมเวิร์กหลักสำหรับการรวมการวาดภาพเข้ากับแอป
PKCanvasView มีพื้นผิวการวาดภาพพร้อมใช้งานที่รองรับหมึก ดินสอ ปากกามาร์กเกอร์ และยางลบ PKToolPicker คือแผงเลือกเครื่องมือ นักพัฒนาไม่ต้องเรนเดอร์ลายเส้น — PencilKit ทำด้วยการเร่งด้วยฮาร์ดแวร์ผ่าน Metal shader การปรับแต่งสี ความหนา และความทึบของปากกามีให้ใช้งาน
import PencilKit
import UIKit
class DrawingViewController: UIViewController {
private lazy var canvasView: PKCanvasView = {
let canvas = PKCanvasView()
canvas.tool = PKInkingTool(.pen, color: .black, width: 5)
canvas.delegate = self
canvas.drawingPolicy = .anyInput
canvas.backgroundColor = .white
return canvas
}()
private lazy var toolPicker: PKToolPicker = {
let picker = PKToolPicker()
picker.addObserver(canvasView)
picker.setVisible(true, forFirstResponder: canvasView)
return picker
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(canvasView)
canvasView.frame = view.bounds
canvasView.becomeFirstResponder()
toolPicker.addObserver(canvasView)
}
// บันทึกภาพวาดใน PKDrawing (รูปแบบไบนารี)
func saveDrawing() {
let drawingData = canvasView.drawing.dataRepresentation()
let url = FileManager.default.urls(
for: .documentDirectory, in: .userDomainMask
)[0].appendingPathComponent("drawing.drawing")
try? drawingData.write(to: url)
}
}
extension DrawingViewController: PKCanvasViewDelegate {
func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {
print("Canvas changed: \(canvasView.drawing.strokes.count) strokes")
}
}PKCanvasView ที่มี drawingPolicy .anyInput รับทั้งการป้อนข้อมูลจาก Apple Pencil และนิ้ว PKToolPicker ให้ผู้ใช้เลือกเครื่องมือโดยไม่ต้องเขียนอินเทอร์เฟซที่กำหนดเอง PKDrawing ถูกจัดเก็บในรูปแบบไบนารีที่มีการบีบอัดสูง — การวาดภาพหนึ่งชั่วโมงใช้พื้นที่ประมาณ 5–10 MB
Scribble (iPadOS 14+) อนุญาตให้เขียนด้วยลายมือใน UITextField และ UITextView ใดๆ ระบบรู้จำลายมือบนอุปกรณ์โดยใช้ Neural Engine โมเดล ML ทำงานกับอักษรละตินและซีริลลิก ใน iOS 17+ Scribble รองรับการแก้ไขอัตโนมัติและการทำนายคำถัดไป นักพัฒนาไม่ต้องเพิ่มโค้ด — Scribble ทำงานอัตโนมัติเมื่อมีฟิลด์ป้อนข้อมูล
ตั้งแต่ iPadOS 17.4 และ Apple Pencil Pro นักพัฒนาจะได้รับ เหตุการณ์ hover เมื่อสไตลัสเข้าใกล้หน้าจอ (สูงสุด 12 มม.) เหตุการณ์ประกอบด้วยตำแหน่ง แรง และมุมทิศทาง การใช้งาน: การแสดงตัวอย่างจุดสัมผัสของพู่กันในแอปวาดภาพ การแสดงตัวอย่างเครื่องมือ ข้อเสนอแนะทางภาพก่อนสัมผัส
อินเทอร์เฟซแบบปรับเปลี่ยนได้ คือข้อกำหนดบังคับสำหรับแอป iPad iPad ทำงานในขนาดหน้าจอที่แตกต่างกัน (8.3"–13") และโหมดการทำงานหลายอย่างพร้อมกัน UIKit มี Size Classes (แนวนอน: .regular/.compact, แนวตั้ง: .regular/.compact) และ UISplitViewController สำหรับการปรับเปลี่ยนอัตโนมัติ
Size Classes คือนามธรรมที่กำหนดพื้นที่ว่าง บน iPad ในโหมดเต็มหน้าจอ แกนทั้งสองเป็น .regular ใน Split View (50%) คลาสแนวนอนสามารถเป็น .compact บน iPad mini หรือ iPad Air เค้าโครงยอดนิยมทั้งหมดที่สร้างด้วย Auto Layout และ UICollectionViewCompositionalLayout จะปรับเปลี่ยนโดยอัตโนมัติ การปรับเปลี่ยนแบบกำหนดเองทำได้โดยการแทนที่ traitCollectionDidChange
import SwiftUI
/// เค้าโครงแบบปรับเปลี่ยนได้สำหรับ iPad โดยใช้ Size Classes
struct AdaptiveContentView: View {
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
@Environment(\.verticalSizeClass) private var verticalSizeClass
var body: some View {
if horizontalSizeClass == .regular && verticalSizeClass == .regular {
// โหมดแท็บเล็ต: แถบด้านข้าง + เนื้อหา
NavigationSplitView {
SidebarView()
} detail: {
ContentGridView()
}
} else {
// โหมดกะทัดรัด: การนำทางแบบสแต็ก
NavigationStack {
ContentGridView()
}
}
}
}
/// ตัวอย่างกริดแบบปรับเปลี่ยนได้: 3 คอลัมน์บน iPad, 2 บน iPhone
struct ContentGridView: View {
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
private var columns: [GridItem] {
let count = horizontalSizeClass == .regular ? 3 : 2
return Array(repeating: GridItem(.flexible(), spacing: 16), count: count)
}
var body: some View {
ScrollView {
LazyVGrid(columns: columns, spacing: 16) {
ForEach(items) { item in
ItemCard(item: item)
}
}
.padding()
}
}
}ในตัวอย่าง NavigationSplitView ใช้เมื่อ horizontalSizeClass == .regular (iPad เต็มหน้าจอ) เท่านั้น NavigationStack ใช้ในโหมดกะทัดรัด จำนวนคอลัมน์กริด (3 เทียบกับ 2) ก็เปลี่ยนแปลงตาม Size Classes ทุกอย่างอัปเดตโดยอัตโนมัติเมื่อโหมดการทำงานหลายอย่างพร้อมกันเปลี่ยนไป
UIKit มี UISplitViewController สามสไตล์: .doubleColumn (แถบด้านข้าง + รายละเอียด), .tripleColumn (แถบด้านข้าง + หลัก + รายละเอียด) และ .single ใน iPadOS 16+ splitViewController จะสลับระหว่างสไตล์โดยอัตโนมัติเมื่อ size class เปลี่ยนไป นักพัฒนากำหนด viewControllers สำหรับแต่ละคอลัมน์ UIKit จัดการการมองเห็น
iPadOS SDK รวมเฟรมเวิร์ก iOS ทั้งหมดตลอดจน API ที่มีเฉพาะบน iPad เท่านั้น ด้านล่างคือความสามารถหลักเฉพาะของ iPad
iPadOS รองรับการลากและวางระหว่างแอปและภายในแอป UIDragInteraction และ UIDropInteraction อนุญาตให้ลากข้อความ รูปภาพ ไฟล์ และวัตถุที่กำหนดเอง การลากและวางทำงานพร้อมกันกับระบบสัมผัสหลายจุด: ผู้ใช้สามารถลากหลายรายการด้วยนิ้วต่างๆ ใน SwiftUI จะใช้ตัวปรับแต่ง .onDrag และ .onDrop
เมื่อเชื่อมต่อแป้นพิมพ์ (Magic Keyboard, Smart Keyboard) UIKeyCommand อนุญาตให้เพิ่มแป้นพิมพ์ลัด ใน iPadOS 17+ แป้นพิมพ์ลัดจะแสดงเมื่อกด Cmd ค้างไว้ Apple แนะนำให้รองรับชุดค่าผสมมาตรฐาน: ⌘C (คัดลอก), ⌘V (วาง), ⌘F (ค้นหา), ⌘N (เอกสารใหม่)
iPadOS 17+ รองรับจอภาพภายนอกที่มีความละเอียดดั้งเดิมสูงสุด 6K (Pro Display XDR) แอปสามารถแสดงเนื้อหาบนหน้าจอภายนอกผ่าน UIWindowScene ที่มีตัวระบุเซสชันแยกต่างหาก Stage Manager อนุญาตให้วางสูงสุด 4 หน้าต่างบนจอภาพภายนอกด้วยขนาดที่ปรับได้
| API | วัตถุประสงค์ | มีใน iOS |
|---|---|---|
| UISplitViewController | การนำทางหลายคอลัมน์ | ใช่ |
| PencilKit | การวาดภาพด้วย Apple Pencil | ไม่ |
| UIDragInteraction | การลากและวาง | ใช่ (เฉพาะในแอป) |
| UIKeyCommand | แป้นพิมพ์ลัด | ใช่ (เฉพาะแป้นพิมพ์ภายนอก) |
| UIScene | โหมดหลายหน้าต่าง | ใช่ (เฉพาะ iPad) |
| UIPencilInteraction | การแตะสองครั้ง Apple Pencil | ไม่ |
| PDFKit | การดูและคำอธิบายประกอบ PDF | ใช่ |
การพัฒนาสำหรับ iPadOS ต้องใช้แนวทางพิเศษในด้าน UI/UX ประสิทธิภาพและการทดสอบ ข้อผิดพลาดที่ให้อภัยได้บน iPhone จะกลายเป็นเรื่องสำคัญบน iPad เนื่องจากหน้าจอที่ใหญ่ขึ้นและการทำงานหลายอย่างพร้อมกัน
iPad ใช้ชิปซีรีส์ M (M1, M2, M4) ที่มีหน่วยความจำแบบรวมสูงสุด 16 GB แม้จะมีฮาร์ดแวร์ที่ทรงพลัง แต่แอปใน Split View หรือ Slide Over จะแชร์ทรัพยากรกับแอปอื่น แรงดันหน่วยความจำ สูงกว่าบน iPhone ใช้การบีบอัดภาพ การโหลดคอลเลกชันแบบ Lazy และการสร้างโปรไฟล์ผ่าน Instruments Allocations iPad Pro M4 ที่มี 16 GB สามารถเรียกใช้แอประดับเดสก์ท็อป (Final Cut Pro, Logic Pro)
ผู้ใช้ iPad ส่วนใหญ่ใช้แป้นพิมพ์ภายนอก อินเทอร์เฟซควรสามารถนำทางด้วยแป้นพิมพ์ได้อย่างสมบูรณ์: Tab สำหรับนำทางระหว่างฟิลด์, Space สำหรับเปิดใช้งานองค์ประกอบที่เลือก, Enter สำหรับยืนยัน เพิ่มการรองรับ Full Keyboard Access — การตั้งค่าระบบที่อนุญาตให้ควบคุมองค์ประกอบอินเทอร์เฟซใดๆ ด้วยแป้นพิมพ์
โปรแกรมจำลอง iPad ไม่สามารถจำลองพฤติกรรมการทำงานหลายอย่างพร้อมกันได้อย่างสมบูรณ์ ทดสอบบนอุปกรณ์จริงในโหมดต่างๆ: Split View กับแอปที่หนัก (Safari ที่มี 20 แท็บ), Stage Manager ที่มี 4 หน้าต่าง, Slide Over ที่มีการสลับแอปอย่างรวดเร็ว ตรวจสอบสถานการณ์: ผู้ใช้เปิดแอปจาก Slide Over ลากไปยัง Split View เปลี่ยนขนาด ปิด — แอปไม่ควรค้าง
// ตรวจสอบโหมดการทำงานหลายอย่างพร้อมกันปัจจุบันบน iPadOS
- (void)checkMultitaskingMode:(UIWindowScene *)scene {
if (scene.traitCollection.userInterfaceIdiom != UIUserInterfaceIdiomPad) {
return;
}
BOOL isFullScreen = (scene.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular &&
scene.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular);
BOOL isSlideOver = (CGRectGetWidth(scene.coordinateSpace.bounds) == 320.0);
if (scene.windows.first?.windowScene?.activationConditions.canBecomeFocused == YES) {
NSLog(@"Stage Manager ทำงานอยู่");
}
if (isSlideOver) {
NSLog(@"โหมด Slide Over");
} else if (isFullScreen) {
NSLog(@"โหมดเต็มหน้าจอ");
} else {
NSLog(@"โหมด Split View");
}
}คำถามที่พบบ่อย
iPadOS มีการทำงานหลายอย่างพร้อมกันแบบขยาย (Split View, Slide Over, Stage Manager), การรองรับ Apple Pencil พร้อมการตรวจจับ hover, Safari สำหรับเดสก์ท็อปพร้อมตัวจัดการดาวน์โหลด, จอภาพภายนอกที่มีความละเอียดดั้งเดิม และระบบไฟล์ Files ที่สามารถเข้าถึงไดรฟ์ภายนอกผ่าน USB-C
Split View รองรับโดยอัตโนมัติหากแอปใช้ UISplitViewController แอปต้องจัดการการเปลี่ยนแปลง size class อย่างถูกต้อง: เมื่อเปลี่ยนไปใช้โหมดกะทัดรัด ให้ใช้ UINavigationController สำหรับสแต็กหน้าจอ หากต้องการปฏิเสธ Split View อย่างชัดเจน ให้ระบุ UIRequiresFullScreen = YES ใน Info.plist
ใช้ PencilKit: PKCanvasView สำหรับพื้นผิวการวาดภาพและ PKToolPicker สำหรับการเลือกเครื่องมือ สำหรับการจัดการป้อนข้อมูลสไตลัสแบบกำหนดเอง — UIEvent ชนิด .hover และ UIPencilInteraction สำหรับการแตะสองครั้ง ความหน่วงของ Apple Pencil Pro คือ 9 มิลลิวินาที, รุ่นก่อนหน้า — 20 มิลลิวินาที
iPad mini 8.3" (2266×1488), iPad Air 10.9" (2360×1640), iPad Pro 11" (2388×1668), iPad Pro 13" M4 (2752×2064) ใช้ Size Classes และ Auto Layout สำหรับการปรับเปลี่ยน จอภาพภายนอกสูงสุด 6K ผ่าน Thunderbolt Stage Manager รองรับสูงสุด 8 หน้าต่าง (4 บน iPad + 4 บนจอภาพภายนอก)
iPadOS 17+ รองรับจอภาพภายนอกผ่าน USB-C/Thunderbolt ที่มีความละเอียดดั้งเดิมสูงสุด 6K แอปสามารถแสดงเนื้อหาบนจอภาพภายนอกผ่าน UIWindowScene ที่แยกต่างหากซึ่งมีวงจรชีวิตของตัวเอง Stage Manager รองรับสูงสุด 4 หน้าต่างบนจอภาพภายนอก
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ