Skip to content

[LSWF] Restore iOS buildability of the 3.6.0 Cordova app on a modern toolchain (Xcode 26 / Node 25) #1160

Description

@HankYuLinksys

Background

The LSWF app (Linksys/Velop mobile app) is a Cordova-based hybrid iOS app that had not been built for a long time. It needs to be brought back to a buildable state on a modern toolchain (Xcode 26 / Node 25 / macOS on Apple Silicon) so we can resume development and ship new requirements.

The app spans two repos:

  • Native iOS shell "Spruce" — github.com/linksys/Linksys
  • Web/hybrid layer "Symmetry" (git submodule Hybrid) — git.lswf.net/.../linksys-symmetry-mobile

Note: this tracking issue is filed here for visibility; the actual code lives in the two repos above (the hybrid layer is on Bitbucket, so it cannot be linked as GitHub PRs).

Goal

A developer can go from git clone to a signed build installed on a physical iPhone, by following a single reproducible SOP — without having to re-discover any of the environment/compatibility fixes.

Task breakdown

1. Build-environment compatibility (local machine setup)

  • Resolve corporate firewall SSL interception (Fortinet CA) breaking all npm/gem traffic (SELF_SIGNED_CERT_IN_CHAIN) — trust the CA via npm cafile + NODE_EXTRA_CA_CERTS + ~/.gemrc
  • Install Ruby 3.1 + compass for the SASS build step (macOS built-in 2.6 too old, Homebrew 4.x too new — compass needs the 2.7–3.1 window)
  • Pin the web toolchain (cordova CLI, grunt-cli, bower, CocoaPods)

2. Fix broken dependency sources (migration) — Symmetry repo

  • plugins.json: private Cordova plugins pointed at the now-defunct git.belkin.com → migrate to git.lswf.net
  • SFW/package.json: 3 @linksys/* scoped packages (jnap-js, symmetry-lib, grunt-localize) were served by a dead private npm registry → point to git URLs on git.lswf.net

3. Cordova script / hook compatibility fixes (dual-platform safe) — Symmetry repo

  • hooks/install_plugins.js: guard trailing file writes with fs.existsSync so an iOS-only run doesn't crash on missing Android files
  • update_references_before/after.js: skip the Android-only hook only when AndroidManifest is absent (so Android builds are unaffected)

4. Native compile fixes on Xcode 26 — main repo (github.com/linksys/Linksys)

  • linksys-bridge framework: remove redundant #import <netinet6/in6.h> from 3 Cordova plugin files (Xcode 26 explicit-modules rejects private system headers inside a framework module)
  • System.swift: replace the C TARGET_OS_SIMULATOR macro (no longer imported into Swift scope on modern SDKs) with Swift's native #if targetEnvironment(simulator)
  • Both fixes are iOS-only and compile-time-equivalent — Android unaffected. Shipped as PR linksys/Linksys#1412.

5. Documentation

  • Write a reproducible build SOP (clone → Xcode build), an architecture/tech-stack doc, and a build-gap technical report

6. Device deployment

  • Build & install on a physical iPhone (iPhone 13) using the corporate Apple Developer team — the Apple Developer Program agreement is now signed; created a development certificate + provisioning profile and successfully ran on device

7. Version bump to 4.0.0

  • Main repo: rebuilt release-4.0.0 branch off release-3.6.0 with the version bump (MARKETING_VERSION / CFBundleShortVersionString 3.6.0 → 4.0.0; build number unchanged). Xcode 26 fixes above (PR #1412) target this branch.
  • Symmetry (Hybrid) repo: 4.0.0 alignment — handled separately by the Android/web owner.

⚠️ Do not build on the iOS Simulator (Apple Silicon): the bundled SplunkMint.framework lacks an arm64-simulator slice. Use a physical device (arm64) instead.

Metadata

Metadata

Assignees

Labels

lswf-mobilelegacy mobile app label

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions