world-manager/docs/ios-device-access.md
2026-06-01 15:04:20 -05:00

6.2 KiB

Connected iOS Device Access

Summary

World Manager can browse Minecraft Bedrock content from a trusted iPhone or iPad on macOS using Apple's private MobileDevice.framework and the House Arrest service.

Connected-device sources are modeled as normal MinecraftSource values, but they are not scanned through a live filesystem mirror. The current implementation asks the device for library item summaries, metadata, icons, sizes, and directory listings through AppleMobileDeviceSourceAccess. Only explicit materialization operations, such as reveal/export/share, mirror an item subtree into a temporary local directory.

Current Flow

  1. SourceLibrary owns a ConnectedDeviceRuntime refresh loop when a connected-device access method is configured.

  2. AppleMobileDeviceSourceAccess.listConnectedDevices() enumerates devices through AppleMobileDeviceAccess.connectedDevices().

  3. AppleMobileDeviceSourceAccess.listAccessibleContainers(for:) lists app containers and prioritizes com.mojang.minecraftpe.

  4. ConnectedDeviceSourcePickerView lets the user add a device-backed Minecraft source.

  5. ConnectedDeviceSourceFactory creates a stable synthetic source identifier:

    wmminecraft-device://<device-udid>/<bundle-id>?mode=documents
    
  6. SourceScanExecutor scans the source through the generic SourceAccessMethod protocol.

  7. AppleMobileDeviceSourceAccess.discoverItems calls minecraftLibrarySnapshot for item summaries and minecraftMetadataBatch for metadata.

  8. Preview icons, size metrics, directory contents, and full item materialization are loaded lazily through the same source-access method.

This keeps UI, indexing, export, and persistence mostly source-agnostic while allowing connected devices to avoid a full upfront mirror.

Minecraft Container

The tested Minecraft bundle identifier is:

com.mojang.minecraftpe

Minecraft exposes a vendable Documents surface. The working Minecraft content root for House Arrest VendDocuments is:

Documents/games/com.mojang

The app treats that value as a vend-relative path stored on DeviceAppContainer.minecraftFolderRelativePath.

Expected subfolders under that root:

  • minecraftWorlds
  • resource_packs
  • behavior_packs
  • skin_packs
  • world_templates

House Arrest Details

The implementation uses the explicit House Arrest flow in the Objective-C bridge:

  1. Start com.apple.mobile.house_arrest.
  2. Send VendDocuments.
  3. Receive the vend response.
  4. Use AFC against the returned service connection.

The direct AMDeviceCreateHouseArrestService helper returned InstallationLookupFailed / e80000b7 on the tested device, so it is not the primary path.

The AFC root for this vend should not be treated as a normal / filesystem root. Paths are relative to the vend surface, and Minecraft content is reached through Documents/games/com.mojang.

Runtime Behavior

Connected-device sources use a staged refresh strategy:

  • Availability is derived from current device presence and trust state.
  • Trusted devices are available.
  • Locked or untrusted devices are limited.
  • Missing or inaccessible devices are disconnected.
  • When a source becomes available, SourceSyncRuntime can queue a reconcile scan instead of a full scan if cached content exists.

Scan execution uses fewer workers for connected-device sources than local folders to avoid overloading AFC/MobileDevice calls.

During scan:

  • minecraftLibrarySnapshot returns candidate content items.
  • minecraftMetadataBatch returns display names, UUIDs, versions, minimum engine versions, and world pack references.
  • Icons are loaded with minecraftIconBatch or individual file reads and cached through ImageCacheStore.
  • Size information is loaded through pathMetricsBatch.
  • Directory previews call listDirectory.

During materialization:

  • materializeItem mirrors one remote item subtree into NSTemporaryDirectory()/WMMConnectedDeviceReveal/....
  • ContentPackageExporter mirrors the selected item into archive staging when exporting connected-device content.
  • Temporary materialized folders are treated as disposable.

Persistence

Connected-device sources are persisted in the SQLite source cache with:

  • source identifier
  • source origin and device/container metadata
  • access descriptor
  • availability
  • raw item cache
  • source snapshot
  • last scan date

On app launch, cached sources and items are restored before availability refreshes complete, so offline device-backed sources can still show cached results.

Relevant Files

  • World Manager for Minecraft/SourceAccess/ConnectedDevice/AppleMobileDevice/AppleMobileDeviceBridge.m
  • World Manager for Minecraft/SourceAccess/ConnectedDevice/AppleMobileDevice/AppleMobileDeviceBridge.h
  • World Manager for Minecraft/SourceAccess/ConnectedDevice/AppleMobileDevice/AppleMobileDeviceAccess.swift
  • World Manager for Minecraft/SourceAccess/ConnectedDevice/AppleMobileDevice/AppleMobileDeviceSourceAccess.swift
  • World Manager for Minecraft/SourceAccess/ConnectedDevice/ConnectedDeviceSourceFactory.swift
  • World Manager for Minecraft/SourceAccess/ConnectedDevice/ConnectedDeviceSourcePickerView.swift
  • World Manager for Minecraft/Services/Sources/ConnectedDevice/SourceConnectedDeviceRuntime.swift
  • World Manager for Minecraft/Services/Sources/Scanning/SourceScanExecution.swift

Developer Probe

The local probe harness is useful for debugging MobileDevice behavior outside the app:

Scripts/run_mobile_device_probe.sh summary
Scripts/run_mobile_device_probe.sh apps
Scripts/run_mobile_device_probe.sh details com.mojang.minecraftpe
Scripts/run_mobile_device_probe.sh probe-paths com.mojang.minecraftpe
Scripts/run_mobile_device_probe.sh mirror com.mojang.minecraftpe 'Documents/games/com.mojang' /tmp/wmm-minecraft-device-mirror

These commands require a trusted connected device and generally need to run outside restricted automation sandboxes.

Caveats

  • MobileDevice.framework, House Arrest, and AFC are private Apple interfaces.
  • Behavior can change across macOS, iOS, iPadOS, and Minecraft releases.
  • Device access requires trust, unlock state, and a vendable app container.
  • Connected-device export/reveal operations may be slower than local folder operations because they materialize remote content on demand.