swift3 - generador - cupones de descuento
La aplicación no maneja el canje del código de promoción de compra de productos consumibles dentro de la aplicación (3)
Aparte de lo que dice Andrew (acerca de los códigos de promoción que solo funcionan para entornos de producción), parece que podría tener un problema relacionado con los mecanismos de gestión de "Compras de aplicaciones".
Debe tener sus compras que manipulan el objeto inicializado en AppDelegate, de modo que reciba inmediatamente las compras pendientes y las compras recién creadas, (o en este caso cuando se canjea un código)
Si marca los ejemplos que se muestran aquí:
En realidad estás haciendo lo que la manzana NO recomienda.
En su lugar, agregue el observador de StoreKit DENTRO de su AppDelegate:
class AppDelegate: UIResponder, UIApplicationDelegate {
....
// Attach an observer to the payment queue.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Attach an observer to the payment queue.
SKPaymentQueue.default().add(your_observer)
return true
}
// Called when the application is about to terminate.
func applicationWillTerminate(_ application: UIApplication) {
// Remove the observer.
SKPaymentQueue.default().remove(your_observer)
}
// OTHER STUFF...
}
Es posible que te falte el momento en que tu aplicación recibe las compras debido a esto.
Por cierto, ya tiene un objeto de ayuda "Compras en la aplicación" (IAPHealper). Todo lo que necesita hacer es hacer que su AppDelegate almacene una variable y crear una instancia dentro del método "didFinishLaunchingWithOptions".
Algo como:
class AppDelegate: UIResponder, UIApplicationDelegate {
var store : IAPHealper;
....
// Attach an observer to the payment queue.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
store = IAPHelper();
return true
}
// OTHER STUFF...
}
EDITAR: (Para mantener toda la información aquí en el desbordamiento de pila)
De acuerdo con la respuesta de un empleado de Apple: https://forums.developer.apple.com/message/204476#204476
Los códigos de promoción solo se pueden probar en la tienda de producción.
Entonces, para probarlos:
- Envíe su aplicación para la revisión de la aplicación.
- Establezca la fecha de lanzamiento de la aplicación en el futuro para que una vez que la revisión de la aplicación apruebe la aplicación, no esté disponible para el usuario general.
- Utilice un código de promoción de la aplicación para instalar la aplicación
- Utilice el código de promoción en la aplicación.
Y finalmente, la publicación del desarrollador también nos advierte que, después de que se haya aprobado una aplicación, debe esperar 48 horas antes de que los códigos comiencen a funcionar.
Entonces, si después de seguir los pasos descritos anteriormente, su aplicación no se comporta como se espera. Entonces, el problema al que se enfrenta es que su aplicación no está "lista" cuando Apple le envía la notificación de "compra exitosa". Por lo tanto, debe seguir la guía descrita en la primera parte de esta respuesta. (Acerca de la inicialización de su escucha de transacciones tan pronto como se inicie su aplicación)
Mi aplicación tiene la compra integrada en la aplicación (seguí este tutorial ), la funcionalidad de compra funciona. Sin embargo, cuando canjeo el código de promoción en App Store para uno de los productos de compra integrados en la aplicación, mi aplicación no responde. Incluso la App Store dice que el producto se ha canjeado con éxito, mi aplicación no responde.
¿Alguien que compró la aplicación desde la aplicación ha probado si su aplicación puede procesar el código de promoción? ¿Te importaría compartir la solución?
Comencé con esto:
override func viewDidLoad() {
NotificationCenter.default.addObserver(self,
selector: #selector(applicationDidBecomeActive(notification:)),
name: NSNotification.Name.UIApplicationDidBecomeActive,
object: nil
)
}
func applicationDidBecomeActive(notification: NSNotification){
let store = IAPHealper()
//what needs to be put here?
}
extension IAPHelper: SKPaymentTransactionObserver {
public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch (transaction.transactionState) {
case .purchased:
completeTransaction(transaction)
break
case .failed:
failedTransaction(transaction)
break
case .restored:
restoreTransaction(transaction)
break
case .deferred:
break
case .purchasing:
break
}
}
}
fileprivate func completeTransaction(_ transaction: SKPaymentTransaction) {
print("completeTransaction...")
deliverPurchaseNotificatioForIdentifier(transaction.payment.productIdentifier)
defaultQueue.finishTransaction(transaction)
purchaseCompletionHandler?(true, transaction)
}
fileprivate func restoreTransaction(_ transaction: SKPaymentTransaction) {
guard let productIdentifier = transaction.original?.payment.productIdentifier else { return }
print("restoreTransaction... /(productIdentifier)")
deliverPurchaseNotificatioForIdentifier(productIdentifier)
defaultQueue.finishTransaction(transaction)
}
fileprivate func failedTransaction(_ transaction: SKPaymentTransaction) {
print("failedTransaction...")
if transaction.error!._code != SKError.paymentCancelled.rawValue {
print("Transaction Error: /(String(describing: transaction.error?.localizedDescription))")
purchaseCompletionHandler?(false, transaction)
}
defaultQueue.finishTransaction(transaction)
}
fileprivate func deliverPurchaseNotificatioForIdentifier(_ identifier: String?) {
guard let identifier = identifier else { return }
purchasedProductIdentifiers.insert(identifier)
//NSNotificationCenter.defaultCenter().postNotificationName(IAPHelper.IAPHelperPurchaseNotification, object: identifier)
}
public func paymentQueue(_ queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]){
print("Removed from queue.")
print(transactions)
}
}
Gracias.
Los códigos de promoción solo funcionan en el entorno de producción.
Si desea asegurarse de que los IAP funcionen sin la versión real de la aplicación, utilice los códigos de promoción cuando la aplicación se encuentre en el estado de "versión pendiente de desarrollador" (después de la revisión). Un código promocional de la aplicación para instalar la aplicación y otro para probar IAP. A veces puede llevar más tiempo (hasta 2 días) distribuir los datos de todos los servidores de Apple.
@Eatton proporcionó información muy útil en el otro thread . Solo quiero resumir la solución para manejar el canje del Código de promoción para productos consumibles.
I. Debería usar SwiftyStoreKit y poner este código en AppDelegate:
SwiftyStoreKit.completeTransactions(atomically: true) { purchases in
for purchase in purchases {
switch purchase.transaction.transactionState {
case .purchased, .restored:
if purchase.needsFinishTransaction {
SwiftyStoreKit.finishTransaction(purchase.transaction)
}
// Unlock content
self.unlockIAPContent(productID: purchase.productId)
case .failed, .purchasing, .deferred:
break // do nothing
}
}
}
II. Si desea llamar a la lógica en cualquier ViewController, considere usar NotificationCenter , ponga el código debajo de // Desbloquear contenido
III. ¿Cómo probarlo?
En la versión iOS 11, Apple introdujo una nueva función para promocionar su compra desde la aplicación directamente en la App Store.
Primero agregue el controlador:
#if DEBUG
SwiftyStoreKit.shouldAddStorePaymentHandler = { payment, product in
return true
}
#endif
Luego componga la siguiente URL en su Mac y AirDrop a su dispositivo iOS y ábrala en Safari .
itms-services://?action=purchaseIntent&bundleId=com.example.app&productIdentifier=product_name
Luego se SwiftyStoreKit.completeTransactions()
bloque de finalización de SwiftyStoreKit.completeTransactions()
en su AppDelegate
.
Esto también se puede usar para probar el canje de códigos de promoción, ya que la solicitud de URL crea una transacción pendiente y la agrega a la cola. Asegúrese de eliminar este código para su lanzamiento de prod.
¡Espero que esto ayude!