Ios 购买应用内购买后保存更改
我的应用程序中有一个用于删除广告横幅的应用程序内购买,当我成功购买并返回到我的主视图控制器时,该广告未被删除,但当我退出应用程序并重新打开它时,该广告消失并保持消失状态。几乎就像它记得我在下一次加载时购买了remove ads IAP,但不是在购买之后。一个非常聪明的人告诉我,我需要这样做: 现在,您所要做的就是调用位于 完成后返回VC后,ViewWillDisplay/viewDidLoad方法 购买IAP。如何做到这一点取决于你自己。如果你需要帮助 鉴于此,我建议提出一个新问题 线越来越长了。如果你同意我的回答,我将不胜感激 选择它作为正确答案,因为我已经帮你得到了这个 工作 你有什么想法吗 谢谢大家! 以下是我的主视图控制器的屏幕截图: ViewController.hIos 购买应用内购买后保存更改,ios,objective-c,in-app-purchase,Ios,Objective C,In App Purchase,我的应用程序中有一个用于删除广告横幅的应用程序内购买,当我成功购买并返回到我的主视图控制器时,该广告未被删除,但当我退出应用程序并重新打开它时,该广告消失并保持消失状态。几乎就像它记得我在下一次加载时购买了remove ads IAP,但不是在购买之后。一个非常聪明的人告诉我,我需要这样做: 现在,您所要做的就是调用位于 完成后返回VC后,ViewWillDisplay/viewDidLoad方法 购买IAP。如何做到这一点取决于你自己。如果你需要帮助 鉴于此,我建议提出一个新问题 线越来越长了
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
#import <CoreMotion/CoreMotion.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
@interface ViewController : UIViewController <UIWebViewDelegate, MKMapViewDelegate, CLLocationManagerDelegate>
@property (strong, nonatomic) IBOutlet UIWebView *viewWeb;
@property (nonatomic, strong) CLLocationManager *locationManager;
@property (nonatomic, strong) CLLocation *currentLocation;
@property (weak, nonatomic) IBOutlet UIImageView *PokeABowlAd;
@end
RageIAPHelper.m
#import "RageIAPHelper.h"
#import "ViewController.h"
@implementation RageIAPHelper
+ (RageIAPHelper *)sharedInstance {
static dispatch_once_t once;
static RageIAPHelper * sharedInstance;
dispatch_once(&once, ^{
NSSet * productIdentifiers = [NSSet setWithObjects:
@“com.GPS.iapra",
@"com.GPS.iapb”,
nil];
sharedInstance = [[self alloc] initWithProductIdentifiers:productIdentifiers];
});
return sharedInstance;
}
@end
因此,我认为发生的情况是,在调用IAP.m中的
initWithProductIdentifers
方法之前,它不会识别您的购买(这仅在加载应用程序时发生)
因此,在IAP.m中尝试修改:
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"completeTransaction...");
[self provideContentForProductIdentifier:transaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
致:
另外,我认为ViewWillAppeal没有被调用的原因是,您的故事板中似乎有两个NavigationController。尝试删除第二个(VC和MasterVC之间的一个)。如果你同时做了这两件事,这应该会起作用。发布你的方法,告诉你的广告横幅显示或隐藏。听起来你的广告没有在视图中检查购买情况。你需要发布你的代码来确认。你是在VC还是MasterVC中购买IAP的?如果是在MasterVC中,请尝试将ViewWillDisplay方法从VC复制并粘贴到MasterVC。您可以发布MasterVC的屏幕截图吗?还有,你和演员克雷根道一样吗?@Creagen,看看下面我的答案。还有,这真是太棒了,我只是试了一下,但它似乎没有删除广告:/你删除了第二个NavigationController?视图中的NSLog是否会出现问题?找到问题!你说的每一句话都是需要的,我唯一能让它起作用的就是-(void)viewwillbeen to-(void)viewwillbeen:(BOOL)animated:D你是个天才!谢谢谢谢谢谢谢谢哦是的那就行了哈哈!我一定会把它发出去!它将来自Twitter上的@CreagenDow。一定要跟我走,我会跟你回去的。谢谢你的帮助,我以后可能需要更多的指导,希望晚些时候而不是更早:p在Facebook上添加我,我们会保持联系,或者添加我。我还没有完全了解这个网站是如何工作的。英雄联盟
#import <StoreKit/StoreKit.h>
UIKIT_EXTERN NSString *const IAPHelperProductPurchasedNotification;
typedef void (^RequestProductsCompletionHandler)(BOOL success, NSArray * products);
@interface IAPHelper : NSObject
- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers;
- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler;
- (void)buyProduct:(SKProduct *)product;
- (BOOL)productPurchased:(NSString *)productIdentifier;
- (void)restoreCompletedTransactions;
@property (weak, nonatomic) IBOutlet UIImageView *PokeABowlAd;
@end
#define SHOW_ADS_KEY @"Show Ads Key"
// 1
#import "IAPHelper.h"
#import <StoreKit/StoreKit.h>
NSString *const IAPHelperProductPurchasedNotification = @"IAPHelperProductPurchasedNotification";
// 2
@interface IAPHelper () <SKProductsRequestDelegate, SKPaymentTransactionObserver>
@end
// 3
@implementation IAPHelper {
SKProductsRequest * _productsRequest;
RequestProductsCompletionHandler _completionHandler;
NSSet * _productIdentifiers;
NSMutableSet * _purchasedProductIdentifiers;
}
- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers {
if ((self = [super init])) {
// Store product identifiers
_productIdentifiers = productIdentifiers;
// Check for previously purchased products
_purchasedProductIdentifiers = [NSMutableSet set];
for (NSString * productIdentifier in _productIdentifiers) {
BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier];
if (productPurchased) {
[_purchasedProductIdentifiers addObject:productIdentifier];
NSLog(@"Previously purchased: %@", productIdentifier);
// NEW CODE
if ([productIdentifier isEqualToString:@"Ads"]){
[[NSUserDefaults standardUserDefaults] setObject: @"No" forKey:SHOW_ADS_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// NEW CODE ^^
} else {
NSLog(@"Not purchased: %@", productIdentifier);
}
}
// Add self as transaction observer
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
return self;
}
- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler {
// 1
_completionHandler = [completionHandler copy];
// 2
_productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers];
_productsRequest.delegate = self;
[_productsRequest start];
}
- (BOOL)productPurchased:(NSString *)productIdentifier {
return [_purchasedProductIdentifiers containsObject:productIdentifier];
}
- (void)buyProduct:(SKProduct *)product {
NSLog(@"Buying %@...", product.productIdentifier);
SKPayment * payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
#pragma mark - SKProductsRequestDelegate
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSLog(@"Loaded list of products...");
_productsRequest = nil;
NSArray * skProducts = response.products;
for (SKProduct * skProduct in skProducts) {
NSLog(@"Found product: %@ %@ %0.2f",
skProduct.productIdentifier,
skProduct.localizedTitle,
skProduct.price.floatValue);
}
_completionHandler(YES, skProducts);
_completionHandler = nil;
}
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
NSLog(@"Failed to load list of products.");
_productsRequest = nil;
_completionHandler(NO, nil);
_completionHandler = nil;
}
#pragma mark SKPaymentTransactionOBserver
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for (SKPaymentTransaction * transaction in transactions) {
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
[self failedTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:transaction];
default:
break;
}
};
}
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"completeTransaction...");
[self provideContentForProductIdentifier:transaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"restoreTransaction...");
[self provideContentForProductIdentifier:transaction.originalTransaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
- (void)failedTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"failedTransaction...");
if (transaction.error.code != SKErrorPaymentCancelled)
{
NSLog(@"Transaction error: %@", transaction.error.localizedDescription);
}
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void)provideContentForProductIdentifier:(NSString *)productIdentifier {
[_purchasedProductIdentifiers addObject:productIdentifier];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:productIdentifier];
[[NSUserDefaults standardUserDefaults] synchronize];
[[NSNotificationCenter defaultCenter] postNotificationName:IAPHelperProductPurchasedNotification object:productIdentifier userInfo:nil];
}
- (void)restoreCompletedTransactions {
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
@end
#import "IAPHelper.h"
@interface RageIAPHelper : IAPHelper
+ (RageIAPHelper *)sharedInstance;
@end
#import "RageIAPHelper.h"
#import "ViewController.h"
@implementation RageIAPHelper
+ (RageIAPHelper *)sharedInstance {
static dispatch_once_t once;
static RageIAPHelper * sharedInstance;
dispatch_once(&once, ^{
NSSet * productIdentifiers = [NSSet setWithObjects:
@“com.GPS.iapra",
@"com.GPS.iapb”,
nil];
sharedInstance = [[self alloc] initWithProductIdentifiers:productIdentifiers];
});
return sharedInstance;
}
@end
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"completeTransaction...");
[self provideContentForProductIdentifier:transaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"completeTransaction...");
[self provideContentForProductIdentifier:transaction.payment.productIdentifier];
// NEW CODE
if ([transaction.payment.productIdentifier isEqualToString:@"Ads"]){
[[NSUserDefaults standardUserDefaults] setObject: @"No" forKey:SHOW_ADS_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// NEW CODE ^^
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}