{"ref":"artifact:abap2ui5-mobile-shell","page":"/artifacts/abap2ui5-mobile-shell","json":"/artifacts/abap2ui5-mobile-shell.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"abap2ui5-mobile-shell","name":"abap2UI5 mobile shell","artifact_type":"desktop-app","source_available":true,"ecosystem":"abap","serves_ecosystems":["btp"],"domain":"ui-and-frontend-bridge","origin_ring":"community-org","use_as":"starting-point","description":{"one_line":"A generic native iOS and Android shell that loads one abap2UI5 endpoint in a WebView and hands the ABAP app the phone's scanner, push token and biometric check through a JavaScript bridge.","short":"Native iOS and Android shell for one abap2UI5 endpoint","what_it_solves":"An [abap2UI5](artifact:abap2ui5-abap2ui5) app runs in a browser, which puts the device features of a phone out of reach. This repository holds two shells, Android in Kotlin and iOS in SwiftUI with WKWebView, that load one configured URL, render it with the regular [abap2UI5 frontend](artifact:abap2ui5-frontend) and inject `bridge/native-bridge.js`, the shim both bundle byte-identical, so an ABAP app calls `window.abap2ui5Native` for `getDeviceInfo`, `showToast`, `scanBarcode`, `getPushToken` and `biometricConfirm`, each returning a promise. The shell holds no app-specific code and knows only the endpoint, so a change to an app never needs an app-store release, and the bridge answers the main frame of the configured origin alone. Beside the shells sit the sample app `zcl_test_mobile_poc`, which scans through the framework control `z2ui5.cc.NativeBridgeScan`, and a push client for [SAP Mobile Services](artifact:btp-mobile-services) that is copied into an ABAP Cloud system by hand.","to_build_on_it":"There is no release: both shells are built from source, and CI proves that they compile and that the bridge keeps its contract, not that they run against a backend. The open work is ordered in `docs/NEXT_STEPS.md`: the BTP SDK onboarding flow with its session handover into the WebView, push activation with a Firebase project, an APNs key and Mobile Services credentials, and the real-device checks for CSP and certificate pinning — offline sync is not on that list, because the server-roundtrip architecture of [abap2UI5](artifact:abap2ui5-abap2ui5) puts it out of scope. A control for a bridge method other than scanning is a pull request to abap2UI5 itself, where `z2ui5.cc.NativeBridgeScan` lives; the contract grows additively in `bridge/native-bridge.js`, with a case added to its test and the two bundled copies kept byte-identical."},"links":{"repo":"https://github.com/abap2UI5/mobile-shell","docs":"https://github.com/abap2UI5/mobile-shell/blob/main/PLAN.md"},"maintainers":["actor:abap2ui5"],"provides":[{"capability":"capability:mobile-apps","what_it_does":"Runs abap2UI5 apps on a phone as a generic native client: one endpoint in a WebView, set by managed configuration, a stored preference or QR onboarding, with a biometric app lock, screenshot protection, and barcode scanning, push token and biometric confirmation reached from ABAP through the bridge. Offline sync is out of scope by design.","sources":[{"url":"https://github.com/abap2ui5/mobile-shell","title":"abap2UI5/mobile-shell — repository","checked":"2026-10-17","quote":"Native iOS/Android shell that runs abap2UI5 apps with access to device features (scan, biometrics, push)"},{"url":"https://github.com/abap2ui5/mobile-shell","title":"abap2UI5/mobile-shell — README","checked":"2026-10-17","quote":"PoC: running abap2UI5 apps on iOS and Android in a **generic native shell** built for the SAP mobile stack (SAP Mobile Services + SAP BTP SDK), with the UI rendered by the regular abap2UI5 frontend in a WebView and native device features exposed through a small JS bridge."},{"url":"https://raw.githubusercontent.com/abap2UI5/mobile-shell/main/docs/DISTRIBUTION.md","title":"abap2UI5/mobile-shell — Distribution & hardening","checked":"2026-10-17","quote":"Precedence in both shells: **managed configuration > stored preference > manual entry/QR**."}]}],"requires":[{"ref":"artifact:abap2ui5-abap2ui5","for":"The backend the shell points at: the WebView renders the regular abap2UI5 frontend, and the sample app needs a release carrying the framework control `z2ui5.cc.NativeBridgeScan`.","requirement":"required","basis":"binding","role":"framework","sources":[{"url":"https://github.com/abap2ui5/mobile-shell","title":"abap2UI5/mobile-shell — README","checked":"2026-10-17","quote":"with the UI rendered by the regular abap2UI5 frontend in a WebView"},{"url":"https://raw.githubusercontent.com/abap2UI5/mobile-shell/main/PLAN.md","title":"abap2UI5/mobile-shell — PLAN.md","checked":"2026-10-17","quote":"requires abap2UI5 with `z2ui5.cc.NativeBridgeScan`"}]},{"ref":"artifact:abapgit-abapgit","for":"Installing the ABAP side of the repository: abapGit installs `abap/src/` with the sample app. The push client in `abap/push/` carries no `.clas.xml` and is copied into an ABAP Cloud system by hand.","requirement":"conditional","condition":"the repository's ABAP sample app is installed in a system","basis":"binding","role":"installation","sources":[{"url":"https://raw.githubusercontent.com/abap2UI5/mobile-shell/main/AGENTS.md","title":"abap2UI5/mobile-shell — AGENTS.md","checked":"2026-10-17","quote":"The sample app `zcl_test_mobile_poc`, which abapGit installs"},{"url":"https://github.com/abap2ui5/mobile-shell","title":"abap2UI5/mobile-shell — README","checked":"2026-10-17","quote":"`src/`: sample app (abapGit-installable, scans through `z2ui5.cc.NativeBridgeScan`); `push/`: Mobile Services push client, installed by hand (ABAP Cloud only)"}]},{"ref":"artifact:btp-mobile-services","for":"Push: the device registers against the Mobile Services push runtime API and the ABAP client sends through its backend push API, which takes Mobile Services credentials beside a Firebase project and an APNs key.","requirement":"conditional","condition":"push notifications are activated","basis":"binding","role":"push-backend","sources":[{"url":"https://github.com/abap2ui5/mobile-shell","title":"abap2UI5/mobile-shell — README","checked":"2026-10-17","quote":"What still needs external accounts: the BTP SDK onboarding flow (SAP repositories), and push activation (Firebase project, APNs key, Mobile Services credentials)."},{"url":"https://raw.githubusercontent.com/abap2UI5/mobile-shell/main/docs/DISTRIBUTION.md","title":"abap2UI5/mobile-shell — Distribution & hardening","checked":"2026-10-17","quote":"Backend: service key of the Mobile Services push API"}]}],"connects":[{"ref":"artifact:abap2ui5-abap2ui5","kind":"data","direction":"outbound","for":"The shell loads the one configured abap2UI5 endpoint into the WebView, and every interaction after that is a JSON roundtrip over HTTPS to the ABAP backend.","sources":[{"url":"https://raw.githubusercontent.com/abap2UI5/mobile-shell/main/PLAN.md","title":"abap2UI5/mobile-shell — PLAN.md","checked":"2026-10-17","quote":"The shell knows one URL; all UI logic stays in ABAP."},{"url":"https://raw.githubusercontent.com/abap2UI5/mobile-shell/main/PLAN.md","title":"abap2UI5/mobile-shell — PLAN.md, architecture","checked":"2026-10-17","quote":"HTTPS (JSON roundtrips)"}]},{"ref":"artifact:btp-mobile-services","kind":"data","direction":"outbound","condition":"push notifications are activated","for":"The Android shell registers the device against the Mobile Services push runtime API, and the ABAP class `zcl_test_mobile_push` sends an alert with a deep-link URL to all devices of a user through the backend push API.","sources":[{"url":"https://raw.githubusercontent.com/abap2UI5/mobile-shell/main/PLAN.md","title":"abap2UI5/mobile-shell — PLAN.md","checked":"2026-10-17","quote":"device registration against the MS push runtime API (`MobileServicesPush.kt`)"},{"url":"https://raw.githubusercontent.com/abap2UI5/mobile-shell/main/PLAN.md","title":"abap2UI5/mobile-shell — PLAN.md","checked":"2026-10-17","quote":"ABAP: `zcl_test_mobile_push` — thin client for the MS backend push API, sends alert + deep-link URL to all devices of a user."}]}],"interfaces":[{"key":"native-bridge","kind":"api","direction":"in","for":"`window.abap2ui5Native`, the shim both shells inject into the WebView, is what an ABAP app calls for `getDeviceInfo`, `showToast`, `scanBarcode`, `getPushToken` and `biometricConfirm`; every method returns a promise, and in a plain browser the object is undefined, so apps feature-detect it.","sources":[{"url":"https://raw.githubusercontent.com/abap2UI5/mobile-shell/main/bridge/README.md","title":"abap2UI5/mobile-shell — Native bridge contract","checked":"2026-10-17","quote":"`native-bridge.js` is the source of truth for the JS shim both shells inject into the WebView."},{"url":"https://raw.githubusercontent.com/abap2UI5/mobile-shell/main/bridge/README.md","title":"abap2UI5/mobile-shell — Native bridge contract","checked":"2026-10-17","quote":"**Everything returns a promise**, so ABAP-side JS is platform-independent."}]}],"part_of":{"ref":"artifact:abap2ui5-abap2ui5","sources":[{"url":"https://github.com/abap2ui5/mobile-shell","title":"abap2UI5/mobile-shell — README","checked":"2026-10-17","quote":"This is a **source** repository in the abap2UI5 ecosystem, for developers who want to try abap2UI5 apps on a phone."},{"url":"https://raw.githubusercontent.com/abap2UI5/mobile-shell/main/PLAN.md","title":"abap2UI5/mobile-shell — PLAN.md","checked":"2026-10-17","quote":"This is \"Stage 2\" of the abap2UI5 mobile strategy:"}]},"provenance":{"discovered_via":[{"source":"source:github"}],"first_seen":"2026-10-17"},"drafted_with_ai":true,"contributors":["actor:oblomov-dev"]},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"unknown","evidence":"no release data"},{"label":"Continuity","tier":"good","evidence":"3 contributors, org-owned"},{"label":"Repository","tier":"good","evidence":"pushed 2026-10, not archived"}],"compatibility":[{"label":"Declared for","tier":"good","evidence":"SAP_BASIS 750 and up, in its abaplint config: includes every maintained line to 816"},{"label":"Survived majors","tier":"unknown","evidence":"not read on ABAP: its lines run side by side"},{"label":"Maintainer's CI","tier":"good","evidence":"abap green, 2026-10-12"}],"practice":[{"label":"Tests","tier":"good","evidence":"5 test files"},{"label":"Docs","tier":"good","evidence":"docs/ with 4 pages, docs site, README 2 KB"},{"label":"Changelog","tier":"fair","evidence":"none in the repo"}],"reach":[{"value":null,"unit":"installs/week"},{"value":0,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-24","npm":"not published under this name","stars":0,"forks":0,"open_issues":0,"archived":false,"pushed_at":"2026-10-12","license_spdx":"MIT","org_owned":true,"default_branch":"main","created_at":"2026-08-03T10:56:11Z","open_prs":0,"tree_truncated":false,"test_files":5,"workflows":4,"other_ci":false,"readme_bytes":1655,"docs_files":4,"changelog":false,"license_file":true,"dts_files":0,"first_commit":"2026-08-03","last_commit":"2026-10-12","commits":22,"contributors":3,"ci_status":"success","ci_run_at":"2026-10-12","ci_workflow":"abap","ci_event":"push","readme_path":"README.md","readme_sha":"a78084fb3d819434a4d292c38939bd63e66a0f24","repo_read":"2026-10-24","abap_syntax":{"repo":"abap2UI5/mobile-shell","file":"abaplint.json","url":"https://github.com/abap2UI5/mobile-shell/blob/HEAD/abaplint.json","version":"v750","floor":"750","checked":"2026-10-26"}},"edges":{"maintainers":[{"ref":"actor:abap2ui5","name":"abap2UI5","json":"/actors/abap2ui5.json"}],"contributors":[{"ref":"actor:oblomov-dev","name":"oblomov-dev","json":"/actors/oblomov-dev.json"}],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"part_of":{"ref":"artifact:abap2ui5-abap2ui5","name":"abap2UI5","json":"/artifacts/abap2ui5-abap2ui5.json"},"parts":[],"add_on_to":{"ref":"artifact:abap2ui5-abap2ui5","name":"abap2UI5","json":"/artifacts/abap2ui5-abap2ui5.json"},"add_ons":[],"answered_through_parts":[]}}