IOS: как определить, подписан ли пользователь на автообновляемую подписку
Надеюсь, что заголовок не требует пояснений. Я пытаюсь сделать что-то вроде этого:
checkIfUserIsSubscribedToProduct(productID, transactionID: "some-unique-transaction-string", completion: { error, status in
if error == nil {
if status == .Subscribed {
// do something fun
}
}
}
делает что-то вроде гипотетического кода, который я предоставил, существует? Я чувствую, что я принимаю сумасшедшие таблетки.
Edit
В подобных вопросах я продолжаю видеть общий ответ "о, вы должны подтвердить получение", но никаких объяснений о том, как или даже что такое квитанция. Может ли кто-нибудь предоставить мне, как "подтвердить получение"? Я пробовал этот учебник, но, похоже, не работал.
Изменить - для Bounty
Пожалуйста, обращайтесь к следующей ситуации: пользователь подписывается на мою автоматическую возобновляемую подписку и получает из нее больше цифрового контента - это круто, реализовано. Но как я могу проверить, действительно ли эта подписка остается действительной (т.е. Не отменяет подписку) при каждом открытии приложения? Какое простейшее решение для проверки этого? Есть ли что-то вроде гипотетического кода, который я представил в моем вопросе? Прошу вас пройти через это и предоставить любые дополнительные сведения по этому вопросу, которые могут быть полезны.
Ответы
Ответ 1
Я знаю, что все очень беспокоились обо мне и о том, как я это делаю - не боюсь, решила мою проблему. Основная проблема заключалась в том, что я пробовал мусор и устаревший код в этой ссылке, но он не работал, поэтому я отказался от него. Затем я вернулся к нему и реализовал его с помощью Alamofire
, и он отлично работает. Здесь решение кода:
Swift 3:
let receiptURL = Bundle.main.appStoreReceiptURL
let receipt = NSData(contentsOf: receiptURL!)
let requestContents: [String: Any] = [
"receipt-data": receipt!.base64EncodedString(options: []),
"password": "your iTunes Connect shared secret"
]
let appleServer = receiptURL?.lastPathComponent == "sandboxReceipt" ? "sandbox" : "buy"
let stringURL = "https://\(appleServer).itunes.apple.com/verifyReceipt"
print("Loading user receipt: \(stringURL)...")
Alamofire.request(stringURL, method: .post, parameters: requestContents, encoding: JSONEncoding.default)
.responseJSON { response in
if let value = response.result.value as? NSDictionary {
print(value)
} else {
print("Receiving receipt from App Store failed: \(response.result)")
}
}
Ответ 2
Чего вы пытаетесь достичь в частности? Вы хотите проверить конкретный Apple ID?
Я очень сомневаюсь, что это возможно благодаря SDK. Ссылаясь на Возможно ли получить идентификатор яблока пользователя через SDK?, вы можете видеть, что вы даже не можете запрашивать идентификатор напрямую, а скорее сервисы, связанные с ним.
Будет работать кэширование всех транзакций на вашем собственном сервере и поиск его базы данных локально, но для этого потребуется, чтобы приложение запрашивало у пользователя Apple ID, чтобы приложение могло обновлять состояние подписки всякий раз, когда оно запускается, поскольку оно может проверять IAP идентификатор, связанный с устройством.
Однако пользователь может просто набрать то, что он хотел - и вряд ли это получится через процесс проверки приложений Apple.
Ответ 3
Я использую MKSoreKit https://github.com/MugunthKumar/MKStoreKit для автоматического продления подписки. но в объективе c вы можете проверить код библиотеки для решения. Я использую его в своем коде, и он работает нормально.
используя метод ниже, вы можете легко проверить статус подписки.
if([MKStoreManager isProductPurchased:productIdentifier]) {
//unlock it
}
Он получает идентификатор apple от устройства, и я думаю, что это специфичный для пользователя
Ответ 4
Как отмечается в некоторых комментариях, есть несколько недостатков с этими ответами.
- Вызов
/verifyReceipt
от клиента не является безопасным. - Сравнение дат истечения срока действия с часами устройства может быть подделано путем изменения времени (всегда полезно попробовать взломать после отмены бесплатной пробной версии :))
Есть несколько других руководств по настройке сервера для обработки подтверждения получения, но это только часть проблемы. Выполнение сетевого запроса на распаковку и проверку квитанции при каждом запуске приложения может привести к проблемам, поэтому также должно быть некоторое кэширование для обеспечения бесперебойной работы.
Выручка SDC обеспечивает хорошее готовое решение для этого.
Несколько причин, почему мне нравится этот подход:
- Проверяет сторону сервера чеков (без необходимости настраивать сервер)
- Проверяет "активную" подписку с отметкой времени сервера, поэтому не может быть подделана путем изменения часов устройства
- Кэширует результат, поэтому он очень быстрый и работает в автономном режиме
В этом вопросе есть еще несколько деталей: fooobar.com/info/1266732/...
Это работает до простой функции, которую вы можете вызывать так часто, как это необходимо, и в большинстве случаев она будет возвращаться синхронно (поскольку она кэшируется).
subscriptionStatus { (subscribed) in
if subscribed {
// Show that great pro content
}
}