# Guideline 2.5.1 App Store: API publik dan SDK Expo terbaru

> Guideline 2.5.1: hanya API publik, app jalan di iOS terbaru, framework dipakai sesuai fungsinya. Dengan Expo, cek dulu modul native kamu.

Halaman asli: [Guideline 2.5.1 App Store: API publik dan SDK Expo terbaru](https://devoria.fr/id/blog/guideline-2-5-1-api-publik-sdk-expo)
Penulis: [Mehdi Azizi](https://devoria.fr/id/mehdi-azizi)
Terbit: 2026-11-04
Revisi konten terakhir: 2026-11-04


Guideline 2.5.1 punya empat syarat: hanya memakai API publik, berjalan di versi iOS terbaru, meninggalkan apa yang sudah di-deprecate Apple, dan memakai setiap framework sesuai fungsinya. **Dengan Expo, risikonya jarang datang dari kode JavaScript kamu: risikonya datang dari modul native yang kamu pasang dan dari SDK yang kamu pakai untuk build.**

Saya merilis Solys, TradaZen, dan Nolera dengan Expo SDK 57. Solys memakai API Screen Time dari Apple, framework yang penggunaannya dibatasi. Panduan ini membahas aturan review-nya. Untuk error yang muncul saat mengirim build, baca panduan [ITMS-90338](https://devoria.fr/id/blog/itms-90338-non-public-api-usage-expo). Untuk mode background, yang ada di bagian yang sama, baca panduan [guideline 2.5.4](https://devoria.fr/id/blog/guideline-2-5-4-mode-latar-belakang-ditolak-apple).

## Apa isi guideline 2.5.1?

Aturannya ada di bagian 2.5, "Software Requirements", dari [App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/#2.5.1): "Apps may only use public APIs and must run on the currently shipping OS. Keep your apps up-to-date and make sure you phase out any deprecated features, frameworks or technologies that will no longer be supported in future versions of an OS. Apps should use APIs and frameworks for their intended purposes and indicate that integration in their app description."

Singkatnya, ada empat kewajiban:

1. **Hanya API publik**, artinya yang didokumentasikan Apple.
2. **App berjalan di versi iOS yang sedang berlaku**, yaitu iOS 27 sejak September 2026.
3. **Tidak ada yang deprecated dan akan hilang**: kamu mengganti apa pun yang diumumkan Apple akan dihentikan.
4. **Setiap framework di tempatnya, dan disebut di deskripsi**: HomeKit untuk rumah pintar, HealthKit untuk kesehatan dan olahraga, terhubung ke app Health.

Karena itu judul penolakannya: "Guideline 2.5.1 - Performance - Software Requirements".

## API publik: di mana risikonya bersembunyi di app Expo

API privat adalah fungsi sistem yang tidak didokumentasikan Apple. Apple tidak menjamin perilakunya, juga tidak menjamin fungsi itu masih ada di versi iOS berikutnya. Itulah sebabnya dilarang.

Kode JavaScript kamu tidak pernah menyentuh iOS secara langsung: semuanya lewat modul native. Modul dari SDK Expo dikelola tim Expo. **Modul lainnya membawa kode yang tidak kamu tulis, dan Apple memeriksanya seperti kode kamu sendiri.** Panduan [ITMS-90683](https://devoria.fr/id/blog/itms-90683-missing-purpose-string-expo) menunjukkan mekanisme yang sama untuk kalimat izin: Apple menilai kode yang ada di build, bukan apa yang dilakukan app.

Di Solys, per 15 Oktober 2026, ada 42 dependensi langsung yang berisi kode iOS native, 14 di antaranya di luar SDK Expo. Termasuk RevenueCat, Sentry, AppsFlyer, dan `react-native-device-activity`, jembatan ke API Screen Time.

API privat bisa terdeteksi di dua titik. Saat pengiriman, analisis otomatis App Store Connect bisa mengembalikan error ITMS-90338. Saat review, reviewer akan menyebut 2.5.1.

## API deprecated: dari UIWebView ke UIScene

Contoh paling terkenal adalah UIWebView, komponen lama untuk menampilkan web. Apple [berhenti menerimanya](https://developer.apple.com/news/?id=12232019b) di app baru pada April 2020, lalu di update pada Desember 2020. Library lama yang masih merujuk ke sana akan memblokir pengiriman. Di Solys, pencarian dari checklist di bawah tidak menemukan satu referensi pun.

Perubahan berikutnya sudah diumumkan. Catatan teknis Apple [TN3187](https://developer.apple.com/documentation/technotes/tn3187-migrating-to-the-uikit-scene-based-life-cycle) menulis: "In the next major release following iOS 26, UIScene lifecycle will be required when building with the latest SDK; otherwise, your app won't launch." Artinya, app yang di-build dengan SDK iOS 27 tanpa lifecycle berbasis scene tidak akan bisa dibuka.

Tiga tanggal yang saling terkait:

- **Sejak April 2026**, Apple mewajibkan Xcode 26: itu topik panduan [ITMS-90725](https://devoria.fr/id/blog/itms-90725-sdk-version-issue-expo).
- **Pada April 2027**, [halaman pengiriman Apple](https://developer.apple.com/app-store/submitting/) mengumumkan SDK iOS 27 jadi wajib.
- **Expo SDK 58**, beta sejak 15 September 2026, sudah menghasilkan pengelolaan scene, menurut [pengumuman Expo](https://expo.dev/changelog/sdk-58-beta).

Dengan Expo SDK 57 dan Xcode 26, kamu masih build dengan SDK iOS 26: belum ada yang rusak hari ini. **Modul yang mengubah AppDelegate harus menyesuaikan sebelum April 2027.**

## Framework yang dipakai di luar fungsinya

Reviewer memeriksa bahwa framework sensitif melayani fitur yang terlihat, dan bahwa halaman app kamu menyebutnya.

- **HealthKit** untuk kesehatan dan olahraga. [Panduan antarmuka Apple](https://developer.apple.com/design/human-interface-guidelines/healthkit) menyebutkan: "If your app doesn't provide health and fitness functionality, don't request access to people's private health data."
- **HomeKit** untuk rumah pintar, tidak untuk yang lain.
- **PushKit** untuk panggilan suara lewat IP. [Dokumentasi PushKit](https://developer.apple.com/documentation/pushkit/responding-to-voip-notifications-from-pushkit) tegas: "If you are unable to support CallKit in your app, you cannot use PushKit to handle push notifications." Notifikasi VoIP yang membangunkan app tanpa ada panggilan adalah penyalahgunaan.
- **Family Controls**, API Screen Time, butuh izin khusus. [Dokumentasinya](https://developer.apple.com/documentation/familycontrols) menyebutkan: "Before submitting your app to the App Store, you must request permission to use the entitlement."

Untuk Solys, saya mengajukan izin distribusi itu pada 23 September 2026, dan Apple mengabulkannya di hari yang sama. Penggunaannya sesuai framework: pengguna memilih app yang ingin dijeda, dan Solys memblokirnya selama 30, 45, atau 60 menit setelah bangun tidur. Deskripsi di halaman app menyebutkannya dalam satu kalimat: "Solys memakai izin Screen Time dari Apple untuk menjeda app yang dipilih." **Inilah yang diminta bagian akhir 2.5.1: menyebut integrasinya di deskripsi.**

## Versi beta: TestFlight boleh, App Store tidak

[Catatan rilis App Store Connect](https://developer.apple.com/help/app-store-connect/release-notes/) menunjukkan aturan ini dalam praktik. Pada 14 Oktober 2026, build dari Xcode 27.2 beta 3 diterima "for internal and external testing", jadi untuk TestFlight. Pada 5 Oktober, build dari Xcode 27.1 RC diterima "for the App Store".

**Build yang dibuat dengan Xcode beta masuk ke TestFlight, tidak pernah ke review.** Untuk submit, kamu butuh versi final, atau RC yang sudah dibuka Apple untuk App Store.

Dua catatan untuk app Expo:

- **Beta Expo bukan beta Apple.** Apple mengecek versi Xcode dan SDK iOS, bukan versi Expo. Pengumuman SDK 58 juga menyebut image EAS dengan Xcode 27 akan segera hadir.
- **Tes di iOS terbaru tetap wajib**, walaupun kamu build dengan SDK iOS 26. Buka app dari kondisi tertutup penuh (cold start) di iPhone atau simulator yang sudah diperbarui.

## Checklist: dependensi native sebelum submit

Jalankan sebelum setiap build produksi. Perintahnya dijalankan di root proyek Expo:

```bash
npx expo-doctor
npx expo install --check
grep -rlw "UIWebView" node_modules --include='*.m' --include='*.mm' --include='*.swift' --include='*.h'
```

1. **`npx expo-doctor` tidak melaporkan kegagalan.** Di Solys, pada 15 Oktober 2026: 20 dari 21 pengecekan lolos. Kegagalannya berasal dari 13 paket Expo yang tertinggal satu patch, yang diselaraskan oleh `npx expo install --check`.
2. **Setiap modul di luar SDK Expo ada di React Native Directory.** Expo Doctor melakukan pengecekan ini secara default, seperti dijelaskan [dokumentasi Expo](https://docs.expo.dev/versions/latest/config/package-json/). Paket yang tidak dikenal layak dibaca kode iOS-nya.
3. **Setiap modul native mengikuti versi React Native kamu.** [Tabel versi Expo](https://docs.expo.dev/versions/latest/) memasangkan SDK 57 dengan React Native 0.86. Modul yang tidak dirilis ulang selama beberapa versi adalah tanda bahaya.
4. **Pencarian UIWebView tidak mengembalikan apa pun.** Lakukan hal yang sama untuk setiap API yang diumumkan Apple akan dihentikan.
5. **Setiap framework sensitif punya fitur yang terlihat**: kesehatan, Screen Time, panggilan, rumah. Deskripsi menyebutnya, dan izin khususnya sudah dikabulkan.
6. **Build berasal dari Xcode versi final.** Cek versinya di log build EAS.
7. **App bisa dibuka dari cold start di versi iOS terbaru**, dengan akun baru.
8. **Modul yang menyentuh AppDelegate sudah mengumumkan dukungan UIScene** sebelum kamu pindah ke SDK iOS 27.

## Bagaimana menanggapi penolakan 2.5.1?

Pesannya biasanya menyebut API atau framework yang bermasalah. Ada dua kasus:

- **Framework tidak dipakai untuk fitur yang terlihat**: hapus modul atau capability-nya, build ulang, lalu balas dalam dua kalimat.
- **Framework dipakai untuk fitur nyata**: tunjukkan langkah persisnya, satu screenshot atau video singkat, dan sebutkan integrasinya di deskripsi halaman app.

**Menghapus modul native mengubah binary: update jarak jauh (OTA) tidak cukup.** Panduan [guideline 2.1](https://devoria.fr/id/blog/guideline-2-1-app-store-penolakan) menjelaskan kenapa reviewer hanya melihat kode yang ada di build. Percakapan selanjutnya berlangsung di App Store Connect, seperti di panduan [membalas App Review](https://devoria.fr/id/blog/resolution-center-apple-membalas-penolakan-app-review).

## Cek proyek kamu sebelum dikirim

[Review Kit](https://devoria.fr/id/kits/app-review) berisi checklist saya sebelum pengiriman, penolakan yang sudah saya perbaiki, dan skill Claude Code yang memeriksa proyek Expo kamu. Kalau mau dilihat langsung oleh manusia, [pesan satu jam dengan saya](https://devoria.fr/id/coaching): kita baca bersama pesan dari Apple dan dependensi kamu. Langkah lengkapnya ada di halaman [app ditolak Apple](https://devoria.fr/id/expertise/aplikasi-ditolak-apple).

Sedang menyiapkan rilis pertama? [Ikuti diagnostic gratis](https://devoria.fr/id/diagnostic): kamu akan dapat checklist anti-penolakan Apple dari saya.

## Pertanyaan umum

### Apa arti "Guideline 2.5.1 - Performance - Software Requirements"?

Itu judul penolakan saat Apple menilai app kamu memakai API non-publik, teknologi deprecated, atau framework di luar fungsinya. Pesannya biasanya menyebut elemen yang bermasalah.

### Apa bedanya guideline 2.5.1 dan error ITMS-90338?

ITMS-90338 adalah error otomatis yang muncul saat build dikirim, ketika analisis menemukan simbol non-publik. 2.5.1 adalah aturan review yang diterapkan oleh manusia, yang juga mencakup framework yang disalahgunakan dan teknologi deprecated.

### Bisakah submit app yang di-build dengan Xcode beta?

Tidak. App Store Connect hanya menerima build seperti itu untuk TestFlight. Untuk review, build dengan Xcode versi final, atau RC yang sudah dibuka Apple untuk App Store di catatan rilisnya.

### Bisakah app Expo memakai API privat tanpa disadari?

Bisa, lewat modul native pihak ketiga. Kode JavaScript kamu tidak memanggil iOS sendiri, tapi setiap paket native membawa kode Objective-C atau Swift. Periksa daftar modul di luar SDK Expo sebelum setiap rilis.

### Apakah harus langsung pindah ke Expo SDK 58?

Untuk 2.5.1, per 15 Oktober 2026, belum: SDK 57 build dengan SDK iOS 26, yang masih diterima. Rencanakan upgrade sebelum April 2027, saat Apple mewajibkan SDK iOS 27 dan lifecycle berbasis scene.


## Proyekmu

[Review Kit](https://devoria.fr/id/kits/app-review): Checklist review App Store saya, penolakan Apple yang sudah saya perbaiki, checklist Google Play, dan tiga skill Claude Code. Rp 999.000.

[iOS & Android Kit](https://devoria.fr/id/kits/ios): Bikin app iPhone dan Android kamu dengan Claude Code: kode awal dari app-app saya, langkah demi langkah sampai ke store, dan semua kit. Rp 1.999.000.

[Diagnosis: apa yang memisahkanmu dari app iPhone-mu](https://devoria.fr/id/diagnostic): 7 pertanyaan, 60 detik: kamu tahu apa yang benar-benar menghambatmu merilis app iPhone, jalurmu dalam 4 tahap, dan kit yang cocok untukmu.
