Một Python app bị ban trên Apple App Store do một “string” duy nhất

Cập nhật phiên bản của một ngôn ngữ lập trình hay một framework có tốt không?

Tôi có thể kể ra trên 10 lí do nên cập nhật thường xuyên chúng, tăng cường tính bảo mật, function mới, tăng tốc… Ví dụ Golang sau khi cập nhật trình dọn rác, ngôn ngữ này đã lập tức lên đỉnh. Nhưng nhiều khi tôi cũng luôn phải tự đặt câu hỏi về việc cập nhật phiên bản liên tục liệu có tốt không? Thay vì phân tích, chúng ta hãy cùng đi vào một case study về “Một Python app bị cấm trên Apple App Store do một “string” duy nhất.”

Các nhà phát triển Python đang phải đối mặt với một vấn đề bất thường. Việc nâng cấp phiên bản ngôn ngữ lập trình của họ đang khiến ứng dụng bị từ chối trên Appstore.

Gần đây, một số nhà phát triển đã nâng cấp từ Python 3.11 lên 3.12. Khi họ gửi lại ứng dụng của mình lên App Store của Apple, họ đã bị từ chối.

Vấn đề này đã thu hút sự chú ý của rất nhiều nhà phát triển trong đó có tôi. Có phải vấn đề nào đó đang xảy ra với Python 3.12 hoặc nhóm đánh giá của Apple đang gặp vấn đề không? Cùng tìm hiểu nhé!

ric Froemling, một nhà phát triển phần mềm đã chia sẻ kinh nghiệm của mình trên GitHub. Ông nói:

“Đây không phải là một lỗi thông thường. Bản cập nhật ứng dụng của tôi đã bị từ chối khỏi Mac App Store sau khi tôi cập nhật từ Python 3.11 lên 3.12.”

Ban đầu, Eric không hiểu tại sao ứng dụng đã được chấp nhận trước đây của mình lại bị từ chối.

Nhóm đánh giá App Store không giải thích lý do. Họ chỉ nói, “Chúng tôi không thể cung cấp thêm thông tin.”

Sau nhiều lần thử, Eric gửi một đơn kháng cáo đến Apple. Cuối cùng, họ đã đưa ra một gợi ý:

Theo hướng dẫn 2.5.2 — Hiệu suất — Yêu cầu phần mềm:

Ứng dụng cài đặt hoặc chạy mã thực thi. Cụ thể, nó sử dụng sơ đồ URL itms-services để cài đặt ứng dụng.

Nếu bạn chưa biết thì sơ đồ URL itms-services là cách của Apple để phân phối ứng dụng iOS ngoài App Store. Nó thường được sử dụng cho ứng dụng nội bộ hoặc thử nghiệm.

Nó cho phép người dùng cài đặt ứng dụng trực tiếp trên thiết bị iOS của họ mà không cần sử dụng App Store.

Một URL itms-services cơ bản trông như thế này:

itms-services://?action=download-manifest&url=https://example.com/manifest.plist

Sau nhiều cuộc điều tra, Eric đã tìm ra tệp vấn đề: Lib/urllib/parse.py (trình phân tích URL thư viện tiêu chuẩn của Python) và tệp .pyc của nó.

Trong Python 3.12, một chuỗi “itms-services” đã được thêm vào. Có vẻ như Apple đang quét chuỗi này và tự động từ chối các ứng dụng có chứa nó.

Cuối cùng, Eric đã xóa chuỗi này khỏi code Python của mình. Sau đó, ứng dụng cập nhật của ông đã vượt qua đánh giá và được đẩy lên thành công trên App Store.

Quy tắc Đánh Giá và Phản Hồi Gây Tranh Cãi của Apple

Eric Froemling không khó chịu về chính chuỗi “itms-services”. Ông bức xúc với các quy tắc đánh giá của Apple App Store.

Ông nói, “Khi Apple nói với tôi vấn đề nằm ở Lib/urllib/parse.py và tệp .pyc của nó, không khó để tìm ra chuyện gì đã xảy ra.”

“Nghĩ lại, tôi thất vọng vì không tìm kiếm ‘itms-services’ trong Python sớm hơn. Tôi cũng không tìm thấy người khác gặp phải vấn đề tương tự.”

Như mọi người đều biết, fix lỗi thường khó hơn viết code :))

Eric chỉ cần xóa một chuỗi để khắc phục vấn đề nhưng đã dành nhiều thời gian để fix bug. Nhiều nhà phát triển phần mềm nghĩ rằng điều này có thể đã tránh được nếu quy trình đánh giá của Apple rõ ràng hơn vì quy trình đánh giá của Apple hiện tại đang không được minh bạch.

Theo một Nhà Phát Triển CPython Core: Quy tắc Đánh Giá App Store rất Khắt Khe và Khó Dự Đoán!

 

Russell Keith-Magee, một Core dev của CPython, đã viết một bài báo về vấn đề này. Ông hỏi: Chúng ta nên thay đổi bao nhiêu để phù hợp với quy tắc App Store?

Vấn đề là App Store của macOS tự động từ chối các ứng dụng có chuỗi “itms-services”. Điều này đúng ngay cả khi ứng dụng không bao giờ sử dụng URL itms-services://.

Russell đề xuất hai giải pháp:

  1. Làm cho “tuân thủ App Store” trở thành một mục tiêu cho CPython. Điều này có nghĩa là người dùng sẽ không cần phải work around với CPython, nhưng có thể dẫn đến code xấu. (Ở đây ông dùng từ ugly code thay vì bad code –  có nghĩa là dịch chính xác phải là code bẩn, code lộn xộn)
  2. Xem nó như một vấn đề thường trực có thể xảy ra. Sử dụng các công cụ như Briefcase hoặc Py2app để vá CPython khi đẩy lên Appstore.

Cả hai tùy chọn đều có ưu và nhược điểm. Tùy chọn 1 có nghĩa là đẩy lên những phiên bản Python đã được sửa đổi nhưng rác. Tùy chọn 2 yêu cầu vá liên tục.

Alex Gaynor, một Core dev khác đề xuất một tùy chọn thứ ba:

  • Chấp nhận các sửa lỗi nhỏ, cục bộ cho các vấn đề này.
  • Trước khi merge, ai đó phải khiếu nại với một bên thứ ba (như Apple) về vấn đề này.
  • Đặt giới hạn thời gian cho việc sửa các lỗi này.

Điều này cân bằng trải nghiệm người dùng với việc thúc đẩy các công ty lớn tự sửa lỗi của họ.
Keith-Magee sau đó đề xuất một tùy chọn thứ tư:

Thêm một tùy chọn xây dựng để loại bỏ code có vấn đề. Đây sẽ là một giải pháp sạch hơn so với việc làm xáo trộn phần code.

Tùy chọn này sẽ:

  • Thêm vào một tệp diff mô tả các thay đổi.
  • Thêm tùy chọn —with-app-store-patch vào cấu hình.
  • Cho phép các nhà phân phối cung cấp các patch update nếu cần.

Điều này cho phép CPython liệt kê chính thức các thay đổi cần thiết để tuân thủ App Store.

Kết luận

Sau vài ngày suy nghĩ, Keith-Magee trả lời vào ngày 25 tháng 6. Ông đã gửi một pull request số (#120984) để thêm tùy chọn —with-app-store-compliance. Điều này sẽ giải quyết vấn đề ứng dụng bị từ chối bởi App Store một cách ngớ ngẩn do một string.

Ông đề cập rằng tùy chọn này có thể được sử dụng cho các nền tảng khác ngoài iOS và macOS. Nếu mọi thứ suôn sẻ, nó sẽ có sẵn trong Python 3.13.

Nhiều nhà phát triển cảm thấy bức xúc vì các dự án phần mềm tự do như Python phải lãng phí thời gian tìm cách vượt qua các quy trình đánh giá không rõ ràng đến từ Appstore (Yeah, tôi hiểu điều đó mà).

Một người dùng HN bình luận:

Không chỉ Apple làm điều này. Thử biên dịch một ứng dụng Python bằng PyInstaller trong khi Windows Defender đang bật mà xem, bạn thậm chí không thể biên dịch mà không bị Defender chặn.

Cũng thử chạy một tệp nhị phân được tạo bởi PyInstaller với Defender bật. Defender sẽ gọi nó là phần mềm độc hại và sẽ không chạy nó.

Nó hơi viễn tưởng rằng cả hai nền tảng hệ điều hành chính đều cố gắng hết sức để ngăn bạn release và chạy các ứng dụng Python.

Trong trường hợp này, Keith-Magee và các nhà phát triển CPython khác đã hành động nhanh chóng. Giải pháp của họ dường như là cách dễ nhất để mang lại trải nghiệm tốt nhất cho các nhà phát triển ứng dụng Python.

Tuy nhiên, gần như chắc chắn rằng đây không phải là lần cuối cùng một dự án gặp phải vấn đề này. Tương lai sẽ còn rất nhiều và chúng ta sẽ phải sống chung với điều đó!

Add a Comment

Scroll Up