One capability. Four runtimes. Six lifecycle states.

Choose the exact mobile path you are shipping. The matrix preserves current version evidence, exposes missing overview coverage, and makes the host application—not the provider UI—the owner of durable state.

4platform lines

Android, iOS, Flutter, and React Native remain distinct release and lifecycle boundaries.

5capabilities

Place search, nearby, directions, geofence, and feedback are evaluated independently.

20platform paths

Every pairing is represented, including gaps in the current first-party overview.

17published paths

The remaining 3 paths require product selection—not a guessed package.

Bind to the runtime you own

Versions were checked against the linked first-party overview on 2026-08-17. Reconfirm before resolving dependencies.

source-ready

Place search and picker for iOS

Documentation
v2.0.2
Component
MapplsUIWidget
Version
2.0.1
State model
selection

The current iOS overview lists MapplsUIWidget 2.0.1 under documentation v2.0.2. Confirm the exact package, configuration, callback schema, and entitlement in the selected guide before binding the adapter.

Open first-party evidence Read as JSON

Twenty paths. Every gap visible.

“Not listed” means the current overview does not establish a package. It does not mean the capability is impossible, and it never licenses reuse of another platform’s package.

Make every return, cancellation, and late callback explainable.

The generated scaffold deliberately stops at an application-owned candidate. Your repository decides whether and how that candidate becomes durable.

01
Application screen

idle

No provider controller, route, Promise, delegate, or listener is active.

02
Platform adapter

launching

One generation ID binds configuration, owner, and launch time.

03
Provider widget under host lifecycle

active

Background, recreation, close, and duplicate-launch behavior are observable.

04
Platform adapter

returned / cancelled / failed

Exactly one typed terminal result wins; late results are ignored.

05
Application domain

candidate

Validate and normalize mappls pin plus application-owned display label before committing.

06
Application repository

committed

Persist the normalized selection/draft with version, actor, source, and audit event.

iOS host adapter boundary
struct PlaceSelection: Sendable {
    let mapplsPin: String
    let label: String
}

protocol MapplsPlaceWidget: Sendable {
    @MainActor func selectPlace() async throws -> PlaceSelection?
}

@MainActor
func choose(using widget: any MapplsPlaceWidget) async throws -> PlaceSelection? {
    guard let selected = try await widget.selectPlace() else { return nil }
    precondition(selected.mapplsPin.range(of: #"^[A-Za-z0-9]{6}$"#, options: .regularExpression) != nil)
    return selected // Repository commit happens outside the provider controller.
}

The widget is a collaborator, not your database.

One presenting UIViewController or SwiftUI representable owns presentation, delegate lifetime, dismissal, and cancellation.

Copy the documented delegate result into a Sendable application value before dismissing the provider controller.

Interactive dismissal, explicit cancel, delegate error, scene deactivation, and no result are represented separately.

The durable record is mappls pin plus application-owned display label; never retain a provider view/controller or opaque bridge result.

Test the lifecycle you cannot demo.

Happy-path selection proves almost nothing about a production mobile integration.

01

Swift Package versions match the documented release family

02

The delegate cannot outlive its presenting owner

03

Interactive dismissal records cancellation once

04

Scene restoration never reuses a stale candidate

05

Permission/configuration denied

06

Offline and slow provider response

07

Cancel before and after a candidate appears

08

Host edit invalidates a stale selection

09

Duplicate callback/Promise result commits once

10

Accessibility, focus return, and a non-widget fallback