Подтвердить что ты не робот

IOS: как определить, подписан ли пользователь на автообновляемую подписку

Надеюсь, что заголовок не требует пояснений. Я пытаюсь сделать что-то вроде этого:

checkIfUserIsSubscribedToProduct(productID, transactionID: "some-unique-transaction-string", completion: { error, status in
    if error == nil {
        if status ==  .Subscribed {
            // do something fun
        }
    }
 }

делает что-то вроде гипотетического кода, который я предоставил, существует? Я чувствую, что я принимаю сумасшедшие таблетки.

Edit

В подобных вопросах я продолжаю видеть общий ответ "о, вы должны подтвердить получение", но никаких объяснений о том, как или даже что такое квитанция. Может ли кто-нибудь предоставить мне, как "подтвердить получение"? Я пробовал этот учебник, но, похоже, не работал.

Изменить - для Bounty

Пожалуйста, обращайтесь к следующей ситуации: пользователь подписывается на мою автоматическую возобновляемую подписку и получает из нее больше цифрового контента - это круто, реализовано. Но как я могу проверить, действительно ли эта подписка остается действительной (т.е. Не отменяет подписку) при каждом открытии приложения? Какое простейшее решение для проверки этого? Есть ли что-то вроде гипотетического кода, который я представил в моем вопросе? Прошу вас пройти через это и предоставить любые дополнительные сведения по этому вопросу, которые могут быть полезны.

4b9b3361

Ответ 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

Как отмечается в некоторых комментариях, есть несколько недостатков с этими ответами.

  1. Вызов /verifyReceipt от клиента не является безопасным.
  2. Сравнение дат истечения срока действия с часами устройства может быть подделано путем изменения времени (всегда полезно попробовать взломать после отмены бесплатной пробной версии :))

Есть несколько других руководств по настройке сервера для обработки подтверждения получения, но это только часть проблемы. Выполнение сетевого запроса на распаковку и проверку квитанции при каждом запуске приложения может привести к проблемам, поэтому также должно быть некоторое кэширование для обеспечения бесперебойной работы.

Выручка SDC обеспечивает хорошее готовое решение для этого.

Несколько причин, почему мне нравится этот подход:

  • Проверяет сторону сервера чеков (без необходимости настраивать сервер)
  • Проверяет "активную" подписку с отметкой времени сервера, поэтому не может быть подделана путем изменения часов устройства
  • Кэширует результат, поэтому он очень быстрый и работает в автономном режиме

В этом вопросе есть еще несколько деталей: fooobar.com/info/1266732/...

Это работает до простой функции, которую вы можете вызывать так часто, как это необходимо, и в большинстве случаев она будет возвращаться синхронно (поскольку она кэшируется).

subscriptionStatus { (subscribed) in
    if subscribed {
        // Show that great pro content
    }
}