Tạo app iPhone với Claude Code: hướng dẫn từng bước
Bởi Mehdi Azizi
Cập nhật ngày , 15 phút
Cài Claude Code, tạo dự án Expo, viết CLAUDE.md, prompt từng màn hình rồi đẩy lên TestFlight bằng EAS: hướng dẫn đầy đủ từ A đến Z.
Tạo app với Claude Code: câu trả lời ngắn
Để tạo app với Claude Code, bạn cần quyền truy cập Claude Code trả phí (gói đăng ký tương thích hoặc Console tính theo mức dùng), Node.js, một chiếc iPhone có Expo Go và một dự án Expo. Bạn viết file CLAUDE.md mô tả stack và các quy tắc của mình, yêu cầu từng màn hình một, test từng màn hình trên iPhone, rồi gửi app lên TestFlight bằng EAS.
Bài hướng dẫn này bổ sung cho bài tạo app iOS bằng AI của mình, nơi mình giải thích AI làm tốt gì và làm hỏng gì. Ở đây, mình đi vào thực hành: lệnh, file, prompt.
Ngày nào mình cũng code app iOS bằng Claude Code và Cursor. Stack của mình: React Native, Expo, EAS, RevenueCat và Supabase. Solys, một app báo thức kèm mini-game, và TradaZen, một app luyện tập trading, đều đã lên App Store. Nolera và Clic từng bị Apple từ chối, rồi được sửa lại. Mọi thứ dưới đây đều rút ra từ quá trình đó.
Muốn xem phương pháp này áp dụng vào một app đã phát hành, mình có ghi lại hành trình của TradaZen, từ commit đầu tiên đến những lần bị Apple từ chối và những lần đổi hướng. Bài chia sẻ kinh nghiệm đó bổ sung cho các bước trong hướng dẫn này.
Bước 1: chuẩn bị đủ điều kiện
Trước lệnh đầu tiên, hãy kiểm tra xem bạn đã có đủ những thứ này chưa.
Một tài khoản Claude trả phí
Claude Code không có trong gói miễn phí của claude.ai. Theo tài liệu của Anthropic, bạn cần tài khoản Pro, Max, Team, Enterprise hoặc Console. Gói Pro đủ để bắt đầu, trong giới hạn sử dụng của nó.
Node.js và một terminal
Expo yêu cầu Node.js bản LTS, trên macOS, Windows hoặc Linux. Claude Code chạy trên macOS 13 trở lên, Windows 10 trở lên và các bản phân phối Linux phổ biến.
Một iPhone và Expo Go
Cài Expo Go từ App Store trên iPhone để thử các màn hình đầu tiên mà không cần build app riêng. Trước khi tạo dự án, hãy kiểm tra phiên bản SDK tương thích với bản cài của bạn trên trang Expo Go. SDK mới nhất và phiên bản phát hành trên App Store không phải lúc nào cũng có cùng lúc: Expo từng ghi nhận độ lệch này vào tháng 5 năm 2026. Vì vậy đừng dựa vào số phiên bản lấy từ một bài hướng dẫn cũ. Nếu muốn dùng module native riêng, hãy chuẩn bị một bản development build.
Có cần Mac không? Không bắt buộc
Các bản build iOS được biên dịch trên server của Expo bằng EAS Build, với phiên bản Xcode do SDK Expo của bạn chọn (ITMS-90725), và EAS Submit chạy được trên macOS, Linux và Windows. Nghĩa là bạn có thể đi đến tận TestFlight chỉ với một chiếc PC. Bài phát hành app iOS không cần Mac trình bày chi tiết chuỗi này.
Tài khoản Apple Developer, để sau
Bạn chưa cần nó để code và test trong Expo Go tải từ App Store. Nó chỉ bắt buộc khi bạn gửi app lên TestFlight. Mình sẽ nói lại ở bước 7.
Bước 2: cài Claude Code
Trên macOS, Linux hoặc WSL, cách Anthropic khuyên dùng là trình cài đặt native:
curl -fsSL https://claude.ai/install.sh | bash
Trên Windows, trong PowerShell:
irm https://claude.ai/install.ps1 | iex
Sau đó kiểm tra xem cài đặt đã thành công chưa:
claude --version
Nếu bạn thích npm hơn, lệnh là npm install -g @anthropic-ai/claude-code. Đừng thêm sudo phía trước, tài liệu ghi rõ là không nên.
Lần đầu chạy claude, trình duyệt sẽ mở ra để bạn đăng nhập tài khoản. Sau đó bạn cứ viết bằng tiếng Việt: Claude đọc file của bạn, đề xuất thay đổi và chạy lệnh, khi bạn đồng ý.
Bước 3: tạo dự án Expo
Vào thư mục bạn hay để dự án và chạy:
npx create-expo-app@latest mon-app
cd mon-app
npx expo start
Nếu công cụ hỏi bạn chọn giữa tương thích với Expo Go trên App Store và SDK mới nhất, hãy chọn tương thích cho bài tập này. Dù thế nào, hãy kiểm tra phiên bản vừa tạo có được Expo Go trên iPhone của bạn hỗ trợ không trước khi đi tiếp. Khi dự án cần, bạn có thể chuẩn bị một bản development build.
Một mã QR hiện ra trong terminal. Quét nó bằng camera iPhone: app sẽ mở trong Expo Go. Có một chi tiết hay làm kẹt lần đầu: Expo Go chỉ mở dự án của bạn nếu Expo CLI và Expo Go đăng nhập cùng một tài khoản Expo. Chạy npx expo login trên máy tính và đăng nhập cùng tài khoản đó trong app.
Sao lại chọn Expo thay vì Swift? Claude rất rành React Native, và bạn test được mà không cần Mac. Mình giải thích lựa chọn này ở trang React Native và Expo cho app mobile.
Hãy nhớ một giới hạn của Expo Go: nó chỉ chứa những module native đã có sẵn bên trong. Ngay khi bạn thêm một thư viện native mà nó không biết, ví dụ mua hàng trong app, bạn sẽ cần một bản development build. Với mấy màn hình đầu tiên thì không thành vấn đề.
Chọn đúng môi trường test
Expo Go, development build và TestFlight không chứng minh cùng một điều. Expo mô tả development build là app test của riêng bạn, kèm các module native mà dự án cần.
| Điều bạn muốn kiểm tra | Test ở đâu | Giới hạn của bài test |
|---|---|---|
| Hiển thị màn hình đầu tiên và thử điều hướng | Expo Go, với SDK tương thích | Hành vi của các module native không có trong Expo Go |
| Dùng một thư viện native mới thêm vào dự án | Một bản development build có chứa thư viện đó | Phiên bản phát hành và việc Apple có chấp nhận hay không |
| Duyệt app dành cho tester, rồi test mua hàng | Một bản build gửi lên TestFlight và các sản phẩm được cấu hình đúng | Thanh toán thật của khách hàng hoặc việc duyệt để mở bán |
Trước khi thêm một dependency, hãy hỏi Claude: “Nó có tương thích với SDK và môi trường test hiện tại của tôi không? Có cần build lại app không? Hãy dựa câu trả lời vào tài liệu.” Bạn sẽ tránh được một buổi tối ngồi sửa một module mà Expo Go đơn giản là không tải được, hoặc một SDK bị từ chối lúc gửi vì API không công khai.
Bước 4: viết file CLAUDE.md cho dự án
Đây là bước đáng công nhất. Claude Code có thể giữ bộ nhớ dự án, nhưng bạn phải nói rõ các quy tắc. File CLAUDE.md, đặt ở thư mục gốc dự án, mang lại chỉ dẫn chung cho mọi phiên làm việc. Đó là nơi bạn viết những gì Claude không thể tự đoán.
Trong thư mục dự án, chạy claude, rồi gõ /init. Theo tài liệu, Claude phân tích dự án và tạo một CLAUDE.md đầu tiên với các lệnh và quy ước nó tìm thấy. Sau đó bạn bổ sung quy tắc của mình. Anthropic khuyên giữ dưới 200 dòng: file càng dài, chỉ dẫn càng ít được tuân theo.
Đây là một ví dụ ngắn, gần với cái mình đang dùng:
# App của tôi
## Stack
- Expo (SDK từ create-expo-app), React Native, TypeScript strict
- Điều hướng: Expo Router, mỗi màn hình một file trong app/
- Dữ liệu: Supabase (sau này), không bao giờ để khóa bí mật trong app
## Quy tắc
- Mỗi lần một màn hình. Không đụng vào file nằm ngoài yêu cầu.
- Không dùng chiều cao cố định bằng point: kích thước tương đối theo màn hình,
dùng ScrollView nếu nội dung có thể tràn.
- Mỗi màn hình xử lý 3 trạng thái: đang tải, trống, lỗi.
- Chữ trên giao diện bằng tiếng Việt có dấu.
- Trước khi code nhiều hơn 2 file: đề xuất kế hoạch và chờ tôi đồng ý.
## Lệnh
- Chạy: npx expo start
- Test: dùng đúng script thực sự có trong package.json.
Nếu chưa có, hãy báo; không được báo là test đã pass.
- Kiểu: npx tsc --noEmit
- Sau mỗi thay đổi: chạy test và kiểm tra kiểu, rồi cho tôi biết
cái gì đã thay đổi và cách kiểm tra trên iPhone.
Quy tắc về chiều cao cố định không phải ngẫu nhiên mà có. Mình sẽ nói lại ở bước 6.
Bước 5: prompt từng màn hình một
“Tạo cho tôi một app theo dõi thói quen có gói đăng ký” sẽ sinh ra một dự án khổng lồ, mong manh, không thể đọc lại nổi. Cách hiệu quả thì ngược lại: một yêu cầu, một màn hình, một kết quả bạn test được trong năm phút.
Bắt đầu bằng một kế hoạch
Với mọi thứ đụng đến nhiều file, hãy chuyển sang plan mode. Nhấn Shift+Tab cho đến khi thấy plan mode on trên thanh trạng thái. Ở chế độ này, Claude đọc file và đề xuất kế hoạch, nhưng không sửa gì trước khi bạn đồng ý. Bạn đọc lại, chỉnh sửa, rồi duyệt.
Prompt định hướng đầu tiên trông như thế này:
Tôi muốn một app theo dõi thói quen. Phiên bản 1: chỉ một chức năng,
đánh dấu các thói quen trong ngày. Hãy đề xuất danh sách màn hình và
cấu trúc thư mục. Chưa code gì cả.
Mô tả màn hình, các trạng thái và giới hạn của nó
Tiếp theo, mỗi màn hình một prompt. Bạn càng nêu rõ các trường hợp biên, Claude càng ít quên:
Tạo màn hình app/index.tsx liệt kê các thói quen trong ngày.
- Mỗi dòng: tên thói quen, ô đánh dấu, chuỗi ngày hiện tại.
- Trạng thái trống: một dòng chữ và nút “Thêm thói quen”.
- Trạng thái đang tải và trạng thái lỗi có nút “Thử lại”.
- Dữ liệu tạm thời lấy từ một mảng cục bộ.
- Phải vừa trên iPhone SE lẫn iPhone lớn nhất:
không có chiều cao cố định, danh sách cuộn được.
Chạy test và kiểm tra kiểu ở cuối.
Sửa mà không để nó viết lại mọi thứ
Khi một chi tiết chưa ổn, hãy nói chính xác và giới hạn phạm vi:
Trên iPhone của tôi, nút “Thêm thói quen” bị chìm dưới thanh dưới cùng
khi danh sách dài. Chỉ sửa đúng lỗi này trong app/index.tsx,
không đụng vào file khác. Giải thích nguyên nhân.
Bạn cũng có thể dán ảnh chụp màn hình vào terminal: Claude đọc được.
Bài tập: một thói quen vẫn được đánh dấu sau khi mở lại app
Đây là một bài tập để bạn làm trong dự án của mình, không phải ảnh chụp một tính năng đã hoàn thành. Mục tiêu là đi từ một màn hình được sinh ra đến một hành vi kiểm chứng được. Bài này không cần tài khoản người dùng hay mua hàng trong app.
- Giữ một thói quen cục bộ duy nhất tên là “Đọc sách 10 phút”.
- Yêu cầu một ô đánh dấu và cơ chế lưu cục bộ tương thích với dự án Expo của bạn.
- Yêu cầu agent nêu rõ các file đã sửa, dependency nếu có và các lệnh thực sự đã chạy.
- Cài hoặc mở app trên iPhone, rồi thực hiện các bước kiểm tra bên dưới.
Từ màn hình hiện có, hãy cho phép đánh dấu thói quen “Đọc sách 10 phút”
và giữ nguyên trạng thái sau khi đóng rồi mở lại app.
Dùng bộ lưu trữ cục bộ tương thích với các dependency của dự án.
Không tạo tài khoản, server, gói đăng ký hay thống kê nào thêm.
Trước khi code, giải thích cách bạn xử lý lúc tải và khi đọc hoặc
lưu bị lỗi. Sau đó, thực hiện một thay đổi có giới hạn.
Cuối cùng: các file đã đổi, lệnh đã chạy, giới hạn chưa test
và các bước chính xác để kiểm tra kết quả trên iPhone.
| Thao tác trên iPhone | Kết quả mong đợi | Nếu thất bại |
|---|---|---|
| Mở app lần đầu | Thói quen và ô đánh dấu hiện ra, không có lỗi | Kiểm tra trạng thái ban đầu và việc tải từ bộ lưu trữ |
| Đánh dấu rồi đóng và mở lại app | Thói quen vẫn được đánh dấu | Kiểm tra việc ghi rồi đọc cùng một key |
| Bỏ đánh dấu rồi mở lại | Thói quen vẫn ở trạng thái chưa đánh dấu | Kiểm tra giá trị false cũng được lưu |
| Làm lại quy trình ở chế độ máy bay | Chức năng cục bộ vẫn dùng được | Tìm dependency mạng bị thêm vào không có lý do |
| Tăng cỡ chữ | Tên và ô điều khiển vẫn dùng được | Bỏ các ràng buộc làm cắt chữ hoặc che mất thao tác |
Đừng yêu cầu “viết lại hết” nếu một dòng thất bại. Hãy mô tả thao tác, kết quả mong đợi và kết quả thực tế. Ví dụ: “Sau khi mở lại, ô bị trống trở lại dù tôi đã đánh dấu. Giải thích nguyên nhân và sửa phần lưu trạng thái mà không đổi thiết kế.”
Tải mẫu CLAUDE.md và phiếu kiểm tra (.md). Mở nó trong trình soạn thảo hoặc app ghi chú. Hãy điều chỉnh các lệnh cho hợp với dự án của bạn trước khi giao cho agent.
Bước 6: cho đọc lại và test
Claude Code viết code trông có vẻ đúng. Chỉ có test và chiếc iPhone của bạn mới cho biết nó có đúng thật không.
Test để không làm hỏng thứ đang chạy tốt
App càng lớn, mỗi yêu cầu càng dễ làm hỏng một màn hình đã ổn. Dự án do Expo tạo chưa có test: trước tiên hãy nhờ Claude cài Jest với jest-expo, như tài liệu của Expo khuyến nghị. Sau đó yêu cầu test cho phần logic quan trọng (tính chuỗi ngày, kiểm tra form) và cho chạy chúng sau mỗi thay đổi. Đó là lý do các lệnh test được ghi trong CLAUDE.md: Claude chạy chúng mà bạn không cần nhắc. Có file quy tắc và có test, AI sẽ ít làm hỏng những gì đang chạy hơn rất nhiều.
Đọc lại mỗi thay đổi
Bạn không cần hiểu từng dòng. Bạn cần biết file nào đã thay đổi, và tại sao. Nếu Claude đụng vào một file không liên quan, hãy hỏi lý do trước khi chấp nhận. Rồi đặt câu hỏi: “cái gì có thể hỏng ở đây?”.
Kiểm tra trên một iPhone nhỏ và một iPhone lớn
Đây là bài học khiến mình trả giá đắt nhất. Solys bị Apple từ chối theo quy tắc 2.1: không thể thắng bản demo trong onboarding trên iPad Air, nơi app chạy ở chế độ tương thích iPhone. Nguyên nhân: chiều cao được code cứng bằng point cố định, không tương đối theo kích thước màn hình. Trên iPhone của mình thì mọi thứ đều ổn. Code đã được đọc lại, test đều xanh. Không công cụ nào nhìn màn hình ở một kích thước khác.
Từ đó, mình kiểm tra mỗi màn hình ít nhất trên iPhone nhỏ nhất và iPhone lớn nhất. Nếu bạn chỉ có một điện thoại, simulator của Xcode trên Mac hoặc một người bạn dùng mẫu máy khác cũng được. Đặc biệt chú ý chữ dài, bàn phím mở trên các form và các nút ghim ở dưới cùng.
Những gì Claude Code làm chưa tốt
Claude Code rất giỏi với màn hình và logic. Ra ngoài thư mục của bạn, nó kém tin cậy hơn nhiều.
Ký app và chứng chỉ
Không có kết nối được cấp quyền vào tài khoản Apple của bạn, Claude không biết tình trạng của nó. Nó có thể bịa ra một quy trình chứng chỉ trộn lẫn Xcode và Expo. Hãy để EAS lo việc ký: tài liệu của Expo giải thích EAS CLI có thể tạo và lưu các file này cho bạn, sau khi kết nối với tài khoản Apple Developer.
App Store Connect
Trang thông tin app, các khai báo quyền riêng tư, ảnh chụp màn hình và các link pháp lý là dữ liệu cần kiểm tra trong App Store Connect. Giờ đây Claude Code có thể thao tác trong trình duyệt đã đăng nhập qua tích hợp Chrome, nếu có quyền cần thiết. Điều đó không đảm bảo các trường là chính xác: hãy đọc lại thông tin, kiểm tra tài khoản được dùng và tự mình xác nhận các cam kết cũng như việc gửi duyệt.
Gói đăng ký
Viết một paywall mất mười phút. Làm cho sản phẩm trong App Store Connect, cấu hình của chúng trong RevenueCat và code khớp với nhau lại là chuyện khác. Một mã định danh lệch một ký tự là paywall trống trơn khi reviewer mở. Những cái bẫy phổ biến nhất được liệt kê trong các lỗi paywall iOS của người mới.
Các trường hợp biên
Không có chỉ dẫn, Claude chỉ xử lý trường hợp bình thường. Mất mạng, danh sách trống, giao dịch mua bị gián đoạn: bạn phải tự nêu ra.
Bảo mật Supabase
Khi Claude tạo bảng trong Supabase, hãy kiểm tra bảo mật mức dòng (RLS) đã được bật, với các policy giới hạn mỗi người dùng chỉ truy cập dữ liệu của chính họ. Kiểm tra luôn là không có khóa bí mật nào nằm trong code app. Hãy ghi hai điều cấm này vào CLAUDE.md ngay khi bạn kết nối database.
Bước 7: lên TestFlight với EAS
Các màn hình của bạn đã được kiểm tra trong Expo Go hoặc trong một bản development build, tùy module đang dùng. Giờ hãy chuyển sang bản build sẽ phát cho tester.
Chuẩn bị EAS
Lúc này bạn cần một tài khoản Apple Developer trả phí: Expo có nhắc, nó là bắt buộc để gửi app lên App Store. Sau đó, cài công cụ của Expo và cấu hình dự án:
npm install --global eas-cli
eas login
eas build:configure
Thêm một bundle identifier duy nhất trong app.json, ở ios.bundleIdentifier, ví dụ com.yourname.myapp.
Build và gửi
eas build --platform ios --profile production
eas submit --platform ios
Lệnh đầu tiên build app trên server của Expo. Lần chạy đầu, EAS sẽ đề nghị kết nối tài khoản Apple của bạn để tạo chứng chỉ. Lệnh thứ hai gửi bản build lên App Store Connect. Bạn cũng có thể làm tất cả một lần với eas build --platform ios --auto-submit.
Bản build phải được Apple xử lý xong mới xuất hiện trong TestFlight, và bước xử lý này có thể từ chối nó, ví dụ lỗi ITMS-90717 vì icon trong suốt. Gửi thành công không có nghĩa là đã cài được: hãy kiểm tra trạng thái của nó trong App Store Connect. Tester nội bộ, tester bên ngoài và vòng duyệt beta được giải thích trong bài TestFlight để test app iPhone của mình.
Làm lại các bước kiểm tra ở bước 6 trên bản build này. Một app chạy tốt trong Expo Go vẫn có thể crash ở production, ví dụ khi thiếu một module native.
Thực sự tốn bao nhiêu tiền
Đây là giá niêm yết của các dịch vụ, được kiểm tra ngày 27 tháng 9 năm 2026, tính bằng đô la Mỹ. Số tiền thực tế còn phụ thuộc vào khu vực, thuế và mức dùng của bạn: hãy xem kỹ gói trước khi đăng ký.
- Gói đăng ký Claude: gói Pro giá 20 USD mỗi tháng, hoặc 17 USD mỗi tháng nếu trả theo năm. Các gói Max bắt đầu từ 100 USD mỗi tháng, cho mức dùng cao hơn.
- Tài khoản Apple Developer: 99 USD mỗi năm, bắt buộc cho TestFlight và App Store.
- EAS: gói miễn phí của Expo có 15 lượt build iOS mỗi tháng, trong hàng đợi ưu tiên thấp. Gói Starter giá 19 USD mỗi tháng, cộng phần dùng thêm.
Với một prototype nhỏ, Pro và gói miễn phí của EAS có thể là nền tảng đủ dùng, nếu bạn ở trong hạn mức. Thêm tài khoản Apple trước khi lên TestFlight, rồi tính riêng các dịch vụ thực sự cần: database, lưu trữ hoặc API trả phí. Mẫu ngân sách cho app đầu tiên giúp bạn liệt kê các khoản này. Thời gian cấu hình và kiểm tra của bạn cũng cần tính vào.
Những giới hạn thật lòng, và chỗ hay bị kẹt
Claude Code đã thay đổi ai có thể tạo app iPhone. Nó không thay đổi những gì Apple đòi hỏi để phát hành. Bị từ chối đến rất nhanh: Solys từng dính, Nolera và Clic cũng vậy. Những lý do phổ biến nhất được kể trong bài vì sao Apple từ chối app.
Với hướng dẫn này, bạn có thể tự đi đến TestFlight. Chỗ hay bị kẹt nhất là sau đó: kết nối gói đăng ký, chuẩn bị hồ sơ cho reviewer, hiểu một lần bị từ chối. Để có cái nhìn tổng quan về cả hành trình, hãy đọc trang tạo một app iPhone.
Cho phần này, iOS Kit gom Starter Code từ các app của mình, kể cả gói đăng ký, các skill Claude Code cho từng bước và Apple Review Kit. Toàn bộ lộ trình có ở trang khóa học Claude Code để tạo app iOS.
Bạn đang bị kẹt mà không biết kẹt ở đâu? Bài chẩn đoán miễn phí cho bạn biết điều gì thực sự đang cản bạn và gửi bạn checklist chống bị Apple từ chối của mình.
Câu hỏi thường gặp
Có thể tạo app iPhone bằng Claude Code mà không biết code không?
Có, với màn hình và logic đơn giản, nếu bạn đọc lại và test từng bước. Không, nếu bạn mong không cần hiểu gì cả. Bạn phải biết đọc thông báo lỗi, chạy một lệnh và kiểm tra những gì Claude đã sửa. Những thứ này học nhanh lắm khi bạn bắt tay vào làm.
Claude Code có miễn phí không?
Không. Claude Code cần tài khoản Pro, Max, Team, Enterprise hoặc Console. Gói miễn phí của claude.ai không bao gồm nó. Gói Pro đủ để bắt đầu, với giới hạn sử dụng cần để ý.
Có cần Mac để tạo app iOS bằng Claude Code không?
Không. Bạn code trên máy tính nào cũng được, test trong Expo Go trên iPhone, còn EAS build và gửi app trên server của Expo. Mac vẫn tiện cho simulator, nhưng không bắt buộc.
Nên dùng Claude Code hay Cursor cho app React Native?
Mình dùng cả hai, hằng ngày. Claude Code làm việc trong terminal và tự nối liền việc sửa code với chạy test. Cursor là một trình soạn thảo. Phương pháp quan trọng hơn công cụ: có quy tắc, mỗi lần một màn hình, có test.
Mất bao lâu để phát hành app đầu tiên với Claude Code?
Tùy kích thước app và thời gian của bạn. App chỉ có một chức năng sẽ nhanh hơn nhiều. Phần khó đoán nhất vẫn là vòng duyệt của Apple.
Claude Code có cấu hình được gói đăng ký trong app không?
Nó viết được code cho paywall và RevenueCat. Với các công cụ đã kết nối và quyền cần thiết, nó cũng có thể thao tác trong các console. Đừng bao giờ suy ra rằng có code là sản phẩm đã được cấu hình: hãy kiểm tra mã định danh, giá và quyền lợi sau khi mua, rồi test việc mua và khôi phục giao dịch trên TestFlight. Bài các lỗi thường gặp của paywall iOS cho bạn danh sách những điểm cần kiểm tra.