feat: initial release v0.1.0
- Custom Keyboard Extension with push-to-talk UI - iOS 26 SpeechAnalyzer + DictationTranscriber (iOS 18 SF fallback) - OpenAI-compatible LLM client (4 built-in providers + custom) - 3-page onboarding flow + provider config UI - App Group shared storage for cross-process config - 8s LLM timeout with raw-transcript fallback - App Store privacy manifests for both targets - SwiftLint + XcodeGen + GitHub Actions CI - Unit tests (4/4 passing)
This commit is contained in:
+154
@@ -0,0 +1,154 @@
|
||||
# XcodeGen configuration for OSGKeyboard
|
||||
# Run `xcodegen generate` to create OSGKeyboard.xcodeproj
|
||||
# Repo only tracks project.yml; .xcodeproj is gitignored.
|
||||
|
||||
name: OSGKeyboard
|
||||
options:
|
||||
bundleIdPrefix: com.osgkeyboard
|
||||
deploymentTarget:
|
||||
iOS: "18.0"
|
||||
developmentLanguage: en
|
||||
createIntermediateGroups: true
|
||||
generateEmptyDirectories: true
|
||||
groupSortPosition: top
|
||||
|
||||
settings:
|
||||
base:
|
||||
SWIFT_VERSION: "6.0"
|
||||
IPHONEOS_DEPLOYMENT_TARGET: "18.0"
|
||||
ENABLE_USER_SCRIPT_SANDBOXING: YES
|
||||
SWIFT_STRICT_CONCURRENCY: complete
|
||||
GENERATE_INFOPLIST_FILE: NO
|
||||
ENABLE_MODULE_VERIFIER: YES
|
||||
CODE_SIGN_STYLE: Automatic
|
||||
CODE_SIGN_IDENTITY: "Apple Development"
|
||||
DEVELOPMENT_TEAM: ""
|
||||
MARKETING_VERSION: "0.1.0"
|
||||
CURRENT_PROJECT_VERSION: "1"
|
||||
|
||||
targets:
|
||||
|
||||
# =========================================================
|
||||
# 主 App
|
||||
# =========================================================
|
||||
OSGKeyboard:
|
||||
type: application
|
||||
platform: iOS
|
||||
sources:
|
||||
- path: OpenLess
|
||||
entitlements:
|
||||
path: OpenLess/OpenLess.entitlements
|
||||
resources:
|
||||
- path: OpenLess/Assets.xcassets
|
||||
info:
|
||||
path: OpenLess/Info.plist
|
||||
properties:
|
||||
CFBundleDisplayName: OSGKeyboard
|
||||
CFBundleShortVersionString: "$(MARKETING_VERSION)"
|
||||
CFBundleVersion: "$(CURRENT_PROJECT_VERSION)"
|
||||
UILaunchScreen:
|
||||
UIColorName: ""
|
||||
UISupportedInterfaceOrientations:
|
||||
- UIInterfaceOrientationPortrait
|
||||
UIApplicationSceneManifest:
|
||||
UIApplicationSupportsMultipleScenes: false
|
||||
NSMicrophoneUsageDescription: "OSGKeyboard needs microphone access to transcribe your voice into text."
|
||||
NSAppTransportSecurity:
|
||||
NSAllowsArbitraryLoads: false
|
||||
CFBundleURLTypes:
|
||||
- CFBundleURLName: com.osgkeyboard.ios.settings
|
||||
CFBundleURLSchemes:
|
||||
- osgkeyboard
|
||||
settings:
|
||||
base:
|
||||
PRODUCT_BUNDLE_IDENTIFIER: com.osgkeyboard.ios
|
||||
TARGETED_DEVICE_FAMILY: "1,2"
|
||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents: YES
|
||||
dependencies:
|
||||
- target: OSGKeyboardShared
|
||||
embed: true
|
||||
- target: OSGKeyboardExt
|
||||
# Keyboard Extension is a plugin of the main App; embed it.
|
||||
|
||||
# =========================================================
|
||||
# Keyboard Extension
|
||||
# =========================================================
|
||||
OSGKeyboardExt:
|
||||
type: app-extension
|
||||
platform: iOS
|
||||
sources:
|
||||
- path: OpenLessKeyboard
|
||||
entitlements:
|
||||
path: OpenLessKeyboard/OpenLessKeyboard.entitlements
|
||||
info:
|
||||
path: OpenLessKeyboard/Info.plist
|
||||
properties:
|
||||
CFBundleDisplayName: OSGKeyboard
|
||||
CFBundleShortVersionString: "$(MARKETING_VERSION)"
|
||||
CFBundleVersion: "$(CURRENT_PROJECT_VERSION)"
|
||||
NSExtension:
|
||||
NSExtensionAttributes:
|
||||
IsASCIICapable: false
|
||||
PrefersRightToLeft: false
|
||||
PrimaryLanguage: "en-US"
|
||||
RequestsOpenAccess: true
|
||||
NSExtensionPointIdentifier: com.apple.keyboard-service
|
||||
NSExtensionPrincipalClass: $(PRODUCT_MODULE_NAME).KeyboardViewController
|
||||
settings:
|
||||
base:
|
||||
PRODUCT_BUNDLE_IDENTIFIER: com.osgkeyboard.ios.keyboard
|
||||
TARGETED_DEVICE_FAMILY: "1,2"
|
||||
dependencies:
|
||||
- target: OSGKeyboardShared
|
||||
embed: false
|
||||
|
||||
# =========================================================
|
||||
# Shared Framework (主 App 与扩展共用)
|
||||
# =========================================================
|
||||
OSGKeyboardShared:
|
||||
type: framework
|
||||
platform: iOS
|
||||
sources:
|
||||
- path: OpenLessShared
|
||||
info:
|
||||
path: OpenLessShared/Info.plist
|
||||
settings:
|
||||
base:
|
||||
PRODUCT_BUNDLE_IDENTIFIER: com.osgkeyboard.ios.shared
|
||||
DEFINES_MODULE: YES
|
||||
SKIP_INSTALL: YES
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION: NO
|
||||
DYLIB_INSTALL_NAME_BASE: "@rpath"
|
||||
APPLICATION_EXTENSION_API_ONLY: YES
|
||||
ENABLE_MODULE_VERIFIER: YES
|
||||
|
||||
# =========================================================
|
||||
# 单元测试
|
||||
# =========================================================
|
||||
OSGKeyboardTests:
|
||||
type: bundle.unit-test
|
||||
platform: iOS
|
||||
sources:
|
||||
- path: OpenLessTests
|
||||
info:
|
||||
path: OpenLessTests/Info.plist
|
||||
dependencies:
|
||||
- target: OSGKeyboard
|
||||
settings:
|
||||
base:
|
||||
PRODUCT_BUNDLE_IDENTIFIER: com.osgkeyboard.ios.tests
|
||||
|
||||
schemes:
|
||||
OSGKeyboard:
|
||||
build:
|
||||
targets:
|
||||
OSGKeyboard: all
|
||||
OSGKeyboardExt: all
|
||||
run:
|
||||
config: Debug
|
||||
test:
|
||||
config: Debug
|
||||
targets:
|
||||
- OSGKeyboardTests
|
||||
archive:
|
||||
config: Release
|
||||
Reference in New Issue
Block a user