Files
ux/macos/ux.podspec
agra b4b5ee58a9 feat: UxUrl — native URL / phone / email detection + tap launcher
Sync FFI from Dart into platform detectors:
- iOS / macOS: NSDataDetector(.link | .phoneNumber) + a tight bare-domain
  pass that requires `/` or `?` (so `etc.` / `v1.2.3` don't false-positive
  while `example.com/path` does match). NFKD-fold the phone capture so
  full-width / Arabic-Indic digits collapse to ASCII; stop the digit run
  at the first letter so `+1 555 1234 ext.99` doesn't fuse the extension.
- Android: JNI into android.util.Patterns (WEB_URL / EMAIL_ADDRESS / PHONE)
  via a cached JavaVM, std::call_once for init, full per-call
  ExceptionCheck coverage. UTF-16→UTF-8 conversion is hand-rolled to dodge
  the Modified-UTF-8 / CESU-8 incompatibility with Dart's utf8.decode.

`UxUrl.launch(url)` is the matching tap action. Channel side dispatches via
UIApplication / NSWorkspace / Intent.ACTION_VIEW. Dart-side gates the URL
against a scheme allowlist (http, https, mailto, tel, sms, banlu, tg),
rejects bidi-override controls (U+202A..E / U+2066..9) to prevent visual
spoofs, and blocks USSD / MMI tel: codes containing `*` or `#`.

Library/native cleanup along the way:
- Renamed libux_keyboard.so to libux.so (also covers sensor + url).
- Collapsed three near-identical FFI loader stanzas across keyboard / sensor
  / url into a shared lib/src/_ffi.dart with `uxLib` + typed `uxLookupX`
  helpers.
2026-05-14 22:59:25 +03:00

36 lines
1.5 KiB
Ruby

Pod::Spec.new do |s|
s.name = 'ux'
s.version = '0.9.0'
s.summary = 'UX Kit — Flutter plugin: keyboard, sensor, file, QR scanner, and camera.'
s.homepage = 'https://swipelab.co/ux.html'
s.license = { :file => '../LICENSE' }
s.author = { 'Swipelab' => 'hello@swipelab.co' }
s.source = { :path => '.' }
# `Classes/Camera-shared/` mirrors the shared `darwin/Camera/`
# Swift files. `prepare_command` runs only on `pod install`, so
# mid-iteration edits to darwin/Camera/*.swift wouldn't reach the
# built binary until pods were re-installed. Run the mirror as a
# build script phase too (before compile) so the latest source is
# always picked up. The two are belt-and-suspenders — pod install
# primes the file set so CocoaPods globs it; the build phase keeps
# contents fresh on every subsequent Swift change.
s.prepare_command = 'rm -rf Classes/Camera-shared && cp -R ../darwin/Camera Classes/Camera-shared'
s.script_phases = [{
:name => 'Mirror darwin/Camera',
:execution_position => :before_compile,
:script => <<-CMD
set -e
SRC="${PODS_TARGET_SRCROOT}/../darwin/Camera"
DEST="${PODS_TARGET_SRCROOT}/Classes/Camera-shared"
[ -d "$SRC" ] || exit 0
mkdir -p "$DEST"
rsync -a --delete "$SRC/" "$DEST/"
CMD
}]
s.source_files = 'Classes/**/*.{swift,m}'
s.frameworks = ['AVFoundation', 'CoreMedia', 'CoreVideo']
s.dependency 'FlutterMacOS'
s.osx.deployment_target = '10.15'
s.swift_version = '5.0'
end