89986d5d17
- Background tasks: a JS implementation of the native task module for iOS (NativeBackgroundTasksModule.ios.ts) with the Android module's contract: per-queue order, 3 concurrent chapter downloads, retries with a delay, pause/resume/cancel interruptions, persistence across launches. Tasks run while the app is open; periodic library updates and backups are not scheduled on iOS. The module is Android-only in autolinking now. - Reader assets: WKWebView will not load file:// assets into a page whose base URL is the source's site, so on iOS the reader CSS, JS and font are inlined (scripts/embed-reader-assets.mjs, src/utils/readerAssets). Downloaded chapters get a file: base URL and file access on iOS. Android is unchanged. - Native iOS: downloadFile implemented with URLSession (plugin installs and chapter images); volume-button setActive added as a no-op (it is called on every chapter). - Share receiver stub and silent toasts on iOS; TrackSheet uses showToast. - app.json: bundle id br.dev.marcospaulo.lnreader, http sources allowed, Files sharing, deployment target 16.4. - Fresh installs start with the open-lab plugin repository. - scripts/build-ios-unsigned.sh and docs/ios-sidestore.md. Verified on Linux: tsc, eslint, all Jest suites (plus new iOS queue tests), expo prebuild for iOS, autolinking, and iOS/Android release JS bundles. Not yet built with Xcode or run on a device. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
113 lines
3.0 KiB
JSON
113 lines
3.0 KiB
JSON
{
|
|
"expo": {
|
|
"version": "2.1.4",
|
|
"name": "LNReader",
|
|
"slug": "LNReader",
|
|
"scheme": "lnreader",
|
|
"icon": "./assets/native/ic_launcher.png",
|
|
"plugins": [
|
|
"./plugins/withAndroidCustomizations",
|
|
[
|
|
"expo-splash-screen",
|
|
{
|
|
"image": "./assets/native/ic_launcher_round.png",
|
|
"backgroundColor": "#1D1B20",
|
|
"resizeMode": "contain",
|
|
"dark": {
|
|
"image": "./assets/native/ic_launcher_round.png",
|
|
"backgroundColor": "#000000"
|
|
},
|
|
"android": {
|
|
"image": "./assets/native/splash_icon.png",
|
|
"backgroundColor": "#132C33",
|
|
"imageWidth": 288,
|
|
"resizeMode": "native",
|
|
"dark": {
|
|
"image": "./assets/native/splash_icon.png",
|
|
"backgroundColor": "#132C33"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"expo-localization",
|
|
[
|
|
"react-native-edge-to-edge",
|
|
{
|
|
"android": {
|
|
"enforceNavigationBarContrast": false
|
|
}
|
|
}
|
|
],
|
|
"expo-web-browser",
|
|
"./plugins/withReaderAssets",
|
|
[
|
|
"expo-build-properties",
|
|
{
|
|
"android": {
|
|
"usesCleartextTraffic": true,
|
|
"manifestApplicationAttributes": {
|
|
"android:largeHeap": "true",
|
|
"android:allowBackup": "true"
|
|
},
|
|
"enableMinifyInReleaseBuilds": true,
|
|
"enableShrinkResourcesInReleaseBuilds": true
|
|
},
|
|
"ios": {
|
|
"deploymentTarget": "16.4"
|
|
}
|
|
}
|
|
]
|
|
],
|
|
"android": {
|
|
"versionCode": 4196356,
|
|
"package": "com.rajarsheechatterjee.LNReader",
|
|
"adaptiveIcon": {
|
|
"foregroundImage": "./assets/native/ic_launcher_foreground.png",
|
|
"backgroundImage": "./assets/native/ic_launcher_background.png",
|
|
"monochromeImage": "./assets/native/ic_launcher_monochrome.png"
|
|
},
|
|
"permissions": [
|
|
"android.permission.DOWNLOAD_WITHOUT_NOTIFICATION",
|
|
"android.permission.WAKE_LOCK",
|
|
"android.permission.FOREGROUND_SERVICE",
|
|
"android.permission.FOREGROUND_SERVICE_DATA_SYNC",
|
|
"android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK",
|
|
"android.permission.POST_NOTIFICATIONS"
|
|
],
|
|
"intentFilters": [
|
|
{
|
|
"action": "SEND",
|
|
"category": [
|
|
"DEFAULT"
|
|
],
|
|
"data": [
|
|
{
|
|
"mimeType": "text/plain"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"extra": {
|
|
"eas": {
|
|
"projectId": "3a63596f-e80c-4342-96b7-a8ac48910489"
|
|
}
|
|
},
|
|
"ios": {
|
|
"bundleIdentifier": "br.dev.marcospaulo.lnreader",
|
|
"supportsTablet": true,
|
|
"infoPlist": {
|
|
"UIBackgroundModes": [
|
|
"audio"
|
|
],
|
|
"NSAppTransportSecurity": {
|
|
"NSAllowsArbitraryLoads": true
|
|
},
|
|
"UIFileSharingEnabled": true,
|
|
"LSSupportsOpeningDocumentsInPlace": true,
|
|
"ITSAppUsesNonExemptEncryption": false
|
|
}
|
|
}
|
|
}
|
|
}
|