Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 购买应用内购买后保存更改_Ios_Objective C_In App Purchase - Fatal编程技术网

Ios 购买应用内购买后保存更改

Ios 购买应用内购买后保存更改,ios,objective-c,in-app-purchase,Ios,Objective C,In App Purchase,我的应用程序中有一个用于删除广告横幅的应用程序内购买,当我成功购买并返回到我的主视图控制器时,该广告未被删除,但当我退出应用程序并重新打开它时,该广告消失并保持消失状态。几乎就像它记得我在下一次加载时购买了remove ads IAP,但不是在购买之后。一个非常聪明的人告诉我,我需要这样做: 现在,您所要做的就是调用位于 完成后返回VC后,ViewWillDisplay/viewDidLoad方法 购买IAP。如何做到这一点取决于你自己。如果你需要帮助 鉴于此,我建议提出一个新问题 线越来越长了

我的应用程序中有一个用于删除广告横幅的应用程序内购买,当我成功购买并返回到我的主视图控制器时,该广告未被删除,但当我退出应用程序并重新打开它时,该广告消失并保持消失状态。几乎就像它记得我在下一次加载时购买了remove ads IAP,但不是在购买之后。一个非常聪明的人告诉我,我需要这样做:

现在,您所要做的就是调用位于 完成后返回VC后,ViewWillDisplay/viewDidLoad方法 购买IAP。如何做到这一点取决于你自己。如果你需要帮助 鉴于此,我建议提出一个新问题 线越来越长了。如果你同意我的回答,我将不胜感激 选择它作为正确答案,因为我已经帮你得到了这个 工作

你有什么想法吗

谢谢大家!

以下是我的主视图控制器的屏幕截图:

ViewController.h

#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];
}