@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,616 +1,38 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cometchat-ios-push
|
|
3
|
-
description: "
|
|
3
|
+
description: "Add push notifications to an iOS CometChat app — APNs registration, token handoff, tap-to-open, badge counts and VoIP call pushes. Triggers: 'push notifications cometchat ios', 'apns cometchat', 'open chat from notification ios', 'voip push call ios'."
|
|
4
4
|
license: "MIT"
|
|
5
|
-
compatibility: "CometChatUIKitSwift
|
|
5
|
+
compatibility: "CometChatUIKitSwift 5.1.22 · CometChatSDK 4.1.7 · iOS 15.1+"
|
|
6
6
|
metadata:
|
|
7
7
|
author: "CometChat"
|
|
8
|
-
version: "
|
|
9
|
-
tags: "
|
|
8
|
+
version: "1.0.0"
|
|
9
|
+
tags: "cometchat ios push apns voip pushkit notifications swift v5"
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
## Companion skills (read first)
|
|
13
|
+
- `cometchat-ios-core` owns setup and login. This skill ADDS delivery. It is **docs-first and thin**: push depends on your Apple account, certificates and Dashboard configuration, so fetch the notifications docs via `cometchat-ios-core/references/docs-map.md` rather than trusting a baked recipe.
|
|
13
14
|
|
|
14
|
-
##
|
|
15
|
+
## Use this skill when
|
|
16
|
+
"add push notifications", "open the right chat when a notification is tapped", "ring on an incoming call while backgrounded".
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
## What you must have before any code
|
|
19
|
+
Push is **not** a code-only feature. All of these are prerequisites and none are things a skill can do for the user: an Apple Developer account with the Push Notifications capability, an APNs key or certificate uploaded to the **CometChat Dashboard**, and the Notifications product enabled for the app. If any are missing, say so plainly and stop — do not emit code that cannot work.
|
|
17
20
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
## 1. Prerequisites
|
|
21
|
-
|
|
22
|
-
Before setting up push notifications:
|
|
23
|
-
|
|
24
|
-
1. **Apple Developer Account** — Required for APNs certificates
|
|
25
|
-
2. **CometChat Dashboard Access** — To configure push notification settings
|
|
26
|
-
3. **Physical iOS Device** — Push notifications don't work on simulators
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## 2. APNs Certificate Setup
|
|
31
|
-
|
|
32
|
-
### Step 1: Create APNs Key (Recommended)
|
|
33
|
-
|
|
34
|
-
1. Go to [Apple Developer Portal](https://developer.apple.com/account)
|
|
35
|
-
2. Navigate to **Certificates, Identifiers & Profiles** → **Keys**
|
|
36
|
-
3. Click **+** to create a new key
|
|
37
|
-
4. Enter a name (e.g., "CometChat Push Key")
|
|
38
|
-
5. Enable **Apple Push Notifications service (APNs)**
|
|
39
|
-
6. Click **Continue** → **Register**
|
|
40
|
-
7. Download the `.p8` file (you can only download it once!)
|
|
41
|
-
8. Note the **Key ID** and your **Team ID**
|
|
42
|
-
|
|
43
|
-
### Step 2: Configure CometChat Dashboard
|
|
44
|
-
|
|
45
|
-
1. Go to [CometChat Dashboard](https://app.cometchat.com)
|
|
46
|
-
2. Select your app
|
|
47
|
-
3. Navigate to **Notifications** → **Push Notifications**
|
|
48
|
-
4. Select **iOS** tab
|
|
49
|
-
5. Upload your `.p8` file
|
|
50
|
-
6. Enter your **Key ID** and **Team ID**
|
|
51
|
-
7. Select the environment (Development/Production)
|
|
52
|
-
8. Save the configuration
|
|
53
|
-
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
## 3. Xcode Project Configuration
|
|
57
|
-
|
|
58
|
-
### Enable Push Notifications Capability
|
|
59
|
-
|
|
60
|
-
1. Open your project in Xcode
|
|
61
|
-
2. Select your target
|
|
62
|
-
3. Go to **Signing & Capabilities**
|
|
63
|
-
4. Click **+ Capability**
|
|
64
|
-
5. Add **Push Notifications**
|
|
65
|
-
6. Add **Background Modes** and enable:
|
|
66
|
-
- Remote notifications
|
|
67
|
-
- Voice over IP (if using calls)
|
|
68
|
-
|
|
69
|
-
### Update Info.plist
|
|
70
|
-
|
|
71
|
-
Add the following to your `Info.plist`:
|
|
72
|
-
|
|
73
|
-
```xml
|
|
74
|
-
<key>UIBackgroundModes</key>
|
|
75
|
-
<array>
|
|
76
|
-
<string>remote-notification</string>
|
|
77
|
-
<string>voip</string>
|
|
78
|
-
</array>
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
## 4. Code Implementation
|
|
84
|
-
|
|
85
|
-
### AppDelegate Setup
|
|
86
|
-
|
|
87
|
-
```swift
|
|
88
|
-
import UIKit
|
|
89
|
-
import UserNotifications
|
|
90
|
-
import CometChatUIKitSwift
|
|
91
|
-
import CometChatSDK
|
|
92
|
-
|
|
93
|
-
@main
|
|
94
|
-
class AppDelegate: UIResponder, UIApplicationDelegate {
|
|
95
|
-
|
|
96
|
-
func application(
|
|
97
|
-
_ application: UIApplication,
|
|
98
|
-
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
|
99
|
-
) -> Bool {
|
|
100
|
-
|
|
101
|
-
// Initialize CometChat
|
|
102
|
-
initializeCometChat()
|
|
103
|
-
|
|
104
|
-
// Request notification permissions
|
|
105
|
-
requestNotificationPermission()
|
|
106
|
-
|
|
107
|
-
// Register for remote notifications
|
|
108
|
-
application.registerForRemoteNotifications()
|
|
109
|
-
|
|
110
|
-
return true
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
private func initializeCometChat() {
|
|
114
|
-
let uiKitSettings = UIKitSettings()
|
|
115
|
-
.set(appID: "YOUR_APP_ID")
|
|
116
|
-
.set(authKey: "YOUR_AUTH_KEY")
|
|
117
|
-
.set(region: "us")
|
|
118
|
-
.subscribePresenceForAllUsers()
|
|
119
|
-
.build()
|
|
120
|
-
|
|
121
|
-
CometChatUIKit(uiKitSettings: uiKitSettings) { result in
|
|
122
|
-
switch result {
|
|
123
|
-
case .success:
|
|
124
|
-
print("CometChat initialized")
|
|
125
|
-
case .failure(let error):
|
|
126
|
-
print("CometChat init failed: \(error)")
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
private func requestNotificationPermission() {
|
|
132
|
-
let center = UNUserNotificationCenter.current()
|
|
133
|
-
center.delegate = self
|
|
134
|
-
|
|
135
|
-
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
|
|
136
|
-
if granted {
|
|
137
|
-
print("Notification permission granted")
|
|
138
|
-
} else if let error = error {
|
|
139
|
-
print("Notification permission error: \(error)")
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// MARK: - Remote Notification Registration
|
|
145
|
-
|
|
146
|
-
func application(
|
|
147
|
-
_ application: UIApplication,
|
|
148
|
-
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
|
|
149
|
-
) {
|
|
150
|
-
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
|
|
151
|
-
print("APNs Device Token: \(token)")
|
|
152
|
-
|
|
153
|
-
// Register token with CometChat
|
|
154
|
-
registerPushToken(token)
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
func application(
|
|
158
|
-
_ application: UIApplication,
|
|
159
|
-
didFailToRegisterForRemoteNotificationsWithError error: Error
|
|
160
|
-
) {
|
|
161
|
-
print("Failed to register for remote notifications: \(error)")
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
private func registerPushToken(_ token: String) {
|
|
165
|
-
// CANONICAL v5 API: CometChatNotifications.registerPushToken takes a
|
|
166
|
-
// PushPlatforms enum (NOT a settings dict). Use .APNS_IOS_DEVICE for a
|
|
167
|
-
// standard APNs device token, .APNS_IOS_VOIP for a PushKit VoIP token,
|
|
168
|
-
// or .FCM_IOS if you route iOS through FCM. providerId is your dashboard
|
|
169
|
-
// push-provider id (pass nil to use the default).
|
|
170
|
-
CometChatNotifications.registerPushToken(
|
|
171
|
-
pushToken: token,
|
|
172
|
-
platform: .APNS_IOS_DEVICE,
|
|
173
|
-
providerId: nil
|
|
174
|
-
) { success in
|
|
175
|
-
print("Push token registered: \(success)")
|
|
176
|
-
} onError: { error in
|
|
177
|
-
print("Push token registration failed: \(error.errorDescription)")
|
|
178
|
-
}
|
|
179
|
-
// NOTE: the legacy `CometChat.registerTokenForPushNotification(token:settings:)`
|
|
180
|
-
// (v4-era) still compiles but is superseded — prefer the call above.
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// MARK: - Token lifecycle (register AFTER login, unregister BEFORE logout)
|
|
184
|
-
//
|
|
185
|
-
// ⚠️ `didRegisterForRemoteNotifications` can fire before the user logs in.
|
|
186
|
-
// Registering a token that isn't bound to a CometChat session is a no-op at
|
|
187
|
-
// best. Stash the latest APNs token and register it only once login resolves:
|
|
188
|
-
//
|
|
189
|
-
// var pendingPushToken: String? // set in didRegisterForRemoteNotifications
|
|
190
|
-
// // after CometChatUIKit.login(...) onSuccess:
|
|
191
|
-
// if let t = pendingPushToken { registerPushToken(t) }
|
|
192
|
-
//
|
|
193
|
-
// And ALWAYS unregister before logout — otherwise the device keeps receiving
|
|
194
|
-
// pushes for the previous user:
|
|
195
|
-
|
|
196
|
-
func unregisterPushToken(_ completion: @escaping () -> Void) {
|
|
197
|
-
CometChatNotifications.unregisterPushToken { _ in
|
|
198
|
-
completion()
|
|
199
|
-
} onError: { _ in
|
|
200
|
-
completion() // proceed with logout regardless
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Usage at logout:
|
|
205
|
-
// unregisterPushToken {
|
|
206
|
-
// CometChatUIKit.logout(onSuccess: { _ in /* route to login */ }, onError: { _ in })
|
|
207
|
-
// }
|
|
208
|
-
|
|
209
|
-
// MARK: - Handle Incoming Notifications
|
|
210
|
-
|
|
211
|
-
func application(
|
|
212
|
-
_ application: UIApplication,
|
|
213
|
-
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
|
|
214
|
-
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void
|
|
215
|
-
) {
|
|
216
|
-
print("Received remote notification: \(userInfo)")
|
|
217
|
-
|
|
218
|
-
// Handle CometChat notification
|
|
219
|
-
if let messageData = userInfo["message"] as? [String: Any] {
|
|
220
|
-
handleCometChatNotification(messageData)
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
completionHandler(.newData)
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
private func handleCometChatNotification(_ data: [String: Any]) {
|
|
227
|
-
// Parse notification data
|
|
228
|
-
guard let type = data["type"] as? String else { return }
|
|
229
|
-
|
|
230
|
-
switch type {
|
|
231
|
-
case "chat":
|
|
232
|
-
handleChatNotification(data)
|
|
233
|
-
case "call":
|
|
234
|
-
handleCallNotification(data)
|
|
235
|
-
default:
|
|
236
|
-
print("Unknown notification type: \(type)")
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
private func handleChatNotification(_ data: [String: Any]) {
|
|
241
|
-
// Extract sender info
|
|
242
|
-
guard let senderUID = data["sender"] as? String else { return }
|
|
243
|
-
|
|
244
|
-
// Navigate to conversation
|
|
245
|
-
DispatchQueue.main.async {
|
|
246
|
-
NotificationCenter.default.post(
|
|
247
|
-
name: .openConversation,
|
|
248
|
-
object: nil,
|
|
249
|
-
userInfo: ["uid": senderUID]
|
|
250
|
-
)
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
private func handleCallNotification(_ data: [String: Any]) {
|
|
255
|
-
// Handle incoming call notification
|
|
256
|
-
print("Incoming call notification")
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// MARK: - UNUserNotificationCenterDelegate
|
|
261
|
-
|
|
262
|
-
extension AppDelegate: UNUserNotificationCenterDelegate {
|
|
263
|
-
|
|
264
|
-
// Handle notification when app is in foreground
|
|
265
|
-
func userNotificationCenter(
|
|
266
|
-
_ center: UNUserNotificationCenter,
|
|
267
|
-
willPresent notification: UNNotification,
|
|
268
|
-
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
|
|
269
|
-
) {
|
|
270
|
-
// Show notification even when app is in foreground
|
|
271
|
-
completionHandler([.banner, .sound, .badge])
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
// Handle notification tap
|
|
275
|
-
func userNotificationCenter(
|
|
276
|
-
_ center: UNUserNotificationCenter,
|
|
277
|
-
didReceive response: UNNotificationResponse,
|
|
278
|
-
withCompletionHandler completionHandler: @escaping () -> Void
|
|
279
|
-
) {
|
|
280
|
-
let userInfo = response.notification.request.content.userInfo
|
|
281
|
-
|
|
282
|
-
if let messageData = userInfo["message"] as? [String: Any] {
|
|
283
|
-
handleCometChatNotification(messageData)
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
completionHandler()
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// MARK: - Notification Names
|
|
291
|
-
|
|
292
|
-
extension Notification.Name {
|
|
293
|
-
static let openConversation = Notification.Name("openConversation")
|
|
294
|
-
}
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
### Handle Notification Navigation
|
|
298
|
-
|
|
299
|
-
```swift
|
|
300
|
-
class MainViewController: UIViewController {
|
|
301
|
-
|
|
302
|
-
override func viewDidLoad() {
|
|
303
|
-
super.viewDidLoad()
|
|
304
|
-
|
|
305
|
-
// Listen for notification navigation
|
|
306
|
-
NotificationCenter.default.addObserver(
|
|
307
|
-
self,
|
|
308
|
-
selector: #selector(handleOpenConversation(_:)),
|
|
309
|
-
name: .openConversation,
|
|
310
|
-
object: nil
|
|
311
|
-
)
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
@objc private func handleOpenConversation(_ notification: Notification) {
|
|
315
|
-
guard let uid = notification.userInfo?["uid"] as? String else { return }
|
|
316
|
-
|
|
317
|
-
// Fetch user and open conversation
|
|
318
|
-
CometChat.getUser(UID: uid) { [weak self] user in
|
|
319
|
-
guard let user = user else { return }
|
|
320
|
-
|
|
321
|
-
DispatchQueue.main.async {
|
|
322
|
-
let messagesVC = MessagesVC() // your own VC composing CometChatMessageHeader + List + Composer
|
|
323
|
-
messagesVC.set(user: user)
|
|
324
|
-
self?.navigationController?.pushViewController(messagesVC, animated: true)
|
|
325
|
-
}
|
|
326
|
-
} onError: { error in
|
|
327
|
-
print("Error fetching user: \(error?.errorDescription ?? "")")
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
deinit {
|
|
332
|
-
NotificationCenter.default.removeObserver(self)
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
---
|
|
338
|
-
|
|
339
|
-
## 5. VoIP Push Notifications (for Calls)
|
|
340
|
-
|
|
341
|
-
### Import PushKit
|
|
342
|
-
|
|
343
|
-
```swift
|
|
344
|
-
import PushKit
|
|
345
|
-
```
|
|
21
|
+
## The shape of the integration — use `CometChatPushNotifications`, do NOT hand-roll
|
|
22
|
+
The current, canonical iOS path is the **`CometChatPushNotifications`** SDK (module `CometChatPushNotificationsSwift`), the same one `cometchat-ios-v5-sdk` documents. Do **not** hand-roll `UIKitSettings.set(deviceToken:)` / `set(voipToken:)`, `PKPushRegistryDelegate` or `CXProviderDelegate` — those setters exist but are the legacy path the sample app and current docs no longer use.
|
|
346
23
|
|
|
347
|
-
|
|
24
|
+
1. Request authorisation and register for remote notifications (on a real device — **the simulator does not receive APNs**).
|
|
25
|
+
2. After `CometChat.init`, call `CometChatPushNotifications.shared.initialize(config:)` and set its `.delegate`. In `didRegisterForRemoteNotificationsWithDeviceToken`, forward the APNs token with `CometChatPushNotifications.shared.registerDeviceToken(_:)`. **Ordering is not your problem** — the token can arrive before login; the SDK caches it and binds it to the user automatically once you initialize and the user logs in. (There is no need to gate `didRegister…` on login, and no `set(deviceToken:)` call.)
|
|
26
|
+
3. Handle the tap: read the payload, resolve the conversation, and push your chat screen — the same screen core builds. A notification that opens the app to the wrong place is the push equivalent of a dead-end affordance.
|
|
27
|
+
4. **Log out unregisters.** Leaving a stale token delivers a user's messages to a device someone else may now be using — treat it as a correctness and privacy requirement, not a nicety.
|
|
348
28
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
var voipRegistry: PKPushRegistry?
|
|
353
|
-
|
|
354
|
-
func application(
|
|
355
|
-
_ application: UIApplication,
|
|
356
|
-
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
|
357
|
-
) -> Bool {
|
|
358
|
-
|
|
359
|
-
// ... other setup ...
|
|
360
|
-
|
|
361
|
-
// Register for VoIP push
|
|
362
|
-
registerForVoIPPush()
|
|
363
|
-
|
|
364
|
-
return true
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
private func registerForVoIPPush() {
|
|
368
|
-
voipRegistry = PKPushRegistry(queue: .main)
|
|
369
|
-
voipRegistry?.delegate = self
|
|
370
|
-
voipRegistry?.desiredPushTypes = [.voIP]
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
// MARK: - PKPushRegistryDelegate
|
|
375
|
-
|
|
376
|
-
extension AppDelegate: PKPushRegistryDelegate {
|
|
377
|
-
|
|
378
|
-
func pushRegistry(
|
|
379
|
-
_ registry: PKPushRegistry,
|
|
380
|
-
didUpdate pushCredentials: PKPushCredentials,
|
|
381
|
-
for type: PKPushType
|
|
382
|
-
) {
|
|
383
|
-
let token = pushCredentials.token.map { String(format: "%02.2hhx", $0) }.joined()
|
|
384
|
-
print("VoIP Token: \(token)")
|
|
385
|
-
|
|
386
|
-
// Register VoIP token with CometChat — canonical v5 API uses the
|
|
387
|
-
// .APNS_IOS_VOIP platform (NOT settings: ["voip": true]).
|
|
388
|
-
CometChatNotifications.registerPushToken(
|
|
389
|
-
pushToken: token,
|
|
390
|
-
platform: .APNS_IOS_VOIP,
|
|
391
|
-
providerId: nil
|
|
392
|
-
) { success in
|
|
393
|
-
print("VoIP token registered: \(success)")
|
|
394
|
-
} onError: { error in
|
|
395
|
-
print("VoIP token registration failed: \(error.errorDescription)")
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
func pushRegistry(
|
|
400
|
-
_ registry: PKPushRegistry,
|
|
401
|
-
didReceiveIncomingPushWith payload: PKPushPayload,
|
|
402
|
-
for type: PKPushType,
|
|
403
|
-
completion: @escaping () -> Void
|
|
404
|
-
) {
|
|
405
|
-
print("Received VoIP push: \(payload.dictionaryPayload)")
|
|
406
|
-
|
|
407
|
-
// Handle incoming call
|
|
408
|
-
if let callData = payload.dictionaryPayload["call"] as? [String: Any] {
|
|
409
|
-
handleIncomingCall(callData)
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
completion()
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
private func handleIncomingCall(_ data: [String: Any]) {
|
|
416
|
-
// Show incoming call UI
|
|
417
|
-
// This should use CallKit for proper iOS call handling
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
```
|
|
421
|
-
|
|
422
|
-
---
|
|
423
|
-
|
|
424
|
-
## 6. UIKitSettings with Push Tokens
|
|
425
|
-
|
|
426
|
-
You can also pass tokens during initialization:
|
|
427
|
-
|
|
428
|
-
```swift
|
|
429
|
-
let uiKitSettings = UIKitSettings()
|
|
430
|
-
.set(appID: "YOUR_APP_ID")
|
|
431
|
-
.set(authKey: "YOUR_AUTH_KEY")
|
|
432
|
-
.set(region: "us")
|
|
433
|
-
.set(deviceToken: apnsToken) // APNs token
|
|
434
|
-
.set(voipToken: voipToken) // VoIP token
|
|
435
|
-
.subscribePresenceForAllUsers()
|
|
436
|
-
.build()
|
|
437
|
-
|
|
438
|
-
CometChatUIKit(uiKitSettings: uiKitSettings) { result in
|
|
439
|
-
// ...
|
|
440
|
-
}
|
|
441
|
-
```
|
|
442
|
-
|
|
443
|
-
---
|
|
444
|
-
|
|
445
|
-
## 7. Notification Service Extension
|
|
446
|
-
|
|
447
|
-
For rich notifications with images and custom content:
|
|
448
|
-
|
|
449
|
-
### Create Extension
|
|
450
|
-
|
|
451
|
-
1. In Xcode, go to **File** → **New** → **Target**
|
|
452
|
-
2. Select **Notification Service Extension**
|
|
453
|
-
3. Name it (e.g., "NotificationService")
|
|
454
|
-
|
|
455
|
-
### Implement Extension
|
|
456
|
-
|
|
457
|
-
```swift
|
|
458
|
-
// NotificationService.swift
|
|
459
|
-
import UserNotifications
|
|
460
|
-
|
|
461
|
-
class NotificationService: UNNotificationServiceExtension {
|
|
462
|
-
|
|
463
|
-
var contentHandler: ((UNNotificationContent) -> Void)?
|
|
464
|
-
var bestAttemptContent: UNMutableNotificationContent?
|
|
465
|
-
|
|
466
|
-
override func didReceive(
|
|
467
|
-
_ request: UNNotificationRequest,
|
|
468
|
-
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
|
|
469
|
-
) {
|
|
470
|
-
self.contentHandler = contentHandler
|
|
471
|
-
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
|
|
472
|
-
|
|
473
|
-
guard let bestAttemptContent = bestAttemptContent else {
|
|
474
|
-
contentHandler(request.content)
|
|
475
|
-
return
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
// Customize notification content
|
|
479
|
-
if let messageData = request.content.userInfo["message"] as? [String: Any] {
|
|
480
|
-
customizeNotification(bestAttemptContent, with: messageData)
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
contentHandler(bestAttemptContent)
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
private func customizeNotification(
|
|
487
|
-
_ content: UNMutableNotificationContent,
|
|
488
|
-
with data: [String: Any]
|
|
489
|
-
) {
|
|
490
|
-
// Set title from sender name
|
|
491
|
-
if let senderName = data["senderName"] as? String {
|
|
492
|
-
content.title = senderName
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
// Set body from message
|
|
496
|
-
if let messageText = data["text"] as? String {
|
|
497
|
-
content.body = messageText
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
// Add image attachment if available
|
|
501
|
-
if let imageURL = data["imageURL"] as? String,
|
|
502
|
-
let url = URL(string: imageURL) {
|
|
503
|
-
downloadAndAttachImage(url, to: content)
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
private func downloadAndAttachImage(_ url: URL, to content: UNMutableNotificationContent) {
|
|
508
|
-
let task = URLSession.shared.downloadTask(with: url) { localURL, _, error in
|
|
509
|
-
guard let localURL = localURL, error == nil else { return }
|
|
510
|
-
|
|
511
|
-
let tempDir = FileManager.default.temporaryDirectory
|
|
512
|
-
let tempFile = tempDir.appendingPathComponent(UUID().uuidString + ".jpg")
|
|
513
|
-
|
|
514
|
-
try? FileManager.default.moveItem(at: localURL, to: tempFile)
|
|
515
|
-
|
|
516
|
-
if let attachment = try? UNNotificationAttachment(identifier: "image", url: tempFile) {
|
|
517
|
-
content.attachments = [attachment]
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
self.contentHandler?(content)
|
|
521
|
-
}
|
|
522
|
-
task.resume()
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
override func serviceExtensionTimeWillExpire() {
|
|
526
|
-
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
|
|
527
|
-
contentHandler(bestAttemptContent)
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
```
|
|
532
|
-
|
|
533
|
-
---
|
|
534
|
-
|
|
535
|
-
## 8. Badge Count Management
|
|
536
|
-
|
|
537
|
-
### Update Badge Count
|
|
538
|
-
|
|
539
|
-
```swift
|
|
540
|
-
// Set badge count
|
|
541
|
-
UIApplication.shared.applicationIconBadgeNumber = unreadCount
|
|
542
|
-
|
|
543
|
-
// Clear badge count
|
|
544
|
-
UIApplication.shared.applicationIconBadgeNumber = 0
|
|
545
|
-
```
|
|
546
|
-
|
|
547
|
-
### Sync with CometChat Unread Count
|
|
548
|
-
|
|
549
|
-
```swift
|
|
550
|
-
func updateBadgeCount() {
|
|
551
|
-
// getUnreadMessageCount's success closure receives a SINGLE [String: Any]
|
|
552
|
-
// (conversations keyed by uid/guid → count) — NOT two separate dicts.
|
|
553
|
-
CometChat.getUnreadMessageCount { unread in
|
|
554
|
-
var totalUnread = 0
|
|
555
|
-
for (_, count) in unread {
|
|
556
|
-
totalUnread += count as? Int ?? 0
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
DispatchQueue.main.async {
|
|
560
|
-
UIApplication.shared.applicationIconBadgeNumber = totalUnread
|
|
561
|
-
}
|
|
562
|
-
} onError: { error in
|
|
563
|
-
print("Error getting unread count: \(error?.errorDescription ?? "")")
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
```
|
|
567
|
-
|
|
568
|
-
---
|
|
569
|
-
|
|
570
|
-
## 9. Testing Push Notifications
|
|
571
|
-
|
|
572
|
-
### Using Terminal
|
|
573
|
-
|
|
574
|
-
```bash
|
|
575
|
-
# Test APNs push (requires authentication)
|
|
576
|
-
curl -v \
|
|
577
|
-
--header "apns-topic: com.yourapp.bundleid" \
|
|
578
|
-
--header "apns-push-type: alert" \
|
|
579
|
-
--header "authorization: bearer $JWT_TOKEN" \
|
|
580
|
-
--data '{"aps":{"alert":"Test message"}}' \
|
|
581
|
-
--http2 \
|
|
582
|
-
https://api.push.apple.com/3/device/$DEVICE_TOKEN
|
|
583
|
-
```
|
|
584
|
-
|
|
585
|
-
### Using CometChat Dashboard
|
|
586
|
-
|
|
587
|
-
1. Go to CometChat Dashboard
|
|
588
|
-
2. Navigate to **Users**
|
|
589
|
-
3. Select a user
|
|
590
|
-
4. Click **Send Push Notification**
|
|
591
|
-
5. Enter a test message
|
|
592
|
-
6. Send
|
|
593
|
-
|
|
594
|
-
---
|
|
595
|
-
|
|
596
|
-
## Troubleshooting
|
|
597
|
-
|
|
598
|
-
| Issue | Solution |
|
|
599
|
-
|---|---|
|
|
600
|
-
| Token not registering | Ensure device is physical, not simulator |
|
|
601
|
-
| Notifications not received | Check APNs certificate in dashboard |
|
|
602
|
-
| Badge not updating | Check notification permissions |
|
|
603
|
-
| VoIP not working | Ensure VoIP capability is enabled |
|
|
604
|
-
| Notifications delayed | Check APNs environment (dev vs prod) |
|
|
605
|
-
|
|
606
|
-
---
|
|
29
|
+
## VoIP / calls
|
|
30
|
+
Ringing while backgrounded is **also `CometChatPushNotifications`**, not a hand-rolled channel: it owns PushKit + CallKit for you (`registerForVoIPPushes()`, `presentCallScreen(for:sessionId:)`). **Never write your own `PKPushRegistryDelegate` / `CXProviderDelegate` or call `UIKitSettings.set(voipToken:)`** — the SDK owns both and a hand-rolled one fights it for the same callbacks. Full VoIP wiring lives in `cometchat-ios-v5-sdk` (§ "VoIP call notifications"); it needs an APNs **VoIP** provider in the Dashboard, the Voice-over-IP Background Mode, and a physical device.
|
|
607
31
|
|
|
608
|
-
##
|
|
32
|
+
## Gotchas
|
|
33
|
+
- **Simulator cannot verify this.** Delivery must be checked on a physical device; expect the automated gate to report push as blocked-external.
|
|
34
|
+
- **Badge counts drift** unless you update and clear them deliberately.
|
|
35
|
+
- **Sandbox vs production APNs** are different environments — a token from one will not deliver on the other.
|
|
609
36
|
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
3. **Test on real devices** — simulators don't support push
|
|
613
|
-
4. **Use Notification Service Extension** for rich notifications
|
|
614
|
-
5. **Implement proper deep linking** for notification taps
|
|
615
|
-
6. **Clear badge count** when user opens the app
|
|
616
|
-
7. **Handle both foreground and background** notifications
|
|
37
|
+
## Verify it works
|
|
38
|
+
On a real device: background the app, send a message from another user, see the notification, tap it and land in the right conversation. Then log out and confirm notifications stop.
|