App Transfer App Store Connect báo không đủ điều kiện: 6 nhóm nguyên nhân và cách xử lý dứt điểm
Bạn đã đọc hướng dẫn Transfer App trên App Store Connect, làm đúng từng bước, nhưng tới màn hình kiểm tra điều kiện thì một vài dòng hiện dấu đỏ và nút đi tiếp bị khóa. Hoặc tệ hơn, liên kết Transfer App không hề xuất hiện trong trang thông tin ứng dụng.
Bài viết này không lặp lại quy trình chuyển giao. Nó tập trung vào đúng một việc: giải mã từng dòng điều kiện bị đỏ, chỉ ra nguyên nhân kỹ thuật phía sau và cách gỡ. Kèm theo đó là phần quan trọng không kém mà rất ít người chuẩn bị trước: danh sách những thứ không đi theo ứng dụng sau khi chuyển, nguyên nhân gây ra hàng loạt sự cố sau ngày bàn giao.
1. Hiểu đúng bản chất bảng Criteria
Bảng điều kiện mà App Store Connect hiển thị là kết quả của một loạt phép kiểm tra tự động chạy trên hồ sơ ứng dụng và trên tài khoản nhà phát triển. Ba đặc điểm cần nắm:
- Kiểm tra chạy tại thời điểm bạn mở màn hình. Sửa xong lỗi thì phải tải lại trang, kết quả không tự cập nhật.
- Một số phép kiểm tra có độ trễ. Sau khi bạn tắt một dịch vụ hoặc rút một quyền, hệ thống có thể mất vài giờ tới một ngày để nhận ra thay đổi.
- Bảng chỉ nói cái gì sai, không nói vì sao sai. Đó là lý do bài viết này tồn tại.
Nguyên tắc chung nằm sau mọi điều kiện: Apple chỉ cho phép chuyển những tài nguyên thuộc riêng ứng dụng đó. Bất cứ thứ gì được chia sẻ giữa nhiều ứng dụng trong cùng tài khoản, hoặc gắn chặt vào định danh của đội phát triển, đều là vật cản. Nắm nguyên tắc này là bạn tự đoán được phần lớn các dòng đỏ.
2. Không thấy liên kết Transfer App ở đâu cả
Trước khi bàn tới bảng điều kiện, hãy loại trừ ba tình huống khiến liên kết không xuất hiện:
| Tình huống | Dấu hiệu | Xử lý |
|---|---|---|
| Sai vai trò tài khoản | Đăng nhập bằng tài khoản có vai trò App Manager hoặc Developer | Chỉ chủ tài khoản mới khởi tạo được yêu cầu chuyển giao, hãy đăng nhập bằng đúng tài khoản đó |
| Ứng dụng chưa từng phát hành | App đang ở trạng thái chuẩn bị nộp, chưa có bản nào lên App Store | Phải có ít nhất một phiên bản đã từng phát hành, app chưa từng lên chợ thì không chuyển được, chỉ có thể tạo lại ở tài khoản mới |
| Loại tài khoản không hỗ trợ | Tài khoản thuộc chương trình dành cho doanh nghiệp phân phối nội bộ | Không có cơ chế chuyển giao cho loại tài khoản này |
3. Nhóm nguyên nhân 1: hợp đồng và thuế chưa sẵn sàng
Đây là nhóm chiếm tỉ lệ cao nhất và cũng dễ xử lý nhất, nhưng thường bị kẹt vì phụ thuộc vào bên nhận chứ không phải bên chuyển.
| Điều kiện | Ý nghĩa | Cách gỡ |
|---|---|---|
| Cả hai bên phải chấp nhận thỏa thuận mới nhất | Apple cập nhật thỏa thuận nhiều lần mỗi năm, bên nào chưa bấm đồng ý là bảng đỏ | Vào mục Agreements, Tax, and Banking, chấp nhận mọi thỏa thuận đang chờ ở cả hai tài khoản |
| Bên nhận phải có hợp đồng ứng dụng trả phí còn hiệu lực | Áp dụng khi ứng dụng có giá bán hoặc có mua hàng trong ứng dụng | Bên nhận phải hoàn tất khai báo thuế và thông tin ngân hàng, không chỉ bấm đồng ý là xong |
| Cả hai tài khoản phải đang hoạt động, đã đóng phí thành viên | Tài khoản hết hạn hoặc đang chờ gia hạn sẽ chặn mọi thao tác | Gia hạn và chờ hệ thống ghi nhận trạng thái hoạt động |
| Tài khoản bên nhận không đang bị hạn chế | Tài khoản đang trong diện xem xét hoặc bị treo | Xử lý dứt điểm với bộ phận hỗ trợ trước, xem thêm bài xử lý tài khoản Apple Developer bị treo |
Kinh nghiệm thực tế: nếu bên nhận là tài khoản vừa đăng ký xong, hãy dành trọn một tuần cho riêng phần hồ sơ thuế và ngân hàng trước khi nghĩ tới chuyện chuyển giao. Quy trình đăng ký đầy đủ nằm ở bài đăng ký tài khoản Apple Developer và xin mã D-U-N-S.
4. Nhóm nguyên nhân 2: tài nguyên dùng chung giữa nhiều ứng dụng
Đây là nhóm khó nhất, vì cách gỡ thường đòi hỏi sửa mã nguồn và phát hành một phiên bản mới. Nguyên lý đã nói ở mục 1: thứ gì gắn với đội phát triển hoặc chia sẻ giữa nhiều ứng dụng thì không chuyển được.
| Tài nguyên | Vì sao chặn | Hướng xử lý |
|---|---|---|
| Vùng lưu trữ iCloud | Vùng chứa dữ liệu iCloud thuộc về tài khoản nhà phát triển, không thuộc về ứng dụng, và dữ liệu người dùng bên trong không thể chuyển giao | Gỡ quyền iCloud khỏi hồ sơ định danh ứng dụng và phát hành bản mới. Đây là quyết định lớn vì đồng nghĩa với việc bỏ dữ liệu đồng bộ của người dùng cũ, cần lên kế hoạch di trú dữ liệu sang máy chủ riêng trước |
| Nhóm ứng dụng dùng chung bộ nhớ | Nhóm này cho phép nhiều ứng dụng trong cùng tài khoản chia sẻ dữ liệu, nên nó gắn với tài khoản | Nếu ứng dụng chuyển đi là ứng dụng duy nhất dùng nhóm đó, hãy gỡ nhóm ra khỏi hồ sơ. Nếu nó dùng chung với ứng dụng khác đang giữ lại, phải tách kiến trúc trước, ví dụ tiện ích mở rộng cần đọc dữ liệu chung |
| Định danh người bán cho thanh toán không tiếp xúc | Định danh này thuộc tài khoản | Bên nhận tạo định danh mới, ứng dụng phải cập nhật cấu hình và phát hành bản mới |
| Định danh thẻ trong ví điện tử | Tương tự, gắn với tài khoản | Bên nhận tạo lại và phát hành bản mới |
| Hồ sơ định danh dùng ký tự thay thế | Một hồ sơ định danh dạng bao trùm phục vụ nhiều ứng dụng nên không thể tách riêng | Bắt buộc chuyển sang hồ sơ định danh riêng cho từng ứng dụng |
Điểm cần cảnh báo cho bên mua ứng dụng: nếu ứng dụng đang dùng iCloud để đồng bộ dữ liệu người dùng, việc gỡ quyền này ra không phải thao tác kỹ thuật đơn thuần mà là mất toàn bộ dữ liệu đồng bộ của người dùng hiện hữu. Đây là hạng mục phải đưa vào định giá và vào lịch trình, không phải phát hiện sau khi đã trả tiền.
5. Nhóm nguyên nhân 3: Sign in with Apple và bài toán mất tài khoản người dùng
Đây là phần tinh vi nhất và cũng là phần gây thiệt hại nặng nhất nếu làm sai. Mã định danh người dùng mà Apple trả về cho ứng dụng khi đăng nhập không phải là một giá trị toàn cầu, nó được sinh ra theo từng đội phát triển. Cùng một người dùng, cùng một ứng dụng, nhưng khi ứng dụng đổi chủ thì mã định danh do Apple cấp sẽ khác đi.
Hậu quả nếu bỏ qua bước xử lý: sau ngày chuyển giao, toàn bộ người dùng từng đăng nhập bằng Apple sẽ bị máy chủ của bạn coi là người mới. Họ mất lịch sử, mất gói thuê bao, mất dữ liệu. Đây không phải lỗi có thể sửa bằng một bản cập nhật vá lỗi.
Apple có cung cấp cơ chế chuyển đổi mã định danh cho tình huống này. Quy trình gồm hai giai đoạn và cả hai bên đều phải tham gia:
- Trước và trong quá trình chuyển: bên chuyển gọi dịch vụ của Apple để đổi từng mã định danh người dùng hiện có sang một mã trung gian gắn với đội phát triển bên nhận.
- Sau khi chuyển hoàn tất: bên nhận gọi tiếp dịch vụ để đổi mã trung gian đó thành mã định danh chính thức trong không gian định danh của mình, rồi cập nhật vào cơ sở dữ liệu người dùng.
# Giai đoạn 1: bên chuyển đổi mã người dùng sang mã trung gian
curl -X POST "https://appleid.apple.com/auth/usermigrationinfo" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "user=001234.abcdef1234567890.1234" \
-d "target=RECIPIENT_TEAM_ID" \
-d "client_id=com.example.app" \
-d "client_secret=YOUR_CLIENT_SECRET"
Bốn lưu ý sống còn về quy trình này:
- Có cửa sổ thời gian. Mã trung gian chỉ đổi được trong một khoảng thời gian giới hạn quanh thời điểm chuyển giao. Bỏ lỡ là không lấy lại được. Hãy tra cứu mốc thời gian hiện hành trong tài liệu của Apple ngay khi lên kế hoạch, đừng để tới ngày chuyển mới đọc.
- Phải chạy theo lô cho toàn bộ người dùng. Nếu cơ sở dữ liệu có hàng trăm nghìn tài khoản, hãy viết sẵn kịch bản chạy theo lô, có ghi nhật ký và có khả năng chạy lại từ điểm dừng.
- Cả hai bên phải phối hợp đúng thứ tự. Bên chuyển làm xong giai đoạn một rồi bàn giao bảng ánh xạ cho bên nhận, kèm điều khoản bảo mật dữ liệu.
- Dịch vụ chuyển tiếp thư điện tử ẩn danh cũng cần được cấu hình lại ở tài khoản bên nhận, nếu không thư gửi tới người dùng chọn ẩn địa chỉ sẽ bị chặn.
Nếu ứng dụng của bạn có tính năng đăng nhập bằng Apple và bên bán không nhắc gì tới việc này, đó là dấu hiệu rõ ràng rằng họ chưa từng làm chuyển giao nghiêm túc. Hãy đưa nó thành điều khoản trong hợp đồng mua bán.
6. Nhóm nguyên nhân 4: ứng dụng đang ở trạng thái bị kẹt
Nhóm này dễ gỡ nhất, chỉ cần kiên nhẫn dọn dẹp trạng thái:
| Trạng thái đang kẹt | Cách gỡ |
|---|---|
| Có phiên bản đang chờ duyệt hoặc đang được duyệt | Rút bản nộp đó lại, chờ trạng thái trở về bình thường rồi mới chuyển |
| Có gói mua hàng trong ứng dụng đang chờ duyệt | Tương tự, phải dọn hết các mục đang chờ. Kiểm tra kỹ vì mục này nằm ở màn hình khác nên hay bị bỏ sót |
| Đang có đợt thử nghiệm bên ngoài chạy trên TestFlight | Dừng nhóm thử nghiệm bên ngoài và tắt liên kết công khai, xem bài tạo Public Link TestFlight để biết chỗ tắt |
| Phiên bản đang chờ nhà phát triển bấm phát hành | Phát hành hoặc hủy bản đó, không để treo lơ lửng |
| Đang có thay đổi giá theo lịch chưa tới ngày hiệu lực | Hủy lịch đổi giá, đặt lại sau khi chuyển xong |
| Ứng dụng đang bị gỡ khỏi bán hàng | Đưa trở lại trạng thái bán bình thường trước khi chuyển |
7. Nhóm nguyên nhân 5: xung đột phía tài khoản nhận
Đôi khi lỗi không nằm ở ứng dụng mà nằm ở phía bên nhận:
- Trùng tên ứng dụng. Tên hiển thị trên App Store phải là duy nhất trong toàn hệ thống. Nếu bên nhận đã đặt trước một hồ sơ trống mang cùng tên để giữ chỗ, hãy xóa hồ sơ đó đi trước.
- Trùng hồ sơ định danh. Bên nhận không được có sẵn một hồ sơ định danh trùng với ứng dụng sắp chuyển tới, kể cả hồ sơ chưa dùng.
- Chưa đủ vai trò để chấp nhận. Chỉ chủ tài khoản bên nhận mới bấm chấp nhận được yêu cầu.
- Yêu cầu chuyển giao đã hết hạn. Yêu cầu có thời hạn chờ chấp nhận, quá hạn thì bên chuyển phải tạo lại từ đầu.
8. Những thứ KHÔNG đi theo ứng dụng sau khi chuyển
Phần này quan trọng ngang với việc vượt qua bảng điều kiện, vì đây là nguồn gốc của hầu hết sự cố xảy ra trong tuần đầu sau bàn giao. Hồ sơ định danh, lượt tải, đánh giá và người dùng thì đi theo ứng dụng. Nhóm dưới đây thì không:
| Hạng mục | Hệ quả nếu quên | Việc phải làm |
|---|---|---|
| Khóa xác thực thông báo đẩy | Toàn bộ thông báo đẩy ngừng hoạt động | Bên nhận tạo khóa mới và nạp lên máy chủ gửi thông báo, xem bài tích hợp thông báo đẩy APNs cho iOS với Firebase |
| Mã bí mật dùng chung để xác thực biên nhận mua hàng | Máy chủ trả về mã lỗi báo mã bí mật không khớp, mọi giao dịch tự động gia hạn bị coi là không hợp lệ, người dùng trả tiền bị mất quyền dùng gói | Sinh mã mới ở tài khoản bên nhận và cập nhật vào máy chủ ngay trong ngày chuyển giao |
| Khóa truy cập dịch vụ máy chủ của App Store | Dịch vụ đối soát giao dịch và thông báo máy chủ ngừng chạy | Tạo khóa mới ở tài khoản bên nhận |
| Địa chỉ nhận thông báo máy chủ về giao dịch | Không nhận được sự kiện hủy gói, gia hạn thất bại, hoàn tiền | Khai báo lại địa chỉ ở tài khoản mới, kiểm tra bằng môi trường thử nghiệm |
| Chứng chỉ và hồ sơ cấp phép ký ứng dụng | Không dựng được bản phát hành mới | Bên nhận tạo bộ chứng chỉ mới trên tài khoản của mình |
| Người thử nghiệm và các bản dựng trên TestFlight | Mất toàn bộ danh sách người thử nghiệm đã gom được | Xuất danh sách địa chỉ thư điện tử ra trước khi chuyển, mời lại sau, xem bài phân biệt Internal và External Testing |
| Dữ liệu doanh thu và phân tích trước ngày chuyển | Bên nhận không xem được lịch sử, gây khó khăn khi đối chiếu tài chính | Bên chuyển xuất toàn bộ báo cáo ra file và bàn giao kèm hợp đồng |
| Cấu hình dựng ứng dụng trên hạ tầng của Apple | Quy trình tích hợp liên tục đứng | Dựng lại cấu hình ở tài khoản mới |
| Mã khuyến mại đã phát hành | Mã cũ có thể không còn dùng được | Thông báo trước cho các bên đối tác đang giữ mã |
Trong bảng này, dòng nguy hiểm nhất là mã bí mật dùng chung để xác thực biên nhận mua hàng. Nó âm thầm làm gãy doanh thu chứ không báo lỗi ồn ào: ứng dụng vẫn chạy, người dùng vẫn mở được, chỉ có điều máy chủ của bạn coi mọi biên nhận là không hợp lệ và thu hồi quyền dùng gói của người đã trả tiền. Nếu bạn dùng nền tảng trung gian để quản lý mua hàng trong ứng dụng, hãy cập nhật mã bí mật ngay trên bảng điều khiển của nền tảng đó, xem bài tích hợp In-App Purchase với RevenueCat.
9. Kịch bản diễn tập trước ngày chuyển giao
Với ứng dụng có doanh thu, đừng chuyển vào ngày làm việc bận rộn. Hãy chuẩn bị theo thứ tự sau:
- Chọn khung giờ thấp điểm, thường là đêm chủ nhật theo múi giờ của thị trường chính.
- Chuẩn bị sẵn ở tài khoản bên nhận: khóa thông báo đẩy, khóa dịch vụ máy chủ, mã bí mật xác thực biên nhận. Chưa dùng nhưng đã có trong tay.
- Viết sẵn kịch bản cập nhật cấu hình máy chủ, chỉ chờ tới giờ là chạy, không sửa tay lúc đang gấp.
- Chạy giai đoạn một của quy trình chuyển mã định danh người dùng nếu ứng dụng có đăng nhập bằng Apple.
- Xuất toàn bộ báo cáo doanh thu, danh sách người thử nghiệm, ảnh chụp màn hình cấu hình gói thuê bao.
- Gửi yêu cầu chuyển, bên nhận chấp nhận ngay trong khung giờ đã hẹn.
- Ngay khi hệ thống báo hoàn tất, chạy kịch bản cập nhật khóa và mã bí mật.
- Kiểm tra thật một giao dịch mua trên môi trường thử nghiệm, xem bài test In-App Purchase với tài khoản Sandbox.
- Gửi thử một thông báo đẩy tới thiết bị thật.
- Theo dõi tỉ lệ lỗi xác thực biên nhận trên máy chủ trong hai mươi bốn giờ đầu.
10. Bảng đối chiếu nhanh dấu hiệu và nguyên nhân
| Dấu hiệu bạn nhìn thấy | Nguyên nhân khả dĩ nhất |
|---|---|
| Không thấy liên kết Transfer App | Sai vai trò tài khoản, hoặc ứng dụng chưa từng phát hành, xem mục 2 |
| Dòng đỏ liên quan tới thỏa thuận | Một trong hai bên chưa chấp nhận thỏa thuận mới nhất, xem mục 3 |
| Dòng đỏ liên quan tới dịch vụ hoặc quyền của ứng dụng | Ứng dụng đang dùng tài nguyên gắn với tài khoản, xem mục 4 |
| Dòng đỏ liên quan tới trạng thái phiên bản | Còn bản nộp hoặc gói mua hàng đang chờ duyệt, xem mục 6 |
| Bên nhận không thấy yêu cầu chuyển giao | Gõ sai địa chỉ thư điện tử hoặc sai mã đội phát triển, hoặc yêu cầu đã quá hạn |
| Chuyển xong nhưng thông báo đẩy im lặng | Chưa tạo lại khóa xác thực thông báo đẩy, xem mục 8 |
| Chuyển xong, người dùng trả tiền bị mất quyền dùng gói | Chưa cập nhật mã bí mật xác thực biên nhận, xem mục 8 |
| Chuyển xong, người dùng đăng nhập bằng Apple thành tài khoản trống | Chưa chạy quy trình chuyển mã định danh người dùng, xem mục 5 |
11. Khi nào KHÔNG nên transfer mà chọn cách khác
- Khi bạn muốn đổi từ tài khoản cá nhân sang tài khoản doanh nghiệp và tất cả ứng dụng đều của mình. Nếu chỉ có một người sở hữu cả hai đầu, hãy liên hệ bộ phận hỗ trợ để hỏi về việc chuyển đổi loại tư cách thành viên, trong nhiều trường hợp cách này ít rủi ro hơn chuyển từng ứng dụng một.
- Khi ứng dụng phụ thuộc nặng vào iCloud để lưu dữ liệu người dùng. Chi phí di trú dữ liệu có thể lớn hơn giá trị thương vụ. Hãy tính kỹ trước khi ký.
- Khi bên mua thực chất muốn mua cả tài khoản. Mua bán tài khoản nhà phát triển là việc khác hẳn, đi kèm rủi ro pháp lý và rủi ro bị khóa, vì thông tin định danh và pháp nhân đăng ký không thay đổi theo.
- Khi ứng dụng chưa từng phát hành lên App Store. Không có gì để chuyển, hãy nộp lại từ đầu ở tài khoản mới, nhanh và sạch hơn.
- Khi đang trong đợt tăng trưởng quan trọng. Việc đổi tên nhà phát triển hiển thị trên App Store có thể ảnh hưởng tới nhận diện, và giai đoạn xáo trộn kỹ thuật không phải lúc để chạy chiến dịch, xem thêm bài ASO App Store Optimization.
12. Danh sách kiểm tra rút gọn cho hai bên
Bên chuyển giao:
- Đã dọn hết bản nộp và gói mua hàng đang chờ duyệt.
- Đã tắt thử nghiệm bên ngoài trên TestFlight và xuất danh sách người thử nghiệm.
- Đã gỡ hoặc xử lý xong các tài nguyên dùng chung ở mục 4.
- Đã chạy giai đoạn một của quy trình chuyển mã định danh người dùng.
- Đã xuất toàn bộ báo cáo doanh thu và phân tích.
- Đã chấp nhận mọi thỏa thuận đang chờ.
Bên nhận:
- Tài khoản đang hoạt động, đã hoàn tất hồ sơ thuế và ngân hàng.
- Đã xóa mọi hồ sơ trống trùng tên hoặc trùng định danh với ứng dụng sắp nhận.
- Đã chuẩn bị sẵn khóa thông báo đẩy và khóa dịch vụ máy chủ.
- Đã có kịch bản cập nhật mã bí mật xác thực biên nhận, chạy được ngay trong giờ.
- Đã thống nhất bằng văn bản việc bàn giao bảng ánh xạ mã định danh người dùng.
- Đã lên lịch theo dõi tỉ lệ lỗi xác thực biên nhận trong hai mươi bốn giờ đầu.
Kết luận
Phần khó của việc chuyển giao ứng dụng iOS không nằm ở bốn cú nhấp chuột trên giao diện, mà nằm ở hai chỗ: gỡ đúng những tài nguyên gắn với tài khoản để vượt qua bảng điều kiện, và chuẩn bị trước cho những thứ không đi theo ứng dụng. Với ứng dụng có doanh thu, hãy coi ngày chuyển giao là một đợt phát hành lớn cần diễn tập, không phải một thủ tục hành chính.
Uwmee Software nhận tư vấn và thực hiện trọn gói quy trình chuyển giao ứng dụng iOS và Android giữa hai tài khoản nhà phát triển. Đọc thêm bài hướng dẫn Transfer App trên App Store Connect từ A tới Z và bài Transfer App Google Play giữa hai tài khoản Play Console.