Реалізація 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 аккаунтами. Вартість розраховується індивідуально.







