Хранение в приложении Покупка поступлений в приложении Beychain
-
12-11-2019 - |
Вопрос
Я никогда не реализовал в покупке приложений раньше, поэтому я использовал обертку MkStorekit и иметь рабочую реализацию. MKSTOREKIT удерживает все квитанции в пользовательских условиях .plist как bool, поэтому для пиратов очень просто распространять покупки в приложении в «треснувшем» состоянии. После того, как сделана первая покупка, пучок может быть распределен, а .plist можно воссоздать, чтобы включить разблокировки IAP.
Я хотел бы расширить MkStorekit для создания данных о покупке приложения в Keychain в iOS. Есть ли недостаток или возможная причина для этого, чтобы выплатить пользователей, быть ненадежным, или любую другую причину, по которой было бы общую неудачу, чтобы сделать это? Я понимаю, что пиратство неизбежно, и я определенно не хочу отчуждать уплачивать пользователей, но я чувствую, что userdefaults .plist слишком много способа обходить.
В моем сценарии простая строка будет помещена в брелок, когда сделана покупка. Таким образом, если бинарный распределяется, разблокировка еще не включена. Конечно, можно было бы придумать обходной путь, но это потребует немного больше усилий и знает, как найти истинный / ложный флаг и заставить его всегда возвращать правильное значение. Благодаря запутанию я мог даже сделать его немного сложнее отслеживать это вниз.
Спасибо за все свои идеи, и я ценю ответы, избегая обязательного неизбежного пиратства, сделки - это ответы. Я более заинтересован в технических возможностях этого решения.
Решение
Мы сделаем именно в нашем из наших приложений, и он работает Great.it's бесплатное приложение, которое вы можете обновить до полной версии, и мы храним индикатор обновления в брелок. Индикатор обновления - это произвольная строка, которую вы выбираете, но для целей брелок он рассматривается как пароль, то есть значение для Ksecvaluedata зашифровано в брете. Хороший бонус об этом подходе состоит в том, что если пользователь удаляет приложение, а затем позже повторно устанавливает его, все повторно включено, как магия, потому что элементы брелок хранятся отдельно от приложения. И это так мало дополнительной работы над хранением чего-либо в пользователей по умолчанию, которые мы решили, что это того стоит.
Вот как создать элемент безопасности:
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
[dict setObject: (id) kSecClassGenericPassword forKey: (id) kSecClass];
[dict setObject: kYourUpgradeStateKey forKey: (id) kSecAttrService];
[dict setObject: kYourUpgradeStateValue forKey: (id) kSecValueData];
SecItemAdd ((CFDictionaryRef) dict, NULL);
.
Вот как найти элемент безопасности, чтобы проверить его значение:
NSMutableDictionary* query = [NSMutableDictionary dictionary];
[query setObject: (id) kSecClassGenericPassword forKey: (id) kSecClass];
[query setObject: kYourUpgradeStateKey forKey: (id) kSecAttrService];
[query setObject: (id) kCFBooleanTrue forKey: (id) kSecReturnData];
NSData* upgradeItemData = nil;
SecItemCopyMatching ( (CFDictionaryRef) query, (CFTypeRef*) &upgradeItemData );
if ( !upgradeItemData )
{
// Disable feature
}
else
{
NSString* s = [[[NSString alloc]
initWithData: upgradeItemData
encoding: NSUTF8StringEncoding] autorelease];
if ( [s isEqualToString: kYourUpgradeStateValue] )
{
// Enable feature
}
}
.
Если UPGRADEITEMDATA - это ноль, то ключ не существует, чтобы вы могли предположить, что обновление не там или, то, что мы делаем, помещается в значение, которое означает не обновленное.
<Сильное> Обновление
Добавлено ksecreturndata (спасибо @luis для указания его)