@cometchat/skills 4.4.2 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +55 -0
- package/.claude-plugin/plugin.json +14 -0
- package/CHANGELOG.md +44 -0
- package/LICENSE +21 -0
- package/MIGRATING.md +187 -0
- package/README.md +52 -156
- package/RULES.md +125 -0
- package/bin/cometchat-skills.mjs +1280 -0
- package/bin/legacy-skills.json +95 -0
- package/catalogs/android-v6.json +1646 -0
- package/catalogs/flutter-v6.json +651 -0
- package/catalogs/ios-v5.json +1383 -0
- package/catalogs/rn-calls-v5.json +134 -0
- package/catalogs/rn-calls-v5.symbols.txt +58 -0
- package/catalogs/rn-sdk-v4.json +672 -0
- package/catalogs/rn-v5.json +449 -0
- package/catalogs/rn-v5.symbols.txt +216 -0
- package/catalogs/sdk-android-v5.json +514 -0
- package/contracts.android-calls-v5.json +122 -0
- package/contracts.android-v6.json +135 -0
- package/contracts.angular-v5.json +694 -0
- package/contracts.flutter-calls-v5.json +77 -0
- package/contracts.flutter-v6.json +126 -0
- package/contracts.ios-calls-v5.json +67 -0
- package/contracts.ios-v5.json +436 -0
- package/contracts.json +82 -0
- package/contracts.rn-calls-v5.json +77 -0
- package/contracts.rn-v5.json +727 -0
- package/contracts.sdk-android-v5.json +15 -0
- package/contracts.web-calls-v5.json +45 -0
- package/features.android-calls-v5.json +246 -0
- package/features.android-v6.json +65 -0
- package/features.angular-v5.json +521 -0
- package/features.flutter-calls-v5.json +286 -0
- package/features.flutter-v6.json +484 -0
- package/features.ios-calls-v5.json +236 -0
- package/features.ios-v5.json +573 -0
- package/features.json +61 -0
- package/features.rn-calls-v5.json +187 -0
- package/features.rn-v5.json +614 -0
- package/features.sdk-android-v5.json +40 -0
- package/features.sdk-jsv4.json +24 -0
- package/features.web-calls-v5.json +108 -0
- package/package.json +156 -74
- package/peers.yaml +355 -0
- package/registry/README.md +31 -0
- package/registry/android-calls-v5.json +94 -0
- package/registry/android-v6.json +177 -0
- package/registry/angular-v5.json +154 -0
- package/registry/flutter-calls-v5.json +94 -0
- package/registry/flutter-v6.json +159 -0
- package/registry/ios-calls-v5.json +99 -0
- package/registry/ios-v5.json +152 -0
- package/registry/rn-calls-v5.json +99 -0
- package/registry/rn-v5.json +169 -0
- package/registry/sdk-android-v5.json +93 -0
- package/registry/sdk-jsv4.json +93 -0
- package/registry/web-calls-v5.json +94 -0
- package/registry/web-v7.json +154 -0
- package/skills/cometchat/SKILL.md +47 -2096
- package/skills/cometchat-a11y/SKILL.md +44 -472
- package/skills/cometchat-analytics/SKILL.md +61 -0
- package/skills/cometchat-android-v5-calls-sdk/SKILL.md +206 -0
- package/skills/cometchat-android-v5-calls-sdk/references/build-truth.md +63 -0
- package/skills/cometchat-android-v5-calls-sdk/references/docs-map.md +119 -0
- package/skills/cometchat-android-v5-calls-sdk/references/method-map.md +53 -0
- package/skills/cometchat-android-v5-calls-sdk/references/pitfalls.md +72 -0
- package/skills/cometchat-android-v5-calls-sdk/references/ringing.md +92 -0
- package/skills/cometchat-android-v5-calls-sdk/references/user-switch.md +90 -0
- package/skills/cometchat-android-v5-sdk/SKILL.md +127 -0
- package/skills/cometchat-android-v5-sdk/references/app-surface.md +88 -0
- package/skills/cometchat-android-v5-sdk/references/docs-map.md +91 -0
- package/skills/cometchat-android-v6-builder-settings/SKILL.md +51 -137
- package/skills/cometchat-android-v6-calls/SKILL.md +128 -413
- package/skills/cometchat-android-v6-compose-components/SKILL.md +84 -194
- package/skills/cometchat-android-v6-compose-customization/SKILL.md +66 -411
- package/skills/cometchat-android-v6-compose-placement/SKILL.md +154 -237
- package/skills/cometchat-android-v6-core/SKILL.md +236 -672
- package/skills/cometchat-android-v6-core/references/anti-patterns.md +31 -0
- package/skills/cometchat-android-v6-core/references/component-props.md +168 -0
- package/skills/cometchat-android-v6-core/references/docs-map.md +153 -0
- package/skills/cometchat-android-v6-core/references/layout.md +112 -0
- package/skills/cometchat-android-v6-core/references/lifecycle.md +75 -0
- package/skills/cometchat-android-v6-core/references/setup-credentials.md +105 -0
- package/skills/cometchat-android-v6-core/references/troubleshooting.md +36 -0
- package/skills/cometchat-android-v6-events/SKILL.md +46 -184
- package/skills/cometchat-android-v6-extensions/SKILL.md +39 -179
- package/skills/cometchat-android-v6-features/SKILL.md +74 -143
- package/skills/cometchat-android-v6-kotlin-components/SKILL.md +75 -193
- package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +67 -419
- package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +77 -223
- package/skills/cometchat-android-v6-migration/SKILL.md +67 -378
- package/skills/cometchat-android-v6-production/SKILL.md +41 -179
- package/skills/cometchat-android-v6-push/SKILL.md +39 -289
- package/skills/cometchat-android-v6-testing/SKILL.md +50 -265
- package/skills/cometchat-android-v6-troubleshooting/SKILL.md +70 -254
- package/skills/cometchat-angular-v5-calls/SKILL.md +193 -0
- package/skills/cometchat-angular-v5-components/SKILL.md +131 -0
- package/skills/cometchat-angular-v5-components/references/catalog.md +111 -0
- package/skills/cometchat-angular-v5-components/references/host-composed.md +46 -0
- package/skills/cometchat-angular-v5-core/SKILL.md +300 -0
- package/skills/cometchat-angular-v5-core/references/anti-patterns.md +49 -0
- package/skills/cometchat-angular-v5-core/references/component-props.md +55 -0
- package/skills/cometchat-angular-v5-core/references/dependencies.md +66 -0
- package/skills/cometchat-angular-v5-core/references/docs-map.md +132 -0
- package/skills/cometchat-angular-v5-core/references/layout.md +64 -0
- package/skills/cometchat-angular-v5-core/references/lifecycle.md +202 -0
- package/skills/cometchat-angular-v5-core/references/setup-credentials.md +137 -0
- package/skills/cometchat-angular-v5-core/references/theming.md +70 -0
- package/skills/cometchat-angular-v5-core/references/troubleshooting.md +27 -0
- package/skills/cometchat-angular-v5-customization/SKILL.md +94 -0
- package/skills/cometchat-angular-v5-features/SKILL.md +107 -0
- package/skills/cometchat-angular-v5-features/references/custom-messages.md +133 -0
- package/skills/cometchat-angular-v5-features/references/formatters.md +28 -0
- package/skills/cometchat-angular-v5-features/references/host-composed-extensions.md +85 -0
- package/skills/cometchat-angular-v5-migration/SKILL.md +40 -0
- package/skills/cometchat-angular-v5-migration/references/migration-guide.md +165 -0
- package/skills/cometchat-angular-v5-patterns/SKILL.md +107 -0
- package/skills/cometchat-angular-v5-placement/SKILL.md +133 -0
- package/skills/cometchat-angular-v5-placement/references/combined-app.md +174 -0
- package/skills/cometchat-angular-v5-placement/references/core-surface.md +199 -0
- package/skills/cometchat-angular-v5-production/SKILL.md +102 -0
- package/skills/cometchat-angular-v5-push/SKILL.md +61 -0
- package/skills/cometchat-angular-v5-testing/SKILL.md +112 -0
- package/skills/cometchat-angular-v5-troubleshooting/SKILL.md +96 -0
- package/skills/cometchat-audit/SKILL.md +61 -0
- package/skills/cometchat-compliance/SKILL.md +63 -0
- package/skills/cometchat-flutter-v5-sdk/SKILL.md +188 -0
- package/skills/cometchat-flutter-v5-sdk/references/doc-corrections.md +55 -0
- package/skills/cometchat-flutter-v5-sdk/references/docs-map.md +211 -0
- package/skills/cometchat-flutter-v5-sdk/references/platform-notes.md +48 -0
- package/skills/cometchat-flutter-v5-sdk/references/transcription.md +87 -0
- package/skills/cometchat-flutter-v6-calls/SKILL.md +75 -389
- package/skills/cometchat-flutter-v6-components/SKILL.md +88 -361
- package/skills/cometchat-flutter-v6-core/SKILL.md +154 -593
- package/skills/cometchat-flutter-v6-core/references/anti-patterns.md +55 -0
- package/skills/cometchat-flutter-v6-core/references/docs-map.md +143 -0
- package/skills/cometchat-flutter-v6-core/references/layout.md +45 -0
- package/skills/cometchat-flutter-v6-core/references/lifecycle.md +87 -0
- package/skills/cometchat-flutter-v6-core/references/setup-credentials.md +84 -0
- package/skills/cometchat-flutter-v6-core/references/troubleshooting.md +26 -0
- package/skills/cometchat-flutter-v6-customization/SKILL.md +70 -712
- package/skills/cometchat-flutter-v6-events/SKILL.md +79 -174
- package/skills/cometchat-flutter-v6-features/SKILL.md +55 -394
- package/skills/cometchat-flutter-v6-migration/SKILL.md +68 -367
- package/skills/cometchat-flutter-v6-migration/references/migration-guide.md +132 -0
- package/skills/cometchat-flutter-v6-patterns/SKILL.md +61 -0
- package/skills/cometchat-flutter-v6-placement/SKILL.md +94 -381
- package/skills/cometchat-flutter-v6-production/SKILL.md +59 -615
- package/skills/cometchat-flutter-v6-push/SKILL.md +46 -455
- package/skills/cometchat-flutter-v6-testing/SKILL.md +68 -299
- package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +54 -878
- package/skills/cometchat-i18n/SKILL.md +35 -404
- package/skills/cometchat-ios-calls/SKILL.md +112 -563
- package/skills/cometchat-ios-components/SKILL.md +44 -834
- package/skills/cometchat-ios-core/SKILL.md +182 -1068
- package/skills/cometchat-ios-core/references/anti-patterns.md +113 -0
- package/skills/cometchat-ios-core/references/docs-map.md +124 -0
- package/skills/cometchat-ios-core/references/install.md +23 -0
- package/skills/cometchat-ios-core/references/layout.md +219 -0
- package/skills/cometchat-ios-core/references/setup-credentials.md +197 -0
- package/skills/cometchat-ios-core/references/swiftui.md +91 -0
- package/skills/cometchat-ios-core/references/troubleshooting.md +100 -0
- package/skills/cometchat-ios-customization/SKILL.md +33 -968
- package/skills/cometchat-ios-features/SKILL.md +29 -738
- package/skills/cometchat-ios-migration/SKILL.md +39 -0
- package/skills/cometchat-ios-placement/SKILL.md +51 -729
- package/skills/cometchat-ios-production/SKILL.md +67 -723
- package/skills/cometchat-ios-push/SKILL.md +24 -602
- package/skills/cometchat-ios-testing/SKILL.md +36 -355
- package/skills/cometchat-ios-troubleshooting/SKILL.md +31 -989
- package/skills/cometchat-ios-v5-sdk/SKILL.md +161 -0
- package/skills/cometchat-ios-v5-sdk/references/docs-map.md +326 -0
- package/skills/cometchat-js-v5-sdk/SKILL.md +95 -0
- package/skills/cometchat-js-v5-sdk/references/docs-map.md +114 -0
- package/skills/cometchat-migrate-from-getstream/SKILL.md +65 -0
- package/skills/cometchat-migrate-from-getstream/references/concept-map.md +98 -0
- package/skills/cometchat-migrate-from-getstream/references/data-migration.md +74 -0
- package/skills/cometchat-migrate-from-getstream/references/feature-map.md +108 -0
- package/skills/cometchat-migrate-from-getstream/references/inventory.md +82 -0
- package/skills/cometchat-migrate-from-getstream/references/native-build.md +9 -0
- package/skills/cometchat-migrate-from-getstream/references/report-template.md +59 -0
- package/skills/cometchat-migrate-from-sendbird/SKILL.md +64 -0
- package/skills/cometchat-migrate-from-sendbird/references/concept-map.md +99 -0
- package/skills/cometchat-migrate-from-sendbird/references/data-migration.md +74 -0
- package/skills/cometchat-migrate-from-sendbird/references/feature-map.md +104 -0
- package/skills/cometchat-migrate-from-sendbird/references/inventory.md +86 -0
- package/skills/cometchat-migrate-from-sendbird/references/native-build.md +10 -0
- package/skills/cometchat-migrate-from-sendbird/references/report-template.md +59 -0
- package/skills/cometchat-migrate-from-twilio/SKILL.md +52 -0
- package/skills/cometchat-migrate-from-twilio/references/concept-map.md +49 -0
- package/skills/cometchat-migrate-from-twilio/references/data-migration.md +50 -0
- package/skills/cometchat-migrate-from-twilio/references/feature-map.md +27 -0
- package/skills/cometchat-migrate-from-twilio/references/inventory.md +53 -0
- package/skills/cometchat-migrate-from-twilio/references/report-template.md +52 -0
- package/skills/cometchat-moderation/SKILL.md +58 -0
- package/skills/cometchat-onboarding/SKILL.md +92 -0
- package/skills/cometchat-onboarding/references/archetypes.md +51 -0
- package/skills/cometchat-onboarding/references/calling-first.md +77 -0
- package/skills/cometchat-onboarding/references/not-in-this-pack.md +8 -0
- package/skills/cometchat-onboarding/references/plan-artifact.md +133 -0
- package/skills/cometchat-onboarding/references/platforms.md +105 -0
- package/skills/cometchat-react-native-bare-patterns/SKILL.md +120 -0
- package/skills/cometchat-react-native-calls/SKILL.md +200 -0
- package/skills/cometchat-react-native-components/SKILL.md +142 -0
- package/skills/cometchat-react-native-core/SKILL.md +335 -0
- package/skills/cometchat-react-native-core/references/anti-patterns.md +79 -0
- package/skills/cometchat-react-native-core/references/component-props.md +105 -0
- package/skills/cometchat-react-native-core/references/dependencies.md +62 -0
- package/skills/cometchat-react-native-core/references/docs-map.md +127 -0
- package/skills/cometchat-react-native-core/references/layout.md +61 -0
- package/skills/cometchat-react-native-core/references/lifecycle.md +64 -0
- package/skills/cometchat-react-native-core/references/setup-credentials.md +39 -0
- package/skills/cometchat-react-native-customization/SKILL.md +198 -0
- package/skills/cometchat-react-native-expo-patterns/SKILL.md +116 -0
- package/skills/cometchat-react-native-features/SKILL.md +122 -0
- package/skills/cometchat-react-native-migration/SKILL.md +103 -0
- package/skills/cometchat-react-native-placement/SKILL.md +158 -0
- package/skills/cometchat-react-native-production/SKILL.md +79 -0
- package/skills/cometchat-react-native-push/SKILL.md +88 -0
- package/skills/cometchat-react-native-sdk/SKILL.md +133 -0
- package/skills/cometchat-react-native-sdk/references/method-map.md +239 -0
- package/skills/cometchat-react-native-sdk/references/page-map.md +96 -0
- package/skills/cometchat-react-native-testing/SKILL.md +94 -0
- package/skills/cometchat-react-native-troubleshooting/SKILL.md +174 -0
- package/skills/cometchat-react-native-v5-sdk/SKILL.md +150 -0
- package/skills/cometchat-react-native-v5-sdk/references/docs-map.md +127 -0
- package/skills/cometchat-react-native-v5-sdk/references/ringing-voip.md +369 -0
- package/skills/cometchat-react-v7-calls/SKILL.md +75 -0
- package/skills/cometchat-react-v7-components/SKILL.md +72 -0
- package/skills/cometchat-react-v7-core/SKILL.md +101 -0
- package/skills/cometchat-react-v7-core/references/anti-patterns.md +19 -0
- package/skills/cometchat-react-v7-core/references/component-props.md +82 -0
- package/skills/cometchat-react-v7-core/references/dependencies.md +23 -0
- package/skills/cometchat-react-v7-core/references/docs-map.md +117 -0
- package/skills/cometchat-react-v7-core/references/layout.md +150 -0
- package/skills/cometchat-react-v7-core/references/lifecycle.md +74 -0
- package/skills/cometchat-react-v7-core/references/setup-credentials.md +58 -0
- package/skills/cometchat-react-v7-core/references/ssr.md +11 -0
- package/skills/cometchat-react-v7-core/references/theming.md +52 -0
- package/skills/cometchat-react-v7-customization/SKILL.md +84 -0
- package/skills/cometchat-react-v7-features/SKILL.md +92 -0
- package/skills/cometchat-react-v7-migration/SKILL.md +39 -0
- package/skills/cometchat-react-v7-migration/references/migration-guide.md +119 -0
- package/skills/cometchat-react-v7-patterns/SKILL.md +43 -0
- package/skills/cometchat-react-v7-placement/SKILL.md +106 -0
- package/skills/cometchat-react-v7-placement/references/recipes.md +354 -0
- package/skills/cometchat-react-v7-production/SKILL.md +84 -0
- package/skills/cometchat-react-v7-push/SKILL.md +53 -0
- package/skills/cometchat-react-v7-testing/SKILL.md +60 -0
- package/skills/cometchat-react-v7-troubleshooting/SKILL.md +47 -0
- package/skills/cometchat-security/SKILL.md +80 -0
- package/skills/cometchat-self-host/SKILL.md +56 -0
- package/test-suite/README.md +70 -0
- package/test-suite/catalogs/android-calls-v5.json +830 -0
- package/test-suite/catalogs/android-calls-v5.symbols.txt +499 -0
- package/test-suite/catalogs/android-v6.json +1646 -0
- package/test-suite/catalogs/android-v6.symbols.txt +298 -0
- package/test-suite/catalogs/angular-v5.json +7587 -0
- package/test-suite/catalogs/flutter-calls-v5.json +196 -0
- package/test-suite/catalogs/flutter-calls-v5.symbols.txt +59 -0
- package/test-suite/catalogs/flutter-v6.json +651 -0
- package/test-suite/catalogs/ios-calls-v5.json +158 -0
- package/test-suite/catalogs/ios-calls-v5.symbols.txt +70 -0
- package/test-suite/catalogs/ios-v5.json +1383 -0
- package/test-suite/catalogs/ios-v5.symbols.txt +699 -0
- package/test-suite/catalogs/rn-calls-v5.json +134 -0
- package/test-suite/catalogs/rn-sdk-v4.json +672 -0
- package/test-suite/catalogs/rn-v5.json +449 -0
- package/test-suite/catalogs/sdk-android-v5.json +514 -0
- package/test-suite/catalogs/sdk-android-v5.symbols.txt +254 -0
- package/test-suite/catalogs/sdk-jsv4.json +800 -0
- package/test-suite/catalogs/web-calls-v5.json +195 -0
- package/test-suite/catalogs/web-v7.json +1243 -0
- package/test-suite/scripts/build-registry.mjs +113 -0
- package/test-suite/scripts/catalog-refresh-dart.mjs +151 -0
- package/test-suite/scripts/catalog-refresh.mjs +100 -0
- package/test-suite/scripts/lint-skills.mjs +932 -0
- package/test-suite/scripts/measure-tokens.mjs +169 -0
- package/test-suite/scripts/typecheck-fences-dart.mjs +437 -0
- package/test-suite/scripts/typecheck-fences-kotlin.mjs +269 -0
- package/test-suite/scripts/typecheck-fences.mjs +206 -0
- package/test-suite/scripts/verify-catalog.mjs +242 -0
- package/test-suite/scripts/verify-contract-fences.mjs +94 -0
- package/test-suite/scripts/verify-detection.mjs +178 -0
- package/test-suite/scripts/verify-docs-base.mjs +91 -0
- package/test-suite/scripts/verify-family-agnostic.mjs +134 -0
- package/test-suite/scripts/verify-golden-path.mjs +138 -0
- package/test-suite/scripts/verify-oracle-components.mjs +133 -0
- package/test-suite/scripts/verify-template-bindings.mjs +148 -0
- package/test-suite/typecheck/angular-v5/package.json +21 -0
- package/test-suite/typecheck/angular-v5/tsconfig.json +21 -0
- package/test-suite/typecheck/flutter-v6/analysis_options.yaml +25 -0
- package/test-suite/typecheck/flutter-v6/pubspec.yaml +21 -0
- package/test-suite/typecheck/web-v7/package.json +18 -0
- package/test-suite/typecheck/web-v7/tsconfig.json +19 -0
- package/bin/install.js +0 -1003
- package/skills/.claude-plugin/marketplace.json +0 -86
- package/skills/cometchat/references/asking-questions.md +0 -48
- package/skills/cometchat-android-v5/SKILL.md +0 -121
- package/skills/cometchat-android-v5-calls/SKILL.md +0 -429
- package/skills/cometchat-android-v5-calls/references/README.md +0 -53
- package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +0 -197
- package/skills/cometchat-android-v5-calls/references/audio-controls.md +0 -91
- package/skills/cometchat-android-v5-calls/references/background-handling.md +0 -168
- package/skills/cometchat-android-v5-calls/references/call-layouts.md +0 -131
- package/skills/cometchat-android-v5-calls/references/call-logs.md +0 -113
- package/skills/cometchat-android-v5-calls/references/call-session.md +0 -274
- package/skills/cometchat-android-v5-calls/references/custom-ui.md +0 -150
- package/skills/cometchat-android-v5-calls/references/event-listeners.md +0 -123
- package/skills/cometchat-android-v5-calls/references/group-calls.md +0 -205
- package/skills/cometchat-android-v5-calls/references/idle-timeout.md +0 -117
- package/skills/cometchat-android-v5-calls/references/in-call-chat.md +0 -134
- package/skills/cometchat-android-v5-calls/references/join-session.md +0 -120
- package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +0 -222
- package/skills/cometchat-android-v5-calls/references/participant-management.md +0 -110
- package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +0 -106
- package/skills/cometchat-android-v5-calls/references/raise-hand.md +0 -248
- package/skills/cometchat-android-v5-calls/references/recording.md +0 -101
- package/skills/cometchat-android-v5-calls/references/ringing-integration.md +0 -152
- package/skills/cometchat-android-v5-calls/references/screen-sharing.md +0 -78
- package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +0 -215
- package/skills/cometchat-android-v5-calls/references/session-settings.md +0 -121
- package/skills/cometchat-android-v5-calls/references/setup.md +0 -137
- package/skills/cometchat-android-v5-calls/references/share-invite.md +0 -156
- package/skills/cometchat-android-v5-calls/references/video-controls.md +0 -87
- package/skills/cometchat-android-v5-calls/references/voip-calling.md +0 -526
- package/skills/cometchat-android-v5-components/SKILL.md +0 -431
- package/skills/cometchat-android-v5-core/SKILL.md +0 -486
- package/skills/cometchat-android-v5-customization/SKILL.md +0 -469
- package/skills/cometchat-android-v5-extensions/SKILL.md +0 -127
- package/skills/cometchat-android-v5-features/SKILL.md +0 -131
- package/skills/cometchat-android-v5-placement/SKILL.md +0 -277
- package/skills/cometchat-android-v5-production/SKILL.md +0 -95
- package/skills/cometchat-android-v5-push/SKILL.md +0 -619
- package/skills/cometchat-android-v5-testing/SKILL.md +0 -188
- package/skills/cometchat-android-v5-theming/SKILL.md +0 -167
- package/skills/cometchat-android-v5-troubleshooting/SKILL.md +0 -74
- package/skills/cometchat-android-v6/SKILL.md +0 -108
- package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +0 -97
- package/skills/cometchat-android-v6-calls/references/advanced-features.md +0 -87
- package/skills/cometchat-android-v6-calls/references/call-layouts.md +0 -100
- package/skills/cometchat-android-v6-calls/references/call-session.md +0 -163
- package/skills/cometchat-android-v6-calls/references/device-management.md +0 -172
- package/skills/cometchat-android-v6-calls/references/group-calls.md +0 -191
- package/skills/cometchat-android-v6-calls/references/idle-timeout.md +0 -110
- package/skills/cometchat-android-v6-calls/references/in-call-chat.md +0 -141
- package/skills/cometchat-android-v6-calls/references/raise-hand.md +0 -188
- package/skills/cometchat-android-v6-calls/references/ringing-integration.md +0 -176
- package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +0 -127
- package/skills/cometchat-android-v6-calls/references/share-invite.md +0 -105
- package/skills/cometchat-android-v6-compose-theming/SKILL.md +0 -250
- package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +0 -233
- package/skills/cometchat-angular-calls/SKILL.md +0 -380
- package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +0 -96
- package/skills/cometchat-angular-calls/references/call-layouts.md +0 -123
- package/skills/cometchat-angular-calls/references/call-session.md +0 -167
- package/skills/cometchat-angular-calls/references/custom-ui.md +0 -239
- package/skills/cometchat-angular-calls/references/device-management.md +0 -154
- package/skills/cometchat-angular-calls/references/group-calls.md +0 -433
- package/skills/cometchat-angular-calls/references/idle-timeout.md +0 -161
- package/skills/cometchat-angular-calls/references/in-call-chat.md +0 -148
- package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +0 -205
- package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +0 -53
- package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +0 -184
- package/skills/cometchat-angular-calls/references/picture-in-picture.md +0 -285
- package/skills/cometchat-angular-calls/references/raise-hand.md +0 -172
- package/skills/cometchat-angular-calls/references/recording-screen-share.md +0 -260
- package/skills/cometchat-angular-calls/references/ringing-integration.md +0 -133
- package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +0 -100
- package/skills/cometchat-angular-calls/references/share-invite.md +0 -122
- package/skills/cometchat-angular-calls/references/virtual-background.md +0 -29
- package/skills/cometchat-angular-components/SKILL.md +0 -235
- package/skills/cometchat-angular-core/SKILL.md +0 -386
- package/skills/cometchat-angular-customization/SKILL.md +0 -616
- package/skills/cometchat-angular-features/SKILL.md +0 -329
- package/skills/cometchat-angular-patterns/SKILL.md +0 -256
- package/skills/cometchat-angular-placement/SKILL.md +0 -314
- package/skills/cometchat-angular-production/SKILL.md +0 -564
- package/skills/cometchat-angular-push/SKILL.md +0 -389
- package/skills/cometchat-angular-testing/SKILL.md +0 -605
- package/skills/cometchat-angular-theming/SKILL.md +0 -290
- package/skills/cometchat-angular-troubleshooting/SKILL.md +0 -364
- package/skills/cometchat-astro-patterns/SKILL.md +0 -708
- package/skills/cometchat-calls/SKILL.md +0 -364
- package/skills/cometchat-calls/references/use-case-broadcast.md +0 -199
- package/skills/cometchat-calls/references/use-case-marketplace.md +0 -157
- package/skills/cometchat-calls/references/use-case-support.md +0 -189
- package/skills/cometchat-calls/references/use-case-team.md +0 -180
- package/skills/cometchat-calls/references/use-case-telehealth.md +0 -153
- package/skills/cometchat-components/SKILL.md +0 -1142
- package/skills/cometchat-core/SKILL.md +0 -1048
- package/skills/cometchat-customization/SKILL.md +0 -580
- package/skills/cometchat-customization/references/component-catalog.md +0 -236
- package/skills/cometchat-features/SKILL.md +0 -861
- package/skills/cometchat-flutter-v5/SKILL.md +0 -173
- package/skills/cometchat-flutter-v5-calls/SKILL.md +0 -455
- package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +0 -193
- package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +0 -103
- package/skills/cometchat-flutter-v5-calls/references/call-session.md +0 -285
- package/skills/cometchat-flutter-v5-calls/references/device-management.md +0 -124
- package/skills/cometchat-flutter-v5-calls/references/group-calls.md +0 -181
- package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +0 -99
- package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +0 -135
- package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +0 -210
- package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +0 -255
- package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +0 -196
- package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +0 -101
- package/skills/cometchat-flutter-v5-calls/references/share-invite.md +0 -148
- package/skills/cometchat-flutter-v5-conversations/SKILL.md +0 -118
- package/skills/cometchat-flutter-v5-core/SKILL.md +0 -239
- package/skills/cometchat-flutter-v5-customization/SKILL.md +0 -358
- package/skills/cometchat-flutter-v5-events/SKILL.md +0 -156
- package/skills/cometchat-flutter-v5-messages/SKILL.md +0 -259
- package/skills/cometchat-flutter-v5-production/SKILL.md +0 -216
- package/skills/cometchat-flutter-v5-push/SKILL.md +0 -285
- package/skills/cometchat-flutter-v5-testing/SKILL.md +0 -401
- package/skills/cometchat-flutter-v5-theming/SKILL.md +0 -161
- package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +0 -130
- package/skills/cometchat-flutter-v5-users-groups/SKILL.md +0 -152
- package/skills/cometchat-flutter-v6/SKILL.md +0 -446
- package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +0 -136
- package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +0 -89
- package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +0 -105
- package/skills/cometchat-flutter-v6-calls/references/call-session.md +0 -229
- package/skills/cometchat-flutter-v6-calls/references/device-management.md +0 -105
- package/skills/cometchat-flutter-v6-calls/references/group-calls.md +0 -190
- package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +0 -88
- package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +0 -125
- package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +0 -275
- package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +0 -171
- package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +0 -93
- package/skills/cometchat-flutter-v6-calls/references/share-invite.md +0 -102
- package/skills/cometchat-flutter-v6-conversations/SKILL.md +0 -238
- package/skills/cometchat-flutter-v6-messages/SKILL.md +0 -384
- package/skills/cometchat-flutter-v6-theming/SKILL.md +0 -293
- package/skills/cometchat-flutter-v6-users-groups/SKILL.md +0 -224
- package/skills/cometchat-ios/SKILL.md +0 -325
- package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +0 -181
- package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +0 -45
- package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +0 -188
- package/skills/cometchat-ios-calls/references/call-layouts.md +0 -76
- package/skills/cometchat-ios-calls/references/call-session.md +0 -218
- package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +0 -357
- package/skills/cometchat-ios-calls/references/custom-ui.md +0 -322
- package/skills/cometchat-ios-calls/references/device-management.md +0 -171
- package/skills/cometchat-ios-calls/references/group-calls.md +0 -359
- package/skills/cometchat-ios-calls/references/idle-timeout.md +0 -184
- package/skills/cometchat-ios-calls/references/in-call-chat.md +0 -179
- package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +0 -196
- package/skills/cometchat-ios-calls/references/picture-in-picture.md +0 -246
- package/skills/cometchat-ios-calls/references/raise-hand.md +0 -26
- package/skills/cometchat-ios-calls/references/recording-screen-share.md +0 -252
- package/skills/cometchat-ios-calls/references/ringing-integration.md +0 -143
- package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +0 -267
- package/skills/cometchat-ios-calls/references/share-invite.md +0 -148
- package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +0 -246
- package/skills/cometchat-ios-calls/references/voip-cert-setup.md +0 -166
- package/skills/cometchat-ios-theming/SKILL.md +0 -667
- package/skills/cometchat-native-bare-patterns/SKILL.md +0 -550
- package/skills/cometchat-native-calls/SKILL.md +0 -671
- package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +0 -203
- package/skills/cometchat-native-calls/references/call-layouts.md +0 -125
- package/skills/cometchat-native-calls/references/call-session.md +0 -182
- package/skills/cometchat-native-calls/references/custom-ui.md +0 -254
- package/skills/cometchat-native-calls/references/device-management.md +0 -158
- package/skills/cometchat-native-calls/references/expo-vs-bare.md +0 -179
- package/skills/cometchat-native-calls/references/group-calls.md +0 -296
- package/skills/cometchat-native-calls/references/idle-timeout.md +0 -128
- package/skills/cometchat-native-calls/references/in-call-chat.md +0 -145
- package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +0 -72
- package/skills/cometchat-native-calls/references/picture-in-picture.md +0 -276
- package/skills/cometchat-native-calls/references/raise-hand.md +0 -205
- package/skills/cometchat-native-calls/references/recording-screen-share.md +0 -169
- package/skills/cometchat-native-calls/references/ringing-integration.md +0 -118
- package/skills/cometchat-native-calls/references/server-push-bridge.md +0 -135
- package/skills/cometchat-native-calls/references/server-push-payloads.md +0 -193
- package/skills/cometchat-native-calls/references/share-invite.md +0 -146
- package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +0 -319
- package/skills/cometchat-native-components/SKILL.md +0 -628
- package/skills/cometchat-native-core/SKILL.md +0 -679
- package/skills/cometchat-native-customization/SKILL.md +0 -716
- package/skills/cometchat-native-expo-patterns/SKILL.md +0 -552
- package/skills/cometchat-native-features/SKILL.md +0 -638
- package/skills/cometchat-native-placement/SKILL.md +0 -509
- package/skills/cometchat-native-production/SKILL.md +0 -700
- package/skills/cometchat-native-push/SKILL.md +0 -594
- package/skills/cometchat-native-testing/SKILL.md +0 -582
- package/skills/cometchat-native-theming/SKILL.md +0 -681
- package/skills/cometchat-native-troubleshooting/SKILL.md +0 -501
- package/skills/cometchat-nextjs-patterns/SKILL.md +0 -899
- package/skills/cometchat-placement/SKILL.md +0 -1360
- package/skills/cometchat-production/SKILL.md +0 -1027
- package/skills/cometchat-react-calls/SKILL.md +0 -752
- package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +0 -146
- package/skills/cometchat-react-calls/references/call-layouts.md +0 -160
- package/skills/cometchat-react-calls/references/call-session.md +0 -235
- package/skills/cometchat-react-calls/references/custom-ui.md +0 -247
- package/skills/cometchat-react-calls/references/device-management.md +0 -210
- package/skills/cometchat-react-calls/references/group-calls.md +0 -257
- package/skills/cometchat-react-calls/references/idle-timeout.md +0 -188
- package/skills/cometchat-react-calls/references/in-call-chat.md +0 -212
- package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +0 -170
- package/skills/cometchat-react-calls/references/picture-in-picture.md +0 -245
- package/skills/cometchat-react-calls/references/raise-hand.md +0 -238
- package/skills/cometchat-react-calls/references/recording-screen-share.md +0 -144
- package/skills/cometchat-react-calls/references/ringing-integration.md +0 -255
- package/skills/cometchat-react-calls/references/server-web-push-vapid.md +0 -241
- package/skills/cometchat-react-calls/references/share-invite.md +0 -175
- package/skills/cometchat-react-calls/references/testing-calls-on-web.md +0 -216
- package/skills/cometchat-react-calls/references/virtual-background.md +0 -32
- package/skills/cometchat-react-calls/references/voip-and-web-push.md +0 -165
- package/skills/cometchat-react-patterns/SKILL.md +0 -628
- package/skills/cometchat-react-push/SKILL.md +0 -634
- package/skills/cometchat-react-router-patterns/SKILL.md +0 -758
- package/skills/cometchat-react-testing/SKILL.md +0 -413
- package/skills/cometchat-theming/SKILL.md +0 -498
- package/skills/cometchat-troubleshooting/SKILL.md +0 -294
|
@@ -1,322 +0,0 @@
|
|
|
1
|
-
# Custom call UI on iOS
|
|
2
|
-
|
|
3
|
-
Same shape as the other families' custom-ui references. iOS-specific because of CallKit interplay (rule 1.7: CallKit owns standalone-mode incoming UI, so custom in-app incoming UI is additive-mode-only) and AVFoundation routing.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Two paths
|
|
8
|
-
|
|
9
|
-
1. **Style the kit's `CometChatOngoingCall`** UIViewController via theming + property overrides. Cheapest. Covers most apps.
|
|
10
|
-
2. **Build your own UIViewController on the SDK** — direct `CometChatCalls.generateToken` → `startSession` with your own UIView container. Maximum control.
|
|
11
|
-
|
|
12
|
-
This reference covers path 2.
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## Architecture
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
Your UIViewController
|
|
20
|
-
├── containerView for remote participant(s) ← UIView the SDK draws into
|
|
21
|
-
├── localPreviewView ← AVCaptureVideoPreviewLayer or SDK preview
|
|
22
|
-
├── controlPanel (mute / camera / end / switch)
|
|
23
|
-
└── statusLabel (call state, duration)
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
The Calls SDK draws video into UIViews you provide. You don't render WebRTC tracks yourself (unlike web/RN where you wire `<video>` elements).
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## Custom OngoingCallViewController
|
|
31
|
-
|
|
32
|
-
```swift
|
|
33
|
-
import UIKit
|
|
34
|
-
import AVFoundation
|
|
35
|
-
import CometChatCallsSDK
|
|
36
|
-
|
|
37
|
-
class CustomOngoingCallViewController: UIViewController {
|
|
38
|
-
private let containerView = UIView()
|
|
39
|
-
private let localPreviewView = UIView()
|
|
40
|
-
private lazy var controlPanel = ControlPanelView()
|
|
41
|
-
private let statusLabel = UILabel()
|
|
42
|
-
|
|
43
|
-
private let sessionID: String
|
|
44
|
-
private let isAudioOnly: Bool
|
|
45
|
-
private var muted = false
|
|
46
|
-
private var cameraOff = false
|
|
47
|
-
|
|
48
|
-
init(sessionID: String, isAudioOnly: Bool) {
|
|
49
|
-
self.sessionID = sessionID
|
|
50
|
-
self.isAudioOnly = isAudioOnly
|
|
51
|
-
super.init(nibName: nil, bundle: nil)
|
|
52
|
-
modalPresentationStyle = .fullScreen
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
required init?(coder: NSCoder) { fatalError() }
|
|
56
|
-
|
|
57
|
-
override func viewDidLoad() {
|
|
58
|
-
super.viewDidLoad()
|
|
59
|
-
view.backgroundColor = .black
|
|
60
|
-
setupLayout()
|
|
61
|
-
startCall()
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
override func viewWillDisappear(_ animated: Bool) {
|
|
65
|
-
super.viewWillDisappear(animated)
|
|
66
|
-
cleanup()
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
private func startCall() {
|
|
70
|
-
// Build CallSettings via CallSettingsBuilder. The CallsEventsDelegate is
|
|
71
|
-
// wired with setDelegate(_:); there is no SessionSettings/SessionSettingsBuilder.
|
|
72
|
-
let settings = CallSettingsBuilder()
|
|
73
|
-
.setIsAudioOnly(isAudioOnly)
|
|
74
|
-
.setStartVideoMuted(isAudioOnly)
|
|
75
|
-
.setStartAudioMuted(false)
|
|
76
|
-
.setDelegate(self)
|
|
77
|
-
.build()
|
|
78
|
-
|
|
79
|
-
// Configure audio session BEFORE starting
|
|
80
|
-
try? configureAudioSession()
|
|
81
|
-
|
|
82
|
-
// Two-step: generateToken THEN startSession into your container UIView.
|
|
83
|
-
// There is no single-call joinSession on the iOS Calls SDK v5.
|
|
84
|
-
// authToken: pass CometChat.getUserAuthToken() in additive (chat + calls)
|
|
85
|
-
// integrations; nil for session-only apps.
|
|
86
|
-
CometChatCalls.generateToken(authToken: nil, sessionID: sessionID) { [weak self] token in
|
|
87
|
-
guard let self = self, let token = token else { return }
|
|
88
|
-
CometChatCalls.startSession(
|
|
89
|
-
callToken: token,
|
|
90
|
-
callSetting: settings,
|
|
91
|
-
view: self.containerView
|
|
92
|
-
) { _ in
|
|
93
|
-
// session started — delegate already wired via setDelegate
|
|
94
|
-
} onError: { error in
|
|
95
|
-
print("startSession failed: \(error?.errorDescription ?? "unknown")")
|
|
96
|
-
}
|
|
97
|
-
} onError: { error in
|
|
98
|
-
print("generateToken failed: \(error?.errorDescription ?? "unknown")")
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
private func configureAudioSession() throws {
|
|
103
|
-
let session = AVAudioSession.sharedInstance()
|
|
104
|
-
try session.setCategory(
|
|
105
|
-
.playAndRecord,
|
|
106
|
-
mode: isAudioOnly ? .voiceChat : .videoChat,
|
|
107
|
-
options: [.allowBluetooth, .allowBluetoothA2DP, .defaultToSpeaker]
|
|
108
|
-
)
|
|
109
|
-
try session.setActive(true)
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
private func cleanup() {
|
|
113
|
-
CometChatCalls.endSession() // EXISTS on the static facade in v5
|
|
114
|
-
try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
private func setupLayout() {
|
|
118
|
-
[containerView, localPreviewView, controlPanel, statusLabel].forEach {
|
|
119
|
-
$0.translatesAutoresizingMaskIntoConstraints = false
|
|
120
|
-
view.addSubview($0)
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
NSLayoutConstraint.activate([
|
|
124
|
-
containerView.topAnchor.constraint(equalTo: view.topAnchor),
|
|
125
|
-
containerView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
|
|
126
|
-
containerView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
|
|
127
|
-
containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
|
|
128
|
-
|
|
129
|
-
localPreviewView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16),
|
|
130
|
-
localPreviewView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
|
|
131
|
-
localPreviewView.widthAnchor.constraint(equalToConstant: 120),
|
|
132
|
-
localPreviewView.heightAnchor.constraint(equalToConstant: 160),
|
|
133
|
-
|
|
134
|
-
controlPanel.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -16),
|
|
135
|
-
controlPanel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
|
|
136
|
-
controlPanel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
|
|
137
|
-
controlPanel.heightAnchor.constraint(equalToConstant: 80),
|
|
138
|
-
|
|
139
|
-
statusLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16),
|
|
140
|
-
statusLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
|
|
141
|
-
])
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
extension CustomOngoingCallViewController: CallsEventsDelegate {
|
|
146
|
-
func onCallEnded() {
|
|
147
|
-
DispatchQueue.main.async { [weak self] in
|
|
148
|
-
self?.cleanup()
|
|
149
|
-
self?.dismiss(animated: true)
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// swiftinterface: onUserListChanged(userList: NSArray) — payload is NSArray of [String: Any]
|
|
154
|
-
func onUserListChanged(userList: NSArray) {
|
|
155
|
-
DispatchQueue.main.async { [weak self] in
|
|
156
|
-
self?.statusLabel.text = "\(userList.count) participants"
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// Note: CallsEventsDelegate has no onError callback. Surface generateToken /
|
|
161
|
-
// startSession failures from their onError closures (see startCall above).
|
|
162
|
-
}
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
The `DispatchQueue.main.async` wrapping is the iOS equivalent of NgZone.run on Angular — SDK callbacks fire on background queues; UI updates must be on main.
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## Control panel
|
|
170
|
-
|
|
171
|
-
```swift
|
|
172
|
-
final class ControlPanelView: UIView {
|
|
173
|
-
let muteButton = UIButton(type: .system)
|
|
174
|
-
let cameraButton = UIButton(type: .system)
|
|
175
|
-
let switchCameraButton = UIButton(type: .system)
|
|
176
|
-
let endButton = UIButton(type: .system)
|
|
177
|
-
|
|
178
|
-
var onMute: (() -> Void)?
|
|
179
|
-
var onCamera: (() -> Void)?
|
|
180
|
-
var onSwitch: (() -> Void)?
|
|
181
|
-
var onEnd: (() -> Void)?
|
|
182
|
-
|
|
183
|
-
override init(frame: CGRect) {
|
|
184
|
-
super.init(frame: frame)
|
|
185
|
-
backgroundColor = UIColor(white: 0, alpha: 0.4)
|
|
186
|
-
layer.cornerRadius = 40
|
|
187
|
-
|
|
188
|
-
let stack = UIStackView(arrangedSubviews: [muteButton, cameraButton, switchCameraButton, endButton])
|
|
189
|
-
stack.distribution = .equalCentering
|
|
190
|
-
stack.alignment = .center
|
|
191
|
-
stack.translatesAutoresizingMaskIntoConstraints = false
|
|
192
|
-
addSubview(stack)
|
|
193
|
-
|
|
194
|
-
NSLayoutConstraint.activate([
|
|
195
|
-
stack.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16),
|
|
196
|
-
stack.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16),
|
|
197
|
-
stack.centerYAnchor.constraint(equalTo: centerYAnchor),
|
|
198
|
-
])
|
|
199
|
-
|
|
200
|
-
muteButton.setTitle("Mute", for: .normal)
|
|
201
|
-
cameraButton.setTitle("Cam", for: .normal)
|
|
202
|
-
switchCameraButton.setTitle("Flip", for: .normal)
|
|
203
|
-
endButton.setTitle("End", for: .normal)
|
|
204
|
-
endButton.tintColor = .red
|
|
205
|
-
|
|
206
|
-
muteButton.addAction(UIAction { [weak self] _ in self?.onMute?() }, for: .touchUpInside)
|
|
207
|
-
cameraButton.addAction(UIAction { [weak self] _ in self?.onCamera?() }, for: .touchUpInside)
|
|
208
|
-
switchCameraButton.addAction(UIAction { [weak self] _ in self?.onSwitch?() }, for: .touchUpInside)
|
|
209
|
-
endButton.addAction(UIAction { [weak self] _ in self?.onEnd?() }, for: .touchUpInside)
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
required init?(coder: NSCoder) { fatalError() }
|
|
213
|
-
}
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
Wire actions in the VC:
|
|
217
|
-
|
|
218
|
-
```swift
|
|
219
|
-
override func viewDidLoad() {
|
|
220
|
-
super.viewDidLoad()
|
|
221
|
-
// ...
|
|
222
|
-
controlPanel.onMute = { [weak self] in
|
|
223
|
-
guard let self = self else { return }
|
|
224
|
-
self.muted.toggle()
|
|
225
|
-
CometChatCalls.audioMuted(self.muted) // NOT muteAudio
|
|
226
|
-
}
|
|
227
|
-
controlPanel.onCamera = { [weak self] in
|
|
228
|
-
guard let self = self else { return }
|
|
229
|
-
self.cameraOff.toggle()
|
|
230
|
-
CometChatCalls.videoPaused(self.cameraOff) // NOT pauseVideo
|
|
231
|
-
}
|
|
232
|
-
controlPanel.onSwitch = { CometChatCalls.switchCamera() }
|
|
233
|
-
controlPanel.onEnd = { [weak self] in
|
|
234
|
-
self?.cleanup()
|
|
235
|
-
self?.dismiss(animated: true)
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
---
|
|
241
|
-
|
|
242
|
-
## Local preview before connect
|
|
243
|
-
|
|
244
|
-
```swift
|
|
245
|
-
private lazy var captureSession = AVCaptureSession()
|
|
246
|
-
private lazy var previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
|
|
247
|
-
|
|
248
|
-
private func startLocalPreview() {
|
|
249
|
-
guard let device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front),
|
|
250
|
-
let input = try? AVCaptureDeviceInput(device: device) else { return }
|
|
251
|
-
|
|
252
|
-
captureSession.addInput(input)
|
|
253
|
-
previewLayer.frame = localPreviewView.bounds
|
|
254
|
-
previewLayer.videoGravity = .resizeAspectFill
|
|
255
|
-
localPreviewView.layer.addSublayer(previewLayer)
|
|
256
|
-
|
|
257
|
-
DispatchQueue.global(qos: .userInitiated).async {
|
|
258
|
-
self.captureSession.startRunning()
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
private func stopLocalPreview() {
|
|
263
|
-
captureSession.stopRunning()
|
|
264
|
-
previewLayer.removeFromSuperlayer()
|
|
265
|
-
}
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
Stop the preview BEFORE `startSession` — the SDK takes over the camera and your `AVCaptureSession` will fight with it.
|
|
269
|
-
|
|
270
|
-
---
|
|
271
|
-
|
|
272
|
-
## SwiftUI hosting
|
|
273
|
-
|
|
274
|
-
Wrap with `UIViewControllerRepresentable` (see `references/swiftui-uikit-hosting.md`):
|
|
275
|
-
|
|
276
|
-
```swift
|
|
277
|
-
struct CustomOngoingCallView: UIViewControllerRepresentable {
|
|
278
|
-
let sessionID: String
|
|
279
|
-
let isAudioOnly: Bool
|
|
280
|
-
|
|
281
|
-
func makeUIViewController(context: Context) -> CustomOngoingCallViewController {
|
|
282
|
-
CustomOngoingCallViewController(sessionID: sessionID, isAudioOnly: isAudioOnly)
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
func updateUIViewController(_ vc: CustomOngoingCallViewController, context: Context) {}
|
|
286
|
-
}
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
Present via `.fullScreenCover` (NOT `.sheet`).
|
|
290
|
-
|
|
291
|
-
---
|
|
292
|
-
|
|
293
|
-
## Picture-in-picture
|
|
294
|
-
|
|
295
|
-
iOS supports PiP for video calls via `AVPictureInPictureController`:
|
|
296
|
-
|
|
297
|
-
```swift
|
|
298
|
-
import AVKit
|
|
299
|
-
|
|
300
|
-
class CustomOngoingCallViewController {
|
|
301
|
-
private var pipController: AVPictureInPictureController?
|
|
302
|
-
|
|
303
|
-
func setupPiP() {
|
|
304
|
-
guard AVPictureInPictureController.isPictureInPictureSupported() else { return }
|
|
305
|
-
let layer = AVSampleBufferDisplayLayer()
|
|
306
|
-
containerView.layer.addSublayer(layer)
|
|
307
|
-
let contentSource = AVPictureInPictureController.ContentSource(sampleBufferDisplayLayer: layer, playbackDelegate: self)
|
|
308
|
-
pipController = AVPictureInPictureController(contentSource: contentSource)
|
|
309
|
-
pipController?.canStartPictureInPictureAutomaticallyFromInline = true
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
Setting up your own `AVPictureInPictureController` for WebRTC video is involved — the SDK doesn't expose a `CMSampleBuffer` stream directly. For most apps, use the Calls SDK's built-in PiP instead: `CometChatCalls.enterPIPMode()` / `CometChatCalls.exitPIPMode()` toggle the SDK-managed picture-in-picture for the session view. See `references/picture-in-picture.md`.
|
|
315
|
-
|
|
316
|
-
---
|
|
317
|
-
|
|
318
|
-
## When NOT to go custom
|
|
319
|
-
|
|
320
|
-
The kit's `CometChatOngoingCall` covers 80% of apps. Custom is for design-system requirements that the kit's theming + property overrides can't reach. Same calculus as web/RN/Angular.
|
|
321
|
-
|
|
322
|
-
The dispatcher asks before scaffolding custom and defaults to "no — use kit."
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
# Device management on iOS
|
|
2
|
-
|
|
3
|
-
iOS handles audio routing at the system level via `AVAudioSession.sharedInstance().availableInputs`. The Calls SDK exposes camera switching (`switchCamera`) but defers audio device selection to the OS — the user picks via the system's audio route picker (`AVRoutePickerView`) or Control Center.
|
|
4
|
-
|
|
5
|
-
**Canonical docs:** https://www.cometchat.com/docs/calls/ios/device-management
|
|
6
|
-
**Read first:** `references/avaudiosession-routing.md` — AVAudioSession setup + Bluetooth/AirPods routing rules.
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Camera switching (front / back / external)
|
|
11
|
-
|
|
12
|
-
```swift
|
|
13
|
-
import CometChatCallsSDK
|
|
14
|
-
|
|
15
|
-
CometChatCalls.switchCamera()
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
That's the SDK's primary camera control — toggles front/back. For iPad with attached external cameras (Studio Display, Continuity Camera), the user picks via the system Camera control center.
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Audio inputs (mic / Bluetooth / AirPods)
|
|
23
|
-
|
|
24
|
-
System-driven via `AVAudioSession`. The user picks from Control Center → Audio destination, or via your in-app `AVRoutePickerView`:
|
|
25
|
-
|
|
26
|
-
```swift
|
|
27
|
-
import AVKit
|
|
28
|
-
|
|
29
|
-
class CallControlsView: UIView {
|
|
30
|
-
private let routePicker = AVRoutePickerView()
|
|
31
|
-
|
|
32
|
-
init() {
|
|
33
|
-
super.init(frame: .zero)
|
|
34
|
-
routePicker.translatesAutoresizingMaskIntoConstraints = false
|
|
35
|
-
routePicker.activeTintColor = .systemBlue
|
|
36
|
-
addSubview(routePicker)
|
|
37
|
-
NSLayoutConstraint.activate([
|
|
38
|
-
routePicker.widthAnchor.constraint(equalToConstant: 44),
|
|
39
|
-
routePicker.heightAnchor.constraint(equalToConstant: 44),
|
|
40
|
-
])
|
|
41
|
-
}
|
|
42
|
-
required init?(coder: NSCoder) { fatalError() }
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
`AVRoutePickerView` is the canonical iOS audio-route picker. Tapping shows the system sheet with all available outputs (Built-in Speaker, AirPods, CarPlay, Bluetooth speakers, etc.). System-styled; matches user expectations.
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
## Speakerphone toggle
|
|
51
|
-
|
|
52
|
-
Most calls want a quick speaker on/off without going through the route picker:
|
|
53
|
-
|
|
54
|
-
```swift
|
|
55
|
-
import AVFoundation
|
|
56
|
-
|
|
57
|
-
func toggleSpeaker(on: Bool) {
|
|
58
|
-
do {
|
|
59
|
-
let session = AVAudioSession.sharedInstance()
|
|
60
|
-
if on {
|
|
61
|
-
try session.overrideOutputAudioPort(.speaker)
|
|
62
|
-
} else {
|
|
63
|
-
try session.overrideOutputAudioPort(.none) // restore default routing
|
|
64
|
-
}
|
|
65
|
-
} catch {
|
|
66
|
-
print("Failed to switch speaker: \(error)")
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
`.none` means "use the system default for current category" (typically receiver/earpiece for `playAndRecord` + `voiceChat`). NOT "no audio."
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## SwiftUI integration
|
|
76
|
-
|
|
77
|
-
```swift
|
|
78
|
-
struct CallControls: View {
|
|
79
|
-
@State private var speakerOn = false
|
|
80
|
-
|
|
81
|
-
var body: some View {
|
|
82
|
-
HStack(spacing: 16) {
|
|
83
|
-
// Speaker toggle
|
|
84
|
-
Button(action: {
|
|
85
|
-
speakerOn.toggle()
|
|
86
|
-
toggleSpeaker(on: speakerOn)
|
|
87
|
-
}) {
|
|
88
|
-
Image(systemName: speakerOn ? "speaker.wave.3.fill" : "speaker.fill")
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Camera flip
|
|
92
|
-
Button(action: { CometChatCalls.switchCamera() }) {
|
|
93
|
-
Image(systemName: "camera.rotate")
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// System route picker (Bluetooth / AirPods)
|
|
97
|
-
AVRoutePickerViewWrapper()
|
|
98
|
-
.frame(width: 44, height: 44)
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
struct AVRoutePickerViewWrapper: UIViewRepresentable {
|
|
104
|
-
func makeUIView(context: Context) -> AVRoutePickerView {
|
|
105
|
-
let view = AVRoutePickerView()
|
|
106
|
-
view.activeTintColor = .systemBlue
|
|
107
|
-
return view
|
|
108
|
-
}
|
|
109
|
-
func updateUIView(_ view: AVRoutePickerView, context: Context) {}
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
## Listen for route changes
|
|
116
|
-
|
|
117
|
-
```swift
|
|
118
|
-
NotificationCenter.default.addObserver(
|
|
119
|
-
forName: AVAudioSession.routeChangeNotification,
|
|
120
|
-
object: AVAudioSession.sharedInstance(),
|
|
121
|
-
queue: .main
|
|
122
|
-
) { notification in
|
|
123
|
-
guard let userInfo = notification.userInfo,
|
|
124
|
-
let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt,
|
|
125
|
-
let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) else { return }
|
|
126
|
-
|
|
127
|
-
switch reason {
|
|
128
|
-
case .newDeviceAvailable:
|
|
129
|
-
// AirPods connected, headphones plugged
|
|
130
|
-
print("New audio device available")
|
|
131
|
-
case .oldDeviceUnavailable:
|
|
132
|
-
// Headphones unplugged
|
|
133
|
-
print("Audio device unavailable")
|
|
134
|
-
default:
|
|
135
|
-
break
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
The two reason codes that matter for UI: `.newDeviceAvailable` (show "AirPods connected" toast) and `.oldDeviceUnavailable` (audio routes back to speaker; might want to update UI button state).
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
## Anti-patterns
|
|
145
|
-
|
|
146
|
-
1. **Building a custom audio route picker** instead of using `AVRoutePickerView`. iOS users expect the system picker; custom feels off-brand.
|
|
147
|
-
2. **Setting `overrideOutputAudioPort(.speaker)` from background.** AVAudioSession changes only work when session is active. Wrap in `setActive(true)` first.
|
|
148
|
-
3. **Forgetting to listen for `routeChangeNotification`.** UI gets out of sync when user changes route via Control Center.
|
|
149
|
-
4. **Calling `setActive(true)` repeatedly during a call.** AVAudioSession is sticky once activated; redundant calls produce warnings in console.
|
|
150
|
-
5. **Not handling `.failed` errors from `overrideOutputAudioPort`.** Some Bluetooth devices reject the override; silently swallow OR show a toast.
|
|
151
|
-
|
|
152
|
-
---
|
|
153
|
-
|
|
154
|
-
## Verification checklist
|
|
155
|
-
|
|
156
|
-
- [ ] `AVRoutePickerView` rendered in call controls
|
|
157
|
-
- [ ] Speaker toggle uses `overrideOutputAudioPort` correctly
|
|
158
|
-
- [ ] `.routeChangeNotification` observer set up
|
|
159
|
-
- [ ] All AVAudioSession calls on main queue
|
|
160
|
-
- [ ] Real-device smoke: AirPods connect mid-call → toast shown, audio routes
|
|
161
|
-
- [ ] Real-device smoke: Speaker toggle works
|
|
162
|
-
- [ ] Real-device smoke: Camera flip works (front/back)
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## Pointers
|
|
167
|
-
|
|
168
|
-
- `cometchat-react-calls/references/device-management.md` — web sister reference (different mechanism but UX shape)
|
|
169
|
-
- `cometchat-ios-calls` SKILL.md — the seven hard rules
|
|
170
|
-
- `references/avaudiosession-routing.md` — AVAudioSession setup details
|
|
171
|
-
- Canonical docs: https://www.cometchat.com/docs/calls/ios/device-management
|