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.
38 lines
1.5 KiB
Ruby
38 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 => '.' }
|
|
# Mirror the shared `darwin/Camera/` Swift files into a local
|
|
# `Classes/Camera-shared/` so CocoaPods picks them up via the
|
|
# normal glob — neither symlinks nor `../` escapes work
|
|
# (Pathname.glob bails on both).
|
|
#
|
|
# `prepare_command` only runs on `pod install`. Swift edits in
|
|
# `darwin/Camera/` between installs would never reach the built
|
|
# binary — the mirror would be stale. The build script phase
|
|
# below re-runs the mirror before each compile to keep contents
|
|
# fresh.
|
|
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', 'Photos', 'PhotosUI']
|
|
s.dependency 'Flutter'
|
|
s.ios.deployment_target = '13.0'
|
|
s.swift_version = '5.0'
|
|
end
|