Реализация Family Sharing подписки в iOS-приложении
Family Sharing для подписок — функция, которую App Store поддерживает с iOS 14. Суть: один член семьи покупает подписку, остальные (до 5 человек) получают доступ автоматически. Для приложения это означает дополнительную логику проверки транзакций и прав доступа.
StoreKit 2 и проверка Family Sharing
В StoreKit 2 транзакция содержит поле ownershipType: .purchased (купил сам) или .familyShared (получил через Family Sharing). Приложение обязано проверять оба случая при верификации доступа.
for await verificationResult in Transaction.currentEntitlements {
switch verificationResult {
case .verified(let transaction):
if transaction.productID == "com.app.premium" {
switch transaction.ownershipType {
case .purchased:
grantAccess(source: .directPurchase)
case .familyShared:
grantAccess(source: .familySharing)
@unknown default:
break
}
}
case .unverified:
// не доверяем транзакции — логируем, не даём доступ
break
}
}
Чтобы подписка вообще поддерживала Family Sharing, нужно включить это в App Store Connect для конкретного продукта. Это делается один раз в настройках In-App Purchase: переключатель «Family Sharing» → «On for all members». После включения нельзя отключить для уже купленных подписок.
Где появляются проблемы
Revoke при выходе из семьи. Если пользователь покинул Family Group, транзакция типа .familyShared получает revocationDate. Transaction.currentEntitlements перестаёт её возвращать автоматически. Но если приложение кэширует статус подписки локально (в UserDefaults, Keychain) без проверки актуального состояния — пользователь продолжает пользоваться premium после revoke.
Правильный подход: слушать Transaction.updates постоянно, не только при старте:
func listenForTransactionUpdates() {
Task {
for await verificationResult in Transaction.updates {
if case .verified(let transaction) = verificationResult {
if transaction.revocationDate != nil {
revokeAccess()
} else {
await transaction.finish()
grantAccess()
}
}
}
}
}
Тестирование. В Xcode Sandbox нельзя полноценно протестировать Family Sharing без нескольких тестовых Apple ID, настроенных как семья в App Store Connect → Users and Access → Sandbox Testers. Создать тестовую семью там же через Family Sharing в Sandbox — обязательный шаг, без него проверка familyShared транзакций невозможна.
StoreKit 1 vs StoreKit 2. В старом API (SKPaymentTransaction) ownershipType недоступен напрямую. Для проверки family-shared в SK1 нужно валидировать receipt на сервере — поле in_app[].is_in_family_sharing. Миграция на StoreKit 2 значительно упрощает логику.
Что входит в работу
- Настройка Family Sharing для продуктов в App Store Connect
- Реализация проверки
ownershipTypeчерез StoreKit 2 - Обработка revoke при выходе из Family Group
- Постоянный listener
Transaction.updatesна протяжении жизни приложения - Тестирование с Sandbox-семьёй
- Документация для серверной части (если валидация на бэкенде)
Сроки
3–5 дней включая настройку App Store Connect и тестирование с Sandbox аккаунтами. Стоимость рассчитывается индивидуально.







