@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,218 +0,0 @@
|
|
|
1
|
-
# Call session — no ringing (iOS)
|
|
2
|
-
|
|
3
|
-
Server-generated sessionId, both parties enter it. Customer-validated against `calls-sdk-ios-5/sample-apps/cometchat-calls-sample-app-ios/CometChatCallsSample/CallView.swift`.
|
|
4
|
-
|
|
5
|
-
**Read first:** `cometchat-react-calls/references/call-session.md` — cross-platform architecture (sessionId strategies, server-side authorization). Then come back here for the iOS shape.
|
|
6
|
-
|
|
7
|
-
**Known issue:** iOS V5 native (`CometChatCallsSDK`) is currently blocked upstream by a Cloudsmith 404 on the WebRTC binary. See `docs/known-issues-v4.2.0.md`. This file describes the correct shape for when the binary becomes available; the canonical pattern itself is sound.
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Hard rules (iOS-specific overrides on top of the cross-platform rules)
|
|
12
|
-
|
|
13
|
-
1. **Two-step session start: `generateToken` then `startSession`.** `CometChatCalls.generateToken(authToken:sessionID:onSuccess:onError:)` returns a call token; pass it to `CometChatCalls.startSession(callToken:callSetting:view:onSuccess:onError:)`. There is NO `joinSession` convenience method on the iOS Calls SDK v5.
|
|
14
|
-
2. **`CallSettingsBuilder()` is the canonical settings shape** (chained `.setIsAudioOnly(false).setStartVideoMuted(false).setStartAudioMuted(false).setDelegate(coordinator).build()`). There is NO `SessionSettings` or `SessionSettingsBuilder` type.
|
|
15
|
-
3. **`CallsEventsDelegate` protocol on a Coordinator object**, set via `CallSettingsBuilder.setDelegate(_:)` or registered with `CometChatCalls.addCallEventListener(observerId:delegate:)`. There is NO `SessionStatusListener`, NO `ButtonClickListener`, NO `CometChatCallsEventsListener`, and NO `addEventListener(.sessionLeft)`.
|
|
16
|
-
4. **`onCallEnded` and `onCallEndButtonPressed` trigger UI dismiss.** These are the real termination callbacks; ignoring either leaves the call view stranded. `CallsEventsDelegate` ALSO has an optional `onSessionTimeout()` callback (swiftinterface:30) that fires when the idle timeout set via `CallSettingsBuilder.setIdleTimeoutPeriod(_:)` elapses — handle it for dismiss/cleanup too. See `references/idle-timeout.md`.
|
|
17
|
-
5. **For standalone session-only integrations, the Chat SDK is OPTIONAL.** The upstream iOS sample never imports `CometChatSDK` (the chat SDK). Keep `CometChat.init` / `CometChat.login` only for additive (chat + calls) integrations.
|
|
18
|
-
6. **`AVAudioSession` activated with `.playAndRecord` + `.voiceChat`** — `.playback` mode captures NO mic input.
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## SwiftUI + UIViewRepresentable (canonical shape)
|
|
23
|
-
|
|
24
|
-
```swift
|
|
25
|
-
import SwiftUI
|
|
26
|
-
import CometChatCallsSDK
|
|
27
|
-
|
|
28
|
-
struct CallView: View {
|
|
29
|
-
let sessionID: String
|
|
30
|
-
@Environment(\.dismiss) private var dismiss
|
|
31
|
-
@State private var errorMessage: String?
|
|
32
|
-
|
|
33
|
-
var body: some View {
|
|
34
|
-
ZStack {
|
|
35
|
-
Color.black.ignoresSafeArea()
|
|
36
|
-
CallContainerView(
|
|
37
|
-
sessionID: sessionID,
|
|
38
|
-
onEnd: { dismiss() },
|
|
39
|
-
onError: { msg in errorMessage = msg }
|
|
40
|
-
)
|
|
41
|
-
}
|
|
42
|
-
.alert("Call Error", isPresented: .init(
|
|
43
|
-
get: { errorMessage != nil },
|
|
44
|
-
set: { if !$0 { errorMessage = nil; dismiss() } }
|
|
45
|
-
)) {
|
|
46
|
-
Button("OK") { errorMessage = nil; dismiss() }
|
|
47
|
-
} message: {
|
|
48
|
-
Text(errorMessage ?? "")
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// MARK: - UIKit container bridging the Calls SDK
|
|
54
|
-
|
|
55
|
-
struct CallContainerView: UIViewRepresentable {
|
|
56
|
-
let sessionID: String
|
|
57
|
-
let onEnd: () -> Void
|
|
58
|
-
let onError: (String) -> Void
|
|
59
|
-
|
|
60
|
-
func makeUIView(context: Context) -> UIView {
|
|
61
|
-
let container = UIView()
|
|
62
|
-
container.backgroundColor = .black
|
|
63
|
-
startSession(container: container, coordinator: context.coordinator)
|
|
64
|
-
return container
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
func updateUIView(_ uiView: UIView, context: Context) {}
|
|
68
|
-
|
|
69
|
-
func makeCoordinator() -> Coordinator {
|
|
70
|
-
Coordinator(onEnd: onEnd)
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
private func startSession(container: UIView, coordinator: Coordinator) {
|
|
74
|
-
let settings = CallSettingsBuilder()
|
|
75
|
-
.setIsAudioOnly(false)
|
|
76
|
-
.setStartVideoMuted(false)
|
|
77
|
-
.setStartAudioMuted(false)
|
|
78
|
-
.setDelegate(coordinator) // CallsEventsDelegate — set here, on the builder
|
|
79
|
-
.build()
|
|
80
|
-
|
|
81
|
-
// Two-step: generateToken THEN startSession. There is no joinSession convenience.
|
|
82
|
-
// authToken is nil for session-only apps (Calls SDK derives it server-side from the
|
|
83
|
-
// session); pass CometChat.getUserAuthToken() in additive (chat + calls) integrations.
|
|
84
|
-
CometChatCalls.generateToken(authToken: nil, sessionID: sessionID) { token in
|
|
85
|
-
guard let token = token else {
|
|
86
|
-
DispatchQueue.main.async { onError("Failed to generate call token") }
|
|
87
|
-
return
|
|
88
|
-
}
|
|
89
|
-
CometChatCalls.startSession(
|
|
90
|
-
callToken: token,
|
|
91
|
-
callSetting: settings,
|
|
92
|
-
view: container
|
|
93
|
-
) { _ in
|
|
94
|
-
// session started — delegate already wired via setDelegate
|
|
95
|
-
} onError: { error in
|
|
96
|
-
DispatchQueue.main.async {
|
|
97
|
-
onError(error?.errorDescription ?? "Failed to start call")
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
} onError: { error in
|
|
101
|
-
DispatchQueue.main.async {
|
|
102
|
-
onError(error?.errorDescription ?? "Failed to generate call token")
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
class Coordinator: NSObject, CallsEventsDelegate {
|
|
108
|
-
let onEnd: () -> Void
|
|
109
|
-
|
|
110
|
-
init(onEnd: @escaping () -> Void) {
|
|
111
|
-
self.onEnd = onEnd
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// --- CallsEventsDelegate (all @objc optional) ---
|
|
115
|
-
func onCallEnded() {
|
|
116
|
-
DispatchQueue.main.async { self.onEnd() }
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
func onCallEndButtonPressed() {
|
|
120
|
-
CometChatCalls.endSession() // EXISTS on the static facade
|
|
121
|
-
DispatchQueue.main.async { self.onEnd() }
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
**Why this shape:**
|
|
128
|
-
|
|
129
|
-
- **`UIViewRepresentable` bridging a `UIView` container**, not a raw SwiftUI view — the SDK draws into a `UIView` it owns and lays out internally. SwiftUI can't host that directly.
|
|
130
|
-
- **`generateToken` then `startSession`** — the iOS Calls SDK v5 has no single-call `joinSession`. Generate the call token, then start the session into the container `UIView`.
|
|
131
|
-
- **`CallSettingsBuilder().build()`** — chained builder ending in `.build()` returning `CallSettings`. There is no `SessionSettings`/`SessionSettingsBuilder` type.
|
|
132
|
-
- **`Coordinator` implements `CallsEventsDelegate`** — wired via `setDelegate(_:)` on the builder. There is no `SessionStatusListener`/`ButtonClickListener`; do not register against `CallSession.shared` (it doesn't exist).
|
|
133
|
-
|
|
134
|
-
---
|
|
135
|
-
|
|
136
|
-
## Required iOS configuration
|
|
137
|
-
|
|
138
|
-
`Info.plist`:
|
|
139
|
-
```xml
|
|
140
|
-
<key>NSCameraUsageDescription</key>
|
|
141
|
-
<string>Camera is needed for video calls</string>
|
|
142
|
-
<key>NSMicrophoneUsageDescription</key>
|
|
143
|
-
<string>Microphone is needed for calls</string>
|
|
144
|
-
<key>UIBackgroundModes</key>
|
|
145
|
-
<array>
|
|
146
|
-
<string>audio</string>
|
|
147
|
-
<string>voip</string>
|
|
148
|
-
</array>
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
`AVAudioSession` setup (call once at app launch):
|
|
152
|
-
```swift
|
|
153
|
-
import AVFoundation
|
|
154
|
-
|
|
155
|
-
let session = AVAudioSession.sharedInstance()
|
|
156
|
-
try? session.setCategory(.playAndRecord, mode: .voiceChat, options: [.allowBluetooth, .defaultToSpeaker])
|
|
157
|
-
try? session.setActive(true)
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
See `references/avaudiosession-routing.md` for full audio routing including AirPods / CarPlay handoff.
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## Universal Link routing
|
|
165
|
-
|
|
166
|
-
`SceneDelegate.scene(_:continue:)`:
|
|
167
|
-
```swift
|
|
168
|
-
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
|
|
169
|
-
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
|
|
170
|
-
let url = userActivity.webpageURL,
|
|
171
|
-
url.pathComponents.count >= 3,
|
|
172
|
-
url.pathComponents[1] == "meet" else { return }
|
|
173
|
-
let sessionID = url.pathComponents[2]
|
|
174
|
-
router.routeToCallView(sessionID: sessionID)
|
|
175
|
-
}
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
Configure `applinks:yourapp.com` per `references/share-invite.md`.
|
|
179
|
-
|
|
180
|
-
---
|
|
181
|
-
|
|
182
|
-
## Anti-patterns
|
|
183
|
-
|
|
184
|
-
1. **Looking for a single-call `joinSession(sessionID:)` convenience.** It does not exist on iOS v5. Always do `generateToken` → `startSession`.
|
|
185
|
-
2. **`SessionSettings` / `SessionSettingsBuilder`.** Neither type exists. Use `CallSettingsBuilder()...build()`.
|
|
186
|
-
3. **`CometChatCalls.addEventListener(.sessionLeft)` or `SessionStatusListener`/`ButtonClickListener`.** None exist. iOS uses the `CallsEventsDelegate` protocol set via `setDelegate(_:)` or `addCallEventListener(observerId:delegate:)`.
|
|
187
|
-
4. **Skipping the `onCallEnded` callback.** The call ends via this (remote hangup, server end) → call view stays mounted forever. (For idle-timeout termination, also handle `onSessionTimeout()` — swiftinterface:30.)
|
|
188
|
-
5. **Starting the session from `viewDidAppear`.** Re-runs on every navigation push. Use `viewDidLoad` + a `started` flag, OR use `UIViewRepresentable` + Coordinator (the pattern above).
|
|
189
|
-
6. **`AVAudioSession.setCategory(.playback)`.** Mic input doesn't capture. Use `.playAndRecord` + `.voiceChat` mode.
|
|
190
|
-
7. **`async/await` on `startSession`/`generateToken`.** They use completion handlers — `try await` does nothing.
|
|
191
|
-
8. **Initializing Chat SDK for a session-only integration.** Wastes time and adds two extra failure modes. Drop `CometChat.init` / `CometChat.login` entirely for standalone session apps.
|
|
192
|
-
|
|
193
|
-
---
|
|
194
|
-
|
|
195
|
-
## Verification checklist
|
|
196
|
-
|
|
197
|
-
- [ ] `generateToken(authToken:sessionID:)` → `startSession(callToken:callSetting:view:)` two-step (no `joinSession`)
|
|
198
|
-
- [ ] Settings built via `CallSettingsBuilder()`, not `SessionSettings`/`SessionSettingsBuilder`
|
|
199
|
-
- [ ] `CallsEventsDelegate` protocol implemented on a Coordinator class
|
|
200
|
-
- [ ] Coordinator wired via `CallSettingsBuilder.setDelegate(_:)` (or `addCallEventListener(observerId:delegate:)`)
|
|
201
|
-
- [ ] `onCallEnded` and `onCallEndButtonPressed` both trigger dismiss
|
|
202
|
-
- [ ] `Info.plist` has `NSCameraUsageDescription`, `NSMicrophoneUsageDescription`, `UIBackgroundModes: audio, voip`
|
|
203
|
-
- [ ] `AVAudioSession.setCategory(.playAndRecord, mode: .voiceChat, ...)`
|
|
204
|
-
- [ ] Universal Link routing wired in SceneDelegate
|
|
205
|
-
- [ ] **Standalone session-only:** no `CometChatSDK` (chat SDK) import — Calls SDK alone
|
|
206
|
-
- [ ] **Additive (chat + calls):** dual-SDK contract preserved
|
|
207
|
-
- [ ] Real-device smoke: tap meeting link in Messages → app opens at `/meet/:sessionID` → joins
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
## Pointers
|
|
212
|
-
|
|
213
|
-
- `cometchat-react-calls/references/call-session.md` — cross-platform architecture
|
|
214
|
-
- `cometchat-ios-calls/SKILL.md` — iOS seven hard rules
|
|
215
|
-
- `cometchat-ios-calls/references/share-invite.md` — Universal Link config
|
|
216
|
-
- `cometchat-ios-calls/references/avaudiosession-routing.md` — audio session routing
|
|
217
|
-
- Upstream iOS sample — `calls-sdk-ios-5/sample-apps/cometchat-calls-sample-app-ios/CometChatCallsSample/CallView.swift`
|
|
218
|
-
- Canonical docs: https://www.cometchat.com/docs/calls/ios/join-session
|
|
@@ -1,357 +0,0 @@
|
|
|
1
|
-
# CallKit + PushKit on iOS — the canonical implementation
|
|
2
|
-
|
|
3
|
-
iOS is the only platform where the OS owns the incoming-call UI. CallKit + PushKit isn't optional for production — without them, calls don't ring on locked devices and Apple rejects production builds. This reference is the full implementation; the SKILL.md sketches it, here is the code.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Why two frameworks
|
|
8
|
-
|
|
9
|
-
| Framework | Role |
|
|
10
|
-
|---|---|
|
|
11
|
-
| **PushKit** | Receives high-priority VoIP push payloads, even when the app is terminated. Separate from APNs. |
|
|
12
|
-
| **CallKit** | Presents the system incoming-call UI (lock-screen, even on locked device), reports call state to the OS, integrates with Phone app's "Recents" list. |
|
|
13
|
-
|
|
14
|
-
Combined: a VoIP push wakes the app via PushKit; the app immediately reports the call to CallKit; CallKit takes over and shows the system UI.
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Apple Developer setup (one-time, manual)
|
|
19
|
-
|
|
20
|
-
The skill cannot automate these:
|
|
21
|
-
|
|
22
|
-
1. **Create a VoIP Services certificate** in Apple Developer portal → Certificates → "+" → VoIP Services.
|
|
23
|
-
2. **Pin to the bundle ID** of your app.
|
|
24
|
-
3. **Download the .p12** and convert to .pem if your push server needs it (`openssl pkcs12 -in cert.p12 -out cert.pem -nodes`).
|
|
25
|
-
4. **Upload to your push server.** This is a SEPARATE certificate from your standard APNs cert.
|
|
26
|
-
|
|
27
|
-
The skill prints these steps and waits for the user to confirm before proceeding.
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## Xcode setup
|
|
32
|
-
|
|
33
|
-
In the target's "Signing & Capabilities":
|
|
34
|
-
|
|
35
|
-
1. Click "+" → "Push Notifications" → adds the entitlement.
|
|
36
|
-
2. Click "+" → "Background Modes" → check:
|
|
37
|
-
- ☑ Audio, AirPlay, and Picture in Picture
|
|
38
|
-
- ☑ Voice over IP
|
|
39
|
-
- ☑ Remote notifications
|
|
40
|
-
|
|
41
|
-
Verify the resulting `Info.plist` has:
|
|
42
|
-
|
|
43
|
-
```xml
|
|
44
|
-
<key>UIBackgroundModes</key>
|
|
45
|
-
<array>
|
|
46
|
-
<string>audio</string>
|
|
47
|
-
<string>voip</string>
|
|
48
|
-
<string>remote-notification</string>
|
|
49
|
-
</array>
|
|
50
|
-
<key>NSMicrophoneUsageDescription</key>
|
|
51
|
-
<string>So you can talk during voice and video calls.</string>
|
|
52
|
-
<key>NSCameraUsageDescription</key>
|
|
53
|
-
<string>So you can be seen during video calls.</string>
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## App entry — register PushKit + CallKit
|
|
59
|
-
|
|
60
|
-
### SwiftUI (`@main App`)
|
|
61
|
-
|
|
62
|
-
```swift
|
|
63
|
-
import SwiftUI
|
|
64
|
-
import PushKit
|
|
65
|
-
import CallKit
|
|
66
|
-
import CometChatSDK
|
|
67
|
-
import CometChatCallsSDK
|
|
68
|
-
|
|
69
|
-
@main
|
|
70
|
-
struct YourApp: App {
|
|
71
|
-
@StateObject private var callManager = CallManager.shared
|
|
72
|
-
|
|
73
|
-
var body: some Scene {
|
|
74
|
-
WindowGroup {
|
|
75
|
-
ContentView()
|
|
76
|
-
.onAppear {
|
|
77
|
-
CometChat.init(appId: Secrets.cometchatAppID, appSettings: appSettings) { isInitialized, error in
|
|
78
|
-
guard error == nil else { return }
|
|
79
|
-
CometChatCalls.init(callsAppSettings: callAppSettings) { _ in
|
|
80
|
-
callManager.registerForPushKit() // wait for SDK ready
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### UIKit (`AppDelegate`)
|
|
90
|
-
|
|
91
|
-
```swift
|
|
92
|
-
import UIKit
|
|
93
|
-
import PushKit
|
|
94
|
-
import CallKit
|
|
95
|
-
|
|
96
|
-
@main
|
|
97
|
-
class AppDelegate: UIResponder, UIApplicationDelegate {
|
|
98
|
-
func application(_ app: UIApplication, didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
|
|
99
|
-
CometChat.init(appId: Secrets.cometchatAppID, appSettings: appSettings) { _, error in
|
|
100
|
-
guard error == nil else { return }
|
|
101
|
-
CometChatCalls.init(callsAppSettings: callAppSettings) { _ in
|
|
102
|
-
CallManager.shared.registerForPushKit()
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return true
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## CallManager — the shared state holder
|
|
113
|
-
|
|
114
|
-
```swift
|
|
115
|
-
import PushKit
|
|
116
|
-
import CallKit
|
|
117
|
-
import CometChatCallsSDK
|
|
118
|
-
|
|
119
|
-
class CallManager: NSObject, ObservableObject {
|
|
120
|
-
static let shared = CallManager()
|
|
121
|
-
|
|
122
|
-
private let pushRegistry = PKPushRegistry(queue: .main)
|
|
123
|
-
private let provider: CXProvider
|
|
124
|
-
private let callController = CXCallController()
|
|
125
|
-
|
|
126
|
-
private override init() {
|
|
127
|
-
let config = CXProviderConfiguration(localizedName: "YourApp")
|
|
128
|
-
config.supportsVideo = true
|
|
129
|
-
config.maximumCallGroups = 1
|
|
130
|
-
config.maximumCallsPerCallGroup = 1
|
|
131
|
-
config.supportedHandleTypes = [.generic]
|
|
132
|
-
config.iconTemplateImageData = UIImage(named: "CallKitIcon")?.pngData()
|
|
133
|
-
config.ringtoneSound = "ringtone.caf"
|
|
134
|
-
|
|
135
|
-
self.provider = CXProvider(configuration: config)
|
|
136
|
-
super.init()
|
|
137
|
-
provider.setDelegate(self, queue: .main)
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
func registerForPushKit() {
|
|
141
|
-
pushRegistry.delegate = self
|
|
142
|
-
pushRegistry.desiredPushTypes = [.voIP]
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
func reportIncomingCall(uuid: UUID, callerName: String, callerUid: String, hasVideo: Bool) {
|
|
146
|
-
let update = CXCallUpdate()
|
|
147
|
-
update.remoteHandle = CXHandle(type: .generic, value: callerUid)
|
|
148
|
-
update.localizedCallerName = callerName
|
|
149
|
-
update.hasVideo = hasVideo
|
|
150
|
-
|
|
151
|
-
provider.reportNewIncomingCall(with: uuid, update: update) { error in
|
|
152
|
-
if let error = error {
|
|
153
|
-
print("Failed to report incoming call: \(error)")
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
---
|
|
161
|
-
|
|
162
|
-
## PushKit delegate — the 5-second rule
|
|
163
|
-
|
|
164
|
-
```swift
|
|
165
|
-
extension CallManager: PKPushRegistryDelegate {
|
|
166
|
-
func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) {
|
|
167
|
-
guard type == .voIP else { return }
|
|
168
|
-
let token = credentials.token.map { String(format: "%02x", $0) }.joined()
|
|
169
|
-
// Send this token to your server, keyed by the logged-in CometChat UID
|
|
170
|
-
Task {
|
|
171
|
-
await sendVoipTokenToServer(token: token, uid: CometChat.getLoggedInUser()?.uid ?? "")
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
|
|
176
|
-
guard type == .voIP else { completion(); return }
|
|
177
|
-
|
|
178
|
-
// CRITICAL: report to CallKit IMMEDIATELY. iOS terminates apps that delay this >~5s.
|
|
179
|
-
let data = payload.dictionaryPayload["data"] as? [String: Any] ?? [:]
|
|
180
|
-
let sessionId = data["sessionId"] as? String ?? UUID().uuidString
|
|
181
|
-
let callerName = data["callerName"] as? String ?? "Unknown"
|
|
182
|
-
let callerUid = data["callerUid"] as? String ?? ""
|
|
183
|
-
let hasVideo = (data["callType"] as? String) == "video"
|
|
184
|
-
|
|
185
|
-
let uuid = UUID(uuidString: sessionId) ?? UUID()
|
|
186
|
-
reportIncomingCall(uuid: uuid, callerName: callerName, callerUid: callerUid, hasVideo: hasVideo)
|
|
187
|
-
|
|
188
|
-
// Store sessionId for later when CXAnswerCallAction fires
|
|
189
|
-
self.pendingSessionIds[uuid] = sessionId
|
|
190
|
-
|
|
191
|
-
completion() // ← tell iOS we're done
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// iOS may invalidate the token (OS upgrade, app reinstall)
|
|
195
|
-
func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) {
|
|
196
|
-
// Token will re-register; wait for didUpdate
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
**The 5-second rule:** Apple's `PKPushRegistry` documentation says you must call `reportNewIncomingCall` "promptly." Practical limit: ~5 seconds. If you exceed it, iOS terminates your app process and won't deliver future VoIP pushes for ~24 hours (apologies, no public retry mechanism).
|
|
202
|
-
|
|
203
|
-
---
|
|
204
|
-
|
|
205
|
-
## CallKit delegate — answer + end actions
|
|
206
|
-
|
|
207
|
-
```swift
|
|
208
|
-
extension CallManager: CXProviderDelegate {
|
|
209
|
-
func providerDidReset(_ provider: CXProvider) {
|
|
210
|
-
// OS reset everything — clean up local state
|
|
211
|
-
pendingSessionIds.removeAll()
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
|
|
215
|
-
// User tapped "Answer" on the lock screen
|
|
216
|
-
guard let sessionId = pendingSessionIds[action.callUUID] else {
|
|
217
|
-
action.fail()
|
|
218
|
-
return
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
Task {
|
|
222
|
-
do {
|
|
223
|
-
// Accept via Chat SDK
|
|
224
|
-
try await CometChat.acceptCall(sessionID: sessionId)
|
|
225
|
-
|
|
226
|
-
// Configure AVAudioSession for voice/video call audio
|
|
227
|
-
try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .voiceChat)
|
|
228
|
-
try AVAudioSession.sharedInstance().setActive(true)
|
|
229
|
-
|
|
230
|
-
// Build session settings via CallSettingsBuilder. The CallsEventsDelegate
|
|
231
|
-
// is wired with setDelegate(_:); there is no SessionSettings(Builder).
|
|
232
|
-
let settings = CallSettingsBuilder()
|
|
233
|
-
.setIsAudioOnly(false)
|
|
234
|
-
.setStartVideoMuted(false)
|
|
235
|
-
.setStartAudioMuted(false)
|
|
236
|
-
.setDelegate(callListener) // callListener conforms to CallsEventsDelegate
|
|
237
|
-
.build()
|
|
238
|
-
|
|
239
|
-
// Two-step: generateToken THEN startSession. There is no joinSession.
|
|
240
|
-
// `view` is the UIView the ongoing-call UI will be drawn into.
|
|
241
|
-
CometChatCalls.generateToken(authToken: CometChat.getUserAuthToken(), sessionID: sessionId) { token in
|
|
242
|
-
guard let token = token else {
|
|
243
|
-
print("generateToken returned nil")
|
|
244
|
-
action.fail()
|
|
245
|
-
return
|
|
246
|
-
}
|
|
247
|
-
CometChatCalls.startSession(
|
|
248
|
-
callToken: token,
|
|
249
|
-
callSetting: settings,
|
|
250
|
-
view: callContainerView // a UIView with measurable bounds
|
|
251
|
-
) { _ in
|
|
252
|
-
action.fulfill() // tell CallKit we answered successfully
|
|
253
|
-
} onError: { error in
|
|
254
|
-
print("startSession failed: \(error?.errorDescription ?? "unknown")")
|
|
255
|
-
action.fail()
|
|
256
|
-
}
|
|
257
|
-
} onError: { error in
|
|
258
|
-
print("generateToken failed: \(error?.errorDescription ?? "unknown")")
|
|
259
|
-
action.fail()
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// Navigate the app's UI to the ongoing-call screen
|
|
263
|
-
await MainActor.run {
|
|
264
|
-
// ...your nav logic — push the view that hosts callContainerView...
|
|
265
|
-
}
|
|
266
|
-
} catch {
|
|
267
|
-
action.fail()
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
func provider(_ provider: CXProvider, perform action: CXEndCallAction) {
|
|
273
|
-
// User tapped "End" or call ended remotely.
|
|
274
|
-
CometChatCalls.endSession() // EXISTS on the static facade in v5
|
|
275
|
-
|
|
276
|
-
// CRITICAL: deactivate audio session (rule 1.5)
|
|
277
|
-
do {
|
|
278
|
-
try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
|
|
279
|
-
} catch {
|
|
280
|
-
// log but don't block
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
pendingSessionIds.removeValue(forKey: action.callUUID)
|
|
284
|
-
action.fulfill()
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
func provider(_ provider: CXProvider, perform action: CXSetMutedCallAction) {
|
|
288
|
-
CometChatCalls.audioMuted(action.isMuted) // NOT muteAudio
|
|
289
|
-
action.fulfill()
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
---
|
|
295
|
-
|
|
296
|
-
## Outgoing calls — also through CallKit
|
|
297
|
-
|
|
298
|
-
For caller-initiated calls, report via `CXStartCallAction` so the call appears in the iOS Phone app's Recents:
|
|
299
|
-
|
|
300
|
-
```swift
|
|
301
|
-
extension CallManager {
|
|
302
|
-
func startOutgoingCall(receiverUid: String, callType: CallType) {
|
|
303
|
-
let uuid = UUID()
|
|
304
|
-
let handle = CXHandle(type: .generic, value: receiverUid)
|
|
305
|
-
let action = CXStartCallAction(call: uuid, handle: handle)
|
|
306
|
-
action.isVideo = (callType == .video)
|
|
307
|
-
|
|
308
|
-
let transaction = CXTransaction(action: action)
|
|
309
|
-
callController.request(transaction) { error in
|
|
310
|
-
if let error = error {
|
|
311
|
-
print("Failed to start outgoing call: \(error)")
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
extension CallManager {
|
|
318
|
-
// CXProviderDelegate
|
|
319
|
-
func provider(_ provider: CXProvider, perform action: CXStartCallAction) {
|
|
320
|
-
Task {
|
|
321
|
-
do {
|
|
322
|
-
let outgoing = Call(receiverId: action.handle.value,
|
|
323
|
-
callType: action.isVideo ? .video : .audio, // CallType has no .voice
|
|
324
|
-
receiverType: .user)
|
|
325
|
-
let initiated = try await CometChat.initiateCall(call: outgoing)
|
|
326
|
-
pendingSessionIds[action.callUUID] = initiated.sessionID
|
|
327
|
-
provider.reportOutgoingCall(with: action.callUUID, startedConnectingAt: nil)
|
|
328
|
-
action.fulfill()
|
|
329
|
-
} catch {
|
|
330
|
-
action.fail()
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
This gives the user a "Calling..." UI in the iOS system. When the receiver accepts, `provider.reportOutgoingCall(connectedAt:)` switches the UI to "Connected."
|
|
338
|
-
|
|
339
|
-
---
|
|
340
|
-
|
|
341
|
-
## Common failure modes
|
|
342
|
-
|
|
343
|
-
| Symptom | Cause | Fix |
|
|
344
|
-
|---|---|---|
|
|
345
|
-
| App terminates 5s after PushKit delivery | Async work before `reportNewIncomingCall` | Report first, then do anything else |
|
|
346
|
-
| "VoIP services not available" at registry setup | Background Modes capability missing | Add VoIP capability in Xcode and rebuild |
|
|
347
|
-
| Token never registers | App not signed with VoIP-capable provisioning profile | Re-download provisioning profile |
|
|
348
|
-
| Call rings but answering does nothing | `CXAnswerCallAction` delegate doesn't fail/fulfill | Always call `action.fulfill()` or `action.fail()` |
|
|
349
|
-
| Music doesn't resume after hangup | Missing `setActive(false, .notifyOthersOnDeactivation)` | Add to `CXEndCallAction` handler |
|
|
350
|
-
| Lock-screen rings but unlocking shows wrong screen | App didn't navigate to ongoing-call view in `CXAnswerCallAction` | Navigate inside the action handler |
|
|
351
|
-
| Outgoing call never shows "Calling..." UI | Started via `initiateCall` directly without `CXStartCallAction` | Use `CXTransaction` flow |
|
|
352
|
-
|
|
353
|
-
---
|
|
354
|
-
|
|
355
|
-
## Testing without a push server
|
|
356
|
-
|
|
357
|
-
Same workaround as RN — call `CallManager.shared.reportIncomingCall(...)` from a debug button. Bypasses PushKit entirely. Useful for testing the in-app + CallKit-UI flow but doesn't exercise the lock-screen ring (which requires PushKit delivery to an unlocked or terminated app).
|