Реализация системы подарков между игроками
Gifting между игроками — социальная механика, которая увеличивает вовлечённость и косвенно стимулирует монетизацию через взаимность: получил подарок — хочешь отдарить. Технически это одна из самых нетривиальных фич: здесь пересекаются IAP, серверная логика, push-уведомления, anti-abuse и юридические ограничения платформ.
Ограничения платформ
Apple разрешает дарить только non-consumable IAP через встроенный механизм Gift Purchase (появился в iOS 17 для App Store). Gifting consumable (валюта, ресурсы) через App Store не поддерживается — Apple явно запрещает это в App Store Review Guidelines 3.1.1.
Обходной путь — игровые подарки через собственную систему, где отправитель тратит собственные виртуальные ресурсы (не реальные деньги). Это юридически чисто, не требует согласования с Apple и работает везде.
Google Play не имеет встроенного gifting, поэтому единственный вариант — собственная система на виртуальной валюте.
Архитектура системы подарков
Модель данных:
{
"giftId": "gift_uuid",
"senderId": "player_123",
"recipientId": "player_456",
"giftType": "gems",
"amount": 100,
"message": "Поздравляю с уровнем 50!",
"status": "pending",
"createdAt": "2025-03-26T10:00:00Z",
"expiresAt": "2025-04-02T10:00:00Z"
}
Поток:
- Отправитель выбирает получателя из списка друзей/гильдии
- Выбирает тип подарка и количество
- Подтверждает: ресурсы списываются с его баланса немедленно
- Сервер создаёт запись
giftсо статусомpending - Получатель получает push-уведомление
- Получатель принимает → ресурсы зачисляются на его баланс, статус →
accepted - При истечении
expiresAtбез принятия — ресурсы возвращаются отправителю, статус →expired
Возврат при истечении критичен для UX: игрок не должен «потерять» ресурсы только потому что получатель не зашёл в игру.
Лимиты и anti-abuse
Без ограничений gifting превращается в инструмент переноса ресурсов между alt-аккаунтами. Типичные лимиты:
- Максимум 5 подарков в день на один аккаунт
- Максимальная сумма одного подарка: 500 gems
- Минимальный возраст аккаунта для возможности дарить: 7 дней (анти-мульти)
- Нельзя дарить аккаунтам, добавленным в друзья менее 3 дней назад
Серверная проверка лимитов при каждом запросе — клиентские ограничения не считаются.
Логирование всех транзакций подарков с IP-адресом и device ID: это позволяет детектировать паттерны злоупотреблений (один IP → много аккаунтов, все дарят одному).
Push-уведомления
При получении подарка — немедленный push: «Игрок PlayerName прислал тебе 100 кристаллов! Забери подарок». Глубокая ссылка открывает экран входящих подарков напрямую.
За день до истечения срока — reminder: «Подарок от PlayerName истекает завтра».
На iOS используем APNs через Firebase Cloud Messaging или напрямую. На Android — FCM. Payload push-уведомления включает giftId для навигации.
UI подарков
Экран «Входящие подарки» — список с возможностью принять каждый подарком одним тапом и кнопкой «Принять все». Отображаем имя отправителя, тип и количество, сообщение, таймер истечения.
Анимация принятия — партиклы или короткая анимация зачисления. Без этого принятие подарка кажется техническим действием, а не радостным событием.
Для социального усиления: опциональный фид «Активность гильдии» где видно «Игрок А подарил Игроку Б 100 gems». Это стимулирует других игроков к участию.
Сроки: базовая система (без gifting через App Store, на виртуальных ресурсах) с лимитами, push и историей — 2–3 дня. Стоимость рассчитывается после обсуждения объёма лимитов и социальных фич.







