@suro4ek/appmetrica-push-sdk 1.0.2

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.
@@ -0,0 +1,652 @@
1
+ # Полное руководство по интеграции AppMetrica Push SDK
2
+
3
+ ## Содержание
4
+
5
+ 1. [Обзор](#обзор)
6
+ 2. [Установка](#установка)
7
+ 3. [Настройка зависимостей](#настройка-зависимостей)
8
+ 4. [Настройка нативного кода](#настройка-нативного-кода)
9
+ 5. [Использование в React Native](#использование-в-react-native)
10
+ 6. [API Reference](#api-reference)
11
+ 7. [Примеры использования](#примеры-использования)
12
+ 8. [Troubleshooting](#troubleshooting)
13
+
14
+ ## Обзор
15
+
16
+ `@suro4ek/appmetrica-push-sdk` - это React Native библиотека для интеграции с Yandex AppMetrica Push SDK. Библиотека предоставляет единый API для работы с push-уведомлениями на iOS и Android.
17
+
18
+ ### Основные возможности
19
+
20
+ - ✅ **Кросс-платформенность** - единый API для iOS и Android
21
+ - ✅ **TypeScript поддержка** - полная типизация
22
+ - ✅ **Автоматическая обработка** - silent push уведомления
23
+ - ✅ **Простая интеграция** - минимум настройки
24
+ - ✅ **Firebase интеграция** - поддержка APNS токенов через Firebase
25
+
26
+ ## Установка
27
+
28
+ ### 1. Установка библиотеки
29
+
30
+ ```bash
31
+ # Через npm
32
+ npm install @suro4ek/appmetrica-push-sdk
33
+
34
+ # Через yarn
35
+ yarn add @suro4ek/appmetrica-push-sdk
36
+
37
+ # Через pnpm
38
+ pnpm add @suro4ek/appmetrica-push-sdk
39
+ ```
40
+
41
+ ### 2. Установка зависимостей
42
+
43
+ #### React Native Firebase
44
+
45
+ ```bash
46
+ npm install @react-native-firebase/messaging
47
+ ```
48
+
49
+ #### AppMetrica (обязательно)
50
+
51
+ ```bash
52
+ npm install @appmetrica/react-native-analytics
53
+ ```
54
+
55
+ #### iOS
56
+
57
+ ```bash
58
+ cd ios && pod install
59
+ ```
60
+
61
+ ## Настройка зависимостей
62
+
63
+ ### Android
64
+
65
+ #### 1. Firebase Cloud Messaging
66
+
67
+ Добавьте в `android/app/build.gradle`:
68
+
69
+ ```gradle
70
+ dependencies {
71
+ // Firebase Cloud Messaging
72
+ implementation platform('com.google.firebase:firebase-bom:33.2.0')
73
+ implementation 'com.google.firebase:firebase-messaging'
74
+ implementation 'com.google.firebase:firebase-messaging-ktx'
75
+ }
76
+
77
+ // В конце файла
78
+ apply plugin: 'com.google.gms.google-services'
79
+ ```
80
+
81
+ #### 2. Google Services
82
+
83
+ Добавьте в `android/build.gradle`:
84
+
85
+ ```gradle
86
+ buildscript {
87
+ dependencies {
88
+ classpath 'com.google.gms:google-services:4.4.0'
89
+ }
90
+ }
91
+ ```
92
+
93
+ #### 3. Google Services JSON
94
+
95
+ Скачайте `google-services.json` из Firebase Console и поместите в `android/app/`
96
+
97
+ ### iOS
98
+
99
+ #### 1. Firebase Configuration
100
+
101
+ Скачайте `GoogleService-Info.plist` из Firebase Console и добавьте в Xcode проект
102
+
103
+ #### 2. Push Notifications
104
+
105
+ Включите Push Notifications в Xcode:
106
+
107
+ 1. Откройте проект в Xcode
108
+ 2. Выберите ваш target
109
+ 3. Перейдите в "Signing & Capabilities"
110
+ 4. Нажмите "+ Capability"
111
+ 5. Добавьте "Push Notifications"
112
+
113
+ ## Настройка нативного кода
114
+
115
+ ### Android
116
+
117
+ #### 1. AndroidManifest.xml
118
+
119
+ Добавьте в `android/app/src/main/AndroidManifest.xml`:
120
+
121
+ ```xml
122
+ <application>
123
+ <!-- Silent Push Receiver для AppMetrica Push SDK -->
124
+ <receiver android:name="com.appmetricapush.SilentPushReceiver"
125
+ android:exported="false">
126
+ <intent-filter>
127
+ <action android:name="com.appmetricapush.action.ymp.SILENT_PUSH_RECEIVE"/>
128
+ </intent-filter>
129
+ </receiver>
130
+
131
+ <!-- Firebase Messaging Service для интеграции с AppMetrica Push SDK -->
132
+ <service android:name="com.appmetricapush.FirebaseMessagingMainService"
133
+ android:enabled="true"
134
+ android:exported="false">
135
+ <intent-filter android:priority="100">
136
+ <action android:name="com.google.firebase.MESSAGING_EVENT"/>
137
+ </intent-filter>
138
+ </service>
139
+
140
+ <!-- Отключаем стандартный AppMetrica Messaging Service -->
141
+ <service android:name="io.appmetrica.analytics.push.provider.firebase.AppMetricaMessagingService"
142
+ android:enabled="false"
143
+ tools:node="remove"/>
144
+
145
+ <!-- Иконка уведомлений по умолчанию для AppMetrica Push SDK -->
146
+ <meta-data android:name="io.appmetrica.analytics.push.default_notification_icon"
147
+ android:resource="@drawable/ic_stat_notification"/>
148
+ </application>
149
+ ```
150
+
151
+ #### 2. Иконка уведомлений
152
+
153
+ Создайте иконку `ic_stat_notification.png` в `android/app/src/main/res/drawable/`
154
+
155
+ ### iOS
156
+
157
+ #### 1. AppDelegate.swift
158
+
159
+ Минимальная настройка (инициализация происходит через React Native):
160
+
161
+ ```swift
162
+ import UIKit
163
+ import Firebase
164
+
165
+ @main
166
+ class AppDelegate: UIResponder, UIApplicationDelegate {
167
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
168
+ // Firebase инициализация
169
+ FirebaseApp.configure()
170
+
171
+ // AppMetrica Push SDK инициализируется через React Native
172
+ return true
173
+ }
174
+ }
175
+ ```
176
+
177
+ #### 2. Info.plist
178
+
179
+ Добавьте разрешения для push уведомлений:
180
+
181
+ ```xml
182
+ <key>UIBackgroundModes</key>
183
+ <array>
184
+ <string>remote-notification</string>
185
+ </array>
186
+ ```
187
+
188
+ ## Использование в React Native
189
+
190
+ ### ⚠️ Важно: Порядок инициализации
191
+
192
+ **AppMetrica Push SDK должен инициализироваться ТОЛЬКО после активации основной AppMetrica!**
193
+
194
+ ```typescript
195
+ import { AppMetrica } from "@appmetrica/react-native-analytics";
196
+
197
+ // 1. Сначала активируем основную AppMetrica
198
+ AppMetrica.activate({
199
+ apiKey: "YOUR_APPMETRICA_API_KEY",
200
+ });
201
+
202
+ // 2. ТОЛЬКО ПОСЛЕ этого инициализируем Push SDK
203
+ await AppMetricaPush.initialize({
204
+ debugMode: __DEV__,
205
+ apnsToken: Platform.OS === "ios" ? apnsToken : undefined,
206
+ });
207
+ ```
208
+
209
+ ### 1. Базовый пример
210
+
211
+ ```typescript
212
+ import { Platform } from "react-native";
213
+ import { getAPNSToken, getMessaging } from "@react-native-firebase/messaging";
214
+ import { AppMetrica } from "@appmetrica/react-native-analytics";
215
+ import { AppMetricaPush } from "@suro4ek/appmetrica-push-sdk";
216
+
217
+ const initializeAppMetricaWithPush = async () => {
218
+ try {
219
+ // 1. Активация основной AppMetrica
220
+ AppMetrica.activate({
221
+ apiKey: "YOUR_APPMETRICA_API_KEY",
222
+ });
223
+
224
+ console.log("AppMetrica activated");
225
+
226
+ // 2. Получение APNS токена для iOS
227
+ let apnsToken = "";
228
+ if (Platform.OS === "ios") {
229
+ const messaging = getMessaging();
230
+ apnsToken = (await getAPNSToken(messaging)) ?? "";
231
+
232
+ if (!apnsToken) {
233
+ console.error("Failed to get APNS token for iOS");
234
+ return;
235
+ }
236
+ }
237
+
238
+ // 3. Инициализация AppMetrica Push SDK (ТОЛЬКО после AppMetrica.activate)
239
+ const result = await AppMetricaPush.initialize({
240
+ debugMode: __DEV__,
241
+ apnsToken: Platform.OS === "ios" ? apnsToken : undefined,
242
+ });
243
+
244
+ if (result.success) {
245
+ console.log("AppMetrica Push SDK initialized successfully");
246
+ } else {
247
+ console.error("Failed to initialize AppMetrica Push SDK:", result.error);
248
+ }
249
+ } catch (error) {
250
+ console.error("Error initializing AppMetrica Push SDK:", error);
251
+ }
252
+ };
253
+ ```
254
+
255
+ ### 2. Обработка push уведомлений
256
+
257
+ ```typescript
258
+ import messaging from "@react-native-firebase/messaging";
259
+ import { AppMetricaPush } from "@suro4ek/appmetrica-push-sdk";
260
+
261
+ // Обработка уведомлений в foreground
262
+ const unsubscribe = messaging().onMessage(async (remoteMessage) => {
263
+ console.log("A new FCM message arrived!", remoteMessage);
264
+
265
+ // Проверяем, что уведомление от AppMetrica
266
+ const isFromAppMetrica = await AppMetricaPush.isNotificationFromAppMetrica(
267
+ remoteMessage
268
+ );
269
+
270
+ if (isFromAppMetrica) {
271
+ // Получаем пользовательские данные
272
+ const userData = await AppMetricaPush.getUserData(remoteMessage);
273
+ console.log("AppMetrica user data:", userData);
274
+
275
+ // Показываем уведомление
276
+ // ... ваш код для отображения уведомления
277
+ }
278
+ });
279
+
280
+ // Обработка уведомлений при открытии приложения
281
+ messaging().onNotificationOpenedApp((remoteMessage) => {
282
+ console.log(
283
+ "Notification caused app to open from background state:",
284
+ remoteMessage
285
+ );
286
+
287
+ // Проверяем, что уведомление от AppMetrica
288
+ AppMetricaPush.isNotificationFromAppMetrica(remoteMessage).then(
289
+ (isFromAppMetrica) => {
290
+ if (isFromAppMetrica) {
291
+ // Обрабатываем открытие уведомления
292
+ // ... ваш код навигации
293
+ }
294
+ }
295
+ );
296
+ });
297
+ ```
298
+
299
+ ### 3. Использование React Hook
300
+
301
+ ```typescript
302
+ import React from "react";
303
+ import { View, Text } from "react-native";
304
+ import { useAppMetricaPush } from "@suro4ek/appmetrica-push-sdk";
305
+
306
+ const MyComponent = () => {
307
+ const { sdkInfo, isInitialized, isLoading } = useAppMetricaPush();
308
+
309
+ if (isLoading) {
310
+ return <Text>Loading...</Text>;
311
+ }
312
+
313
+ return (
314
+ <View>
315
+ <Text>SDK initialized: {isInitialized ? "Yes" : "No"}</Text>
316
+ {sdkInfo && <Text>Version: {sdkInfo.version}</Text>}
317
+ </View>
318
+ );
319
+ };
320
+ ```
321
+
322
+ ## API Reference
323
+
324
+ ### Основные методы
325
+
326
+ #### `initialize(config: PushConfig): Promise<InitializationResult>`
327
+
328
+ Инициализация AppMetrica Push SDK.
329
+
330
+ **Параметры:**
331
+
332
+ - `config.debugMode?: boolean` - режим отладки
333
+ - `config.apnsToken?: string` - APNS токен для iOS (обязательно)
334
+ - `config.appGroup?: string` - App Group для iOS расширений
335
+
336
+ **Возвращает:**
337
+
338
+ ```typescript
339
+ {
340
+ success: boolean;
341
+ error?: string;
342
+ }
343
+ ```
344
+
345
+ #### `isNotificationFromAppMetrica(notification: any): Promise<boolean>`
346
+
347
+ Проверяет, что уведомление отправлено через AppMetrica.
348
+
349
+ **Параметры:**
350
+
351
+ - `notification` - объект уведомления
352
+
353
+ **Возвращает:** `boolean`
354
+
355
+ #### `getUserData(notification: any): Promise<any>`
356
+
357
+ Извлекает пользовательские данные из уведомления AppMetrica.
358
+
359
+ **Параметры:**
360
+
361
+ - `notification` - объект уведомления
362
+
363
+ **Возвращает:** объект с пользовательскими данными
364
+
365
+ #### `getSDKInfo(): Promise<SDKInfo | null>`
366
+
367
+ Получает информацию о SDK.
368
+
369
+ **Возвращает:**
370
+
371
+ ```typescript
372
+ {
373
+ version: string;
374
+ platform: string;
375
+ sdkName?: string;
376
+ libraryVersion?: string;
377
+ }
378
+ ```
379
+
380
+ ### Утилиты
381
+
382
+ #### `initializeAppMetricaPush(config: PushConfig, forceReinit?: boolean): Promise<boolean>`
383
+
384
+ Инициализация с дополнительными проверками.
385
+
386
+ #### `isSDKInitialized(): boolean`
387
+
388
+ Проверяет, инициализирован ли SDK.
389
+
390
+ #### `getCurrentConfig(): PushConfig | null`
391
+
392
+ Получает текущую конфигурацию.
393
+
394
+ #### `registerDeviceToken(deviceToken: string): Promise<boolean>`
395
+
396
+ Регистрирует device token.
397
+
398
+ ### React Hook
399
+
400
+ #### `useAppMetricaPush(): UseAppMetricaPushReturn`
401
+
402
+ Хук для работы с SDK в React компонентах.
403
+
404
+ **Возвращает:**
405
+
406
+ ```typescript
407
+ {
408
+ sdkInfo: SDKInfo | null;
409
+ isInitialized: boolean;
410
+ isLoading: boolean;
411
+ refreshSDKInfo: () => Promise<void>;
412
+ }
413
+ ```
414
+
415
+ ## Примеры использования
416
+
417
+ ### 1. Полная инициализация
418
+
419
+ ```typescript
420
+ import { useEffect } from "react";
421
+ import { Platform } from "react-native";
422
+ import { getAPNSToken, getMessaging } from "@react-native-firebase/messaging";
423
+ import { AppMetrica } from "@appmetrica/react-native-analytics";
424
+ import { AppMetricaPush } from "@suro4ek/appmetrica-push-sdk";
425
+
426
+ export const useAppMetricaPushInit = () => {
427
+ useEffect(() => {
428
+ const init = async () => {
429
+ try {
430
+ // 1. Активация основной AppMetrica (ОБЯЗАТЕЛЬНО ПЕРВЫМ!)
431
+ AppMetrica.activate({
432
+ apiKey: "YOUR_APPMETRICA_API_KEY",
433
+ });
434
+
435
+ console.log("AppMetrica activated");
436
+
437
+ // 2. Получение разрешений на push уведомления
438
+ const authStatus = await messaging().requestPermission();
439
+ const enabled =
440
+ authStatus === messaging.AuthorizationStatus.AUTHORIZED ||
441
+ authStatus === messaging.AuthorizationStatus.PROVISIONAL;
442
+
443
+ if (!enabled) {
444
+ console.log("Push notifications not authorized");
445
+ return;
446
+ }
447
+
448
+ // 3. Получение APNS токена для iOS
449
+ let apnsToken = "";
450
+ if (Platform.OS === "ios") {
451
+ const messagingInstance = getMessaging();
452
+ apnsToken = (await getAPNSToken(messagingInstance)) ?? "";
453
+ }
454
+
455
+ // 4. Инициализация AppMetrica Push SDK (ТОЛЬКО после AppMetrica.activate)
456
+ const result = await AppMetricaPush.initialize({
457
+ debugMode: __DEV__,
458
+ apnsToken: Platform.OS === "ios" ? apnsToken : undefined,
459
+ });
460
+
461
+ if (result.success) {
462
+ console.log("AppMetrica Push SDK initialized");
463
+ }
464
+ } catch (error) {
465
+ console.error("Failed to initialize AppMetrica Push SDK:", error);
466
+ }
467
+ };
468
+
469
+ init();
470
+ }, []);
471
+ };
472
+ ```
473
+
474
+ ### 2. Обработка уведомлений с навигацией
475
+
476
+ ```typescript
477
+ import { AppMetricaPush } from "@suro4ek/appmetrica-push-sdk";
478
+ import { NavigationContainerRef } from "@react-navigation/native";
479
+
480
+ const handleNotificationPress = async (notification: any) => {
481
+ const isFromAppMetrica = await AppMetricaPush.isNotificationFromAppMetrica(
482
+ notification
483
+ );
484
+
485
+ if (isFromAppMetrica) {
486
+ const userData = await AppMetricaPush.getUserData(notification);
487
+
488
+ // Навигация на основе данных уведомления
489
+ if (userData?.screen) {
490
+ navigationRef.current?.navigate(userData.screen, userData.params);
491
+ }
492
+ }
493
+ };
494
+ ```
495
+
496
+ ### 3. Отслеживание событий
497
+
498
+ ```typescript
499
+ import { AppMetricaPush } from "@suro4ek/appmetrica-push-sdk";
500
+
501
+ const trackPushEvent = async (notification: any, action: string) => {
502
+ const isFromAppMetrica = await AppMetricaPush.isNotificationFromAppMetrica(
503
+ notification
504
+ );
505
+
506
+ if (isFromAppMetrica) {
507
+ const userData = await AppMetricaPush.getUserData(notification);
508
+
509
+ // Отправка события в аналитику
510
+ analytics.track("push_notification_action", {
511
+ action,
512
+ campaign_id: userData?.campaign_id,
513
+ message_id: userData?.message_id,
514
+ });
515
+ }
516
+ };
517
+ ```
518
+
519
+ ## Troubleshooting
520
+
521
+ ### Частые проблемы
522
+
523
+ #### 1. "AppMetricaPushModule is not available"
524
+
525
+ **Причины:**
526
+
527
+ - Библиотека не установлена
528
+ - Не выполнена линковка (iOS)
529
+ - Не пересобран проект
530
+
531
+ **Решение:**
532
+
533
+ ```bash
534
+ # Переустановка
535
+ npm uninstall @suro4ek/appmetrica-push-sdk
536
+ npm install @suro4ek/appmetrica-push-sdk
537
+
538
+ # iOS
539
+ cd ios && pod install
540
+
541
+ # Пересборка
542
+ npx react-native run-ios
543
+ npx react-native run-android
544
+ ```
545
+
546
+ #### 2. Push-уведомления не приходят
547
+
548
+ **Проверьте:**
549
+
550
+ 1. **Порядок инициализации:**
551
+
552
+ ```typescript
553
+ // ❌ НЕПРАВИЛЬНО - Push SDK инициализируется до AppMetrica
554
+ await AppMetricaPush.initialize(config);
555
+ AppMetrica.activate({ apiKey: "YOUR_KEY" });
556
+
557
+ // ✅ ПРАВИЛЬНО - сначала AppMetrica, потом Push SDK
558
+ AppMetrica.activate({ apiKey: "YOUR_KEY" });
559
+ await AppMetricaPush.initialize(config);
560
+ ```
561
+
562
+ 2. **Firebase настройки:**
563
+
564
+ - `google-services.json` в `android/app/`
565
+ - `GoogleService-Info.plist` в iOS проекте
566
+
567
+ 3. **Разрешения:**
568
+
569
+ ```typescript
570
+ const authStatus = await messaging().requestPermission();
571
+ console.log("Authorization status:", authStatus);
572
+ ```
573
+
574
+ 4. **APNS токен (iOS):**
575
+
576
+ ```typescript
577
+ const apnsToken = await getAPNSToken(getMessaging());
578
+ console.log("APNS token:", apnsToken);
579
+ ```
580
+
581
+ 5. **Логи:**
582
+
583
+ ```bash
584
+ # Android
585
+ npx react-native log-android
586
+
587
+ # iOS
588
+ npx react-native log-ios
589
+ ```
590
+
591
+ #### 3. Ошибки компиляции
592
+
593
+ **Решение:**
594
+
595
+ ```bash
596
+ # Очистка кэша
597
+ npx react-native start --reset-cache
598
+
599
+ # Очистка build
600
+ cd android && ./gradlew clean
601
+ cd ios && xcodebuild clean
602
+
603
+ # Пересборка
604
+ npx react-native run-android
605
+ npx react-native run-ios
606
+ ```
607
+
608
+ #### 4. Silent Push не работает
609
+
610
+ **Проверьте AndroidManifest.xml:**
611
+
612
+ ```xml
613
+ <receiver android:name="com.appmetricapush.SilentPushReceiver"
614
+ android:exported="false">
615
+ <intent-filter>
616
+ <action android:name="com.appmetricapush.action.ymp.SILENT_PUSH_RECEIVE"/>
617
+ </intent-filter>
618
+ </receiver>
619
+ ```
620
+
621
+ #### 5. Уведомления без звука
622
+
623
+ **Для Android:** Убедитесь, что в AppMetrica указан канал `appmetrica_push_channel`
624
+
625
+ **Для iOS:** Проверьте настройки APNS сертификатов
626
+
627
+ ### Отладка
628
+
629
+ #### Включение debug режима
630
+
631
+ ```typescript
632
+ await AppMetricaPush.initialize({
633
+ debugMode: true, // Включает подробные логи
634
+ apnsToken: apnsToken,
635
+ });
636
+ ```
637
+
638
+ #### Проверка статуса SDK
639
+
640
+ ```typescript
641
+ const isInitialized = AppMetricaPush.isSDKInitialized();
642
+ const config = AppMetricaPush.getConfig();
643
+ const sdkInfo = await AppMetricaPush.getSDKInfo();
644
+
645
+ console.log("SDK Status:", { isInitialized, config, sdkInfo });
646
+ ```
647
+
648
+ ### Поддержка
649
+
650
+ - **GitHub Issues:** [suro4ek/appmetrica-push-sdk](https://github.com/suro4ek/appmetrica-push-sdk/issues)
651
+ - **AppMetrica Docs:** [Push SDK Documentation](https://appmetrica.yandex.ru/docs/mobile-sdk-dg/push-sdk/about.html)
652
+ - **Firebase Docs:** [React Native Firebase](https://rnfirebase.io/)