# Xóa tài khoản trong app iOS: luồng cần test trước khi gửi Apple

> Nút xóa, dữ liệu liên quan, gói đăng ký và đăng nhập lại: quy trình test cụ thể để kiểm tra luồng xóa tài khoản trước khi gửi App Review.

Trang gốc: [Xóa tài khoản trong app iOS: luồng cần test trước khi gửi Apple](https://devoria.fr/vi/blog/xoa-tai-khoan-app-ios-test-truoc-app-review)
Tác giả: [Mehdi Azizi](https://devoria.fr/vi/mehdi-azizi)
Ngày đăng: 2026-10-02
Lần sửa nội dung gần nhất: 2026-10-09


## Có nút thôi chưa đủ: phải kiểm tra những gì thực sự biến mất

Nếu app của bạn cho phép tạo tài khoản, Apple yêu cầu người dùng phải có thể bắt đầu việc xóa tài khoản ngay trong app. Chỉ vô hiệu hóa tài khoản thì không đáp ứng yêu cầu này. Luồng xóa phải dễ tìm và giải thích rõ hệ quả. Nếu một phần được hoàn tất trên web, đường link phải dẫn thẳng tới trang liên quan. [Nguồn: xóa tài khoản theo Apple](https://developer.apple.com/support/offering-account-deletion-in-your-app).

Vậy nên công việc không dừng ở một nút đỏ trong phần cài đặt. Bạn cần liệt kê dữ liệu, thực hiện việc xóa phía server, xử lý lỗi và kiểm tra người dùng thấy gì sau đó. Bài này đưa ra một quy trình test về cả sản phẩm lẫn kỹ thuật; những dữ liệu thuộc nghĩa vụ lưu trữ cần được xử lý phù hợp với hoạt động của bạn.

## Bắt đầu bằng một bản đồ dữ liệu

Lấy ví dụ một app sổ tay đọc sách hư cấu. App có tài khoản, hồ sơ, ghi chú riêng tư và ảnh bìa do người dùng thêm vào. Ví dụ dưới đây mô tả một kế hoạch cần kiểm tra, không phải một lần xóa đã thực hiện trên app nào của Devoria.

- **Danh tính đăng nhập:** làm sao để tài khoản không dùng được nữa sau khi xóa?
- **Hồ sơ và ghi chú:** những dòng dữ liệu nào thuộc về người này và chúng bị xóa thế nào?
- **Ảnh đã lưu:** quy trình nào gỡ bỏ các file và tham chiếu của chúng?
- **Cache trên điện thoại:** màn hình có xóa dữ liệu cục bộ khi thao tác thực sự thành công không?
- **Dịch vụ bên thứ ba:** dữ liệu gắn với tài khoản này có cần xóa riêng không?
- **Dữ liệu phải giữ lại:** những dữ liệu nào, vì nghĩa vụ gì, và người dùng được thông báo ra sao?

Bản đồ này giúp bạn tránh phát hiện muộn rằng một tấm ảnh vẫn truy cập được trong khi hồ sơ người dùng đã biến mất. Nó cũng cho bạn danh sách đối tượng cần tìm khi test.

## Một luồng dễ hiểu với bốn trạng thái

Đây là một đề xuất cho app hư cấu, bạn điều chỉnh theo hệ quả thực tế của sản phẩm mình:

1. **Cài đặt tài khoản.** Mục "Xóa tài khoản" luôn truy cập được.
2. **Xác nhận.** Màn hình mô tả dữ liệu bị ảnh hưởng và có nút hủy dễ hiểu không kém nút xóa.
3. **Đang xử lý.** Nút chặn việc gửi yêu cầu hai lần và giao diện cho biết thao tác đang chạy.
4. **Kết quả.** Thành công đã xác nhận thì chuyển sang trạng thái đã đăng xuất. Thất bại thì giữ một thông báo hữu ích và cách thử lại, không giả vờ là tài khoản đã bị xóa.

Nếu việc xử lý mất thời gian, Apple chấp nhận luồng xóa trì hoãn với điều kiện bạn thông báo cho người dùng và xác nhận khi hoàn tất. App không được để người dùng tưởng việc xóa đã xong khi mới chỉ ghi nhận yêu cầu. Cũng [tài liệu Apple](https://developer.apple.com/support/offering-account-deletion-in-your-app) đó còn nói rõ các trường hợp cần xác thực lại và các ngoại lệ dành cho lĩnh vực bị quản lý chặt.

## Những điều cần lường trước với Supabase

Chỉ riêng việc xóa một user Auth không chứng minh được mọi đối tượng trong sản phẩm của bạn đã được xử lý. Supabase giải thích rằng một user sở hữu đối tượng Storage sẽ không xóa được chừng nào tình trạng này chưa được giải quyết. Tài liệu cũng lưu ý rằng xóa user không đăng xuất ngay lập tức mọi JWT đã cấp: bạn phải tính đến thời hạn hiệu lực của chúng khi thiết kế. [Nguồn: quản lý user của Supabase](https://supabase.com/docs/guides/auth/managing-user-data).

Vì vậy, hãy định nghĩa một quy trình phía server kiểm tra danh tính người yêu cầu và các tài nguyên thuộc về họ. Đừng dựa vào một ID do điện thoại tự do gửi lên để chọn tài khoản cần xóa. Quyền quản trị phải nằm ở phía server, đúng theo [tài liệu về key của Supabase](https://supabase.com/docs/guides/getting-started/api-keys).

Với quy trình nhiều bước, hãy quyết định lần thử lại phải làm gì nếu bước đầu đã thành công mà bước sau thất bại. Ví dụ, nếu file đã bị gỡ, yêu cầu mới không được thất bại chỉ vì chúng không còn. Đây là kịch bản cần viết ra trước khi test, không phải hành vi để đoán.

## Tài khoản và gói đăng ký: hai việc kiểm tra riêng biệt

Một người có thể xóa tài khoản trong khi gói đăng ký Apple vẫn tiếp tục. Apple yêu cầu giải thích chuyện thanh toán sẽ ra sao và cho truy cập phần quản lý gói đăng ký. Hãy chuẩn bị cả việc thu hồi token phù hợp nếu bạn dùng Sign in with Apple. Các điểm này được trình bày chi tiết trong [hướng dẫn của Apple về việc xóa tài khoản](https://developer.apple.com/support/offering-account-deletion-in-your-app).

Trong kế hoạch test, hãy tách riêng việc tài khoản biến mất, trạng thái quyền truy cập trả phí và việc quản lý gói đăng ký. Bài [gói đăng ký hay mua một lần](https://devoria.fr/vi/blog/goi-dang-ky-hay-mua-mot-lan-ung-dung-ios) giúp bạn đặt luồng này vào mô hình kinh doanh của mình.

## Quy trình test chạy trên một build thử nghiệm

Chỉ dùng tài khoản test và dữ liệu giả. Ghi lại build, thiết bị, kết quả quan sát được và giới hạn của từng lần kiểm tra.

1. **Hủy.** Tài khoản và dữ liệu vẫn truy cập được.
2. **Xóa một tài khoản có dữ liệu.** Trạng thái cuối khớp với quy trình đã thông báo; dữ liệu liên quan thực sự bị gỡ bỏ.
3. **Ngắt mạng.** App không hiển thị một thành công giả.
4. **Chạy lại sau khi thất bại một phần.** Yêu cầu có thể hoàn tất mà không đụng tới dữ liệu khác.
5. **Mở một phiên thứ hai.** Các quyền truy cập cũ được xử lý đúng theo cơ chế đã định.
6. **Tạo lại tài khoản với cùng địa chỉ email, nếu được phép.** Dữ liệu riêng tư cũ không xuất hiện lại.

Thêm các trường hợp này vào [bảng test của Devoria](https://devoria.fr/vi/resources). Để phân phối cho người test, hãy làm theo hướng dẫn [TestFlight](https://devoria.fr/vi/blog/testflight-kiem-thu-app-iphone). Console không báo lỗi không thay thế được việc kiểm tra dữ liệu và luồng.

## Chuẩn bị gửi App Review

Trong ghi chú cho reviewer, hãy giải thích nút xóa nằm ở đâu và cách test nó. Nếu một bước phụ thuộc vào một dịch vụ, hãy đảm bảo dịch vụ đó hoạt động trong thời gian review. Đừng dùng ghi chú để hứa một tính năng chưa có trong build đã gửi.

Trang [app bị Apple từ chối](https://devoria.fr/vi/expertise/ung-dung-bi-apple-tu-choi) giúp bạn sắp xếp câu trả lời khi vấn đề đã bị nêu ra. Để chuẩn bị, [Apple Review Kit](https://devoria.fr/vi/kits/review-apple) giúp bạn tìm lại quy định được trích dẫn, nội dung nó yêu cầu, cùng ví dụ về cách sửa và cách trả lời.

Nếu bạn đang chuẩn bị lần gửi đầu tiên, [bản chẩn đoán miễn phí](https://devoria.fr/vi/diagnostic) sẽ cho bạn biết còn việc gì phải làm và gửi bạn checklist chống bị Apple từ chối của mình, có cả phần xóa tài khoản. Nếu Apple đã từ chối app của bạn, [đặt một buổi một giờ với mình](https://devoria.fr/vi/coaching): mình sẽ cùng đọc thông báo qua video call.

## Câu hỏi thường gặp

### Xóa tài khoản có bắt buộc trong app iOS không?

Có, nếu app của bạn cho phép tạo tài khoản: Apple yêu cầu người dùng có thể bắt đầu việc xóa ngay trong app. Chỉ vô hiệu hóa thì không đáp ứng yêu cầu này. Luồng xóa phải dễ tìm và giải thích rõ hệ quả. Nếu một phần hoàn tất trên web, link phải dẫn thẳng tới trang liên quan.

### Cần xóa những gì khi người dùng xóa tài khoản?

Mọi thứ thuộc về người đó, không chỉ hồ sơ người dùng. Hãy lập danh sách: danh tính đăng nhập, hồ sơ và nội dung đã tạo, file đã lưu và tham chiếu của chúng, cache trên điện thoại, dữ liệu ở các dịch vụ bên thứ ba. Ghi lại cả những dữ liệu phải giữ, vì nghĩa vụ gì, và thông báo cho người dùng. Không có bản kê này, một tấm ảnh có thể vẫn truy cập được trong khi hồ sơ người dùng đã biến mất.

### Apple có chấp nhận việc xóa tài khoản không diễn ra ngay lập tức không?

Có. Nếu việc xử lý mất thời gian, Apple chấp nhận luồng trì hoãn với điều kiện bạn thông báo cho người dùng và xác nhận khi hoàn tất. App không được để người dùng tưởng việc xóa đã xong khi mới chỉ ghi nhận yêu cầu. Nếu thất bại, hãy giữ một thông báo hữu ích và cách thử lại, không giả vờ là tài khoản đã bị xóa.

### Gói đăng ký sẽ ra sao khi người dùng xóa tài khoản?

Gói đăng ký Apple có thể vẫn tiếp tục sau khi xóa tài khoản. Apple yêu cầu giải thích chuyện thanh toán sẽ ra sao và cho truy cập phần quản lý gói đăng ký. Nếu bạn dùng Sign in with Apple, hãy chuẩn bị cả việc thu hồi token phù hợp. Trong kế hoạch test, hãy tách riêng việc tài khoản biến mất, trạng thái quyền truy cập trả phí và việc quản lý gói đăng ký.

### Chỉ xóa user trong Supabase Auth có đủ không?

Không, xóa một user Auth không chứng minh được mọi đối tượng trong sản phẩm của bạn đã được xử lý. Theo tài liệu Supabase, một user sở hữu đối tượng Storage sẽ không xóa được chừng nào điểm này chưa được giải quyết. Xóa user cũng không đăng xuất ngay lập tức mọi JWT đã cấp. Hãy chuẩn bị một quy trình phía server kiểm tra danh tính người yêu cầu.

### Làm sao test việc xóa tài khoản trước khi gửi Apple?

Dùng tài khoản test và dữ liệu giả trên một build thử nghiệm. Chạy sáu trường hợp: hủy, xóa một tài khoản có dữ liệu, ngắt mạng, chạy lại sau khi thất bại một phần, mở phiên thứ hai, tạo lại tài khoản với cùng địa chỉ email nếu được phép. Kiểm tra dữ liệu và luồng: console không báo lỗi là chưa đủ. Để phân phối build, hãy làm theo hướng dẫn [TestFlight](https://devoria.fr/vi/blog/testflight-kiem-thu-app-iphone).


## Dự án của bạn

[Apple Review Kit](https://devoria.fr/vi/kits/review-apple): Checklist review App Store mình dùng, các lần bị Apple từ chối đã sửa, ghi chú cho người duyệt và hai skill Claude Code rà soát app của bạn. 29 €.

[iOS Kit](https://devoria.fr/vi/kits/ios): Tạo app iPhone với Claude Code: code khởi đầu từ các app của mình, các skill kiểm tra công việc của nó, và các kit Apple Review, Screenshots, ASO. 129,99 €.
