Что плохого в том, как я настроил файл Category .h?

У меня есть приложение для iOS 9.0, к которому я пытаюсь добавить In-App Purchase; (Я никогда раньше не использовал IAP и не нашел в сети код, который, я надеюсь, поможет мне начать работу).

Я решил сделать код находящимся в категории для простоты обслуживания (раньше я использовал категории только один раз). Тем не менее, у меня возникли проблемы с реальной структурой категории. Это код.h файла в категории:

#import "SettingsViewController.h"
#import <StoreKit/StoreKit.h>

@interface SettingsViewController (Purchases)

@end

#define kInAppPurchaseManagerProductsFetchedNotification
@"kInAppPurchaseManagerProductsFetchedNotification"

@interface InAppPurchaseManager : NSObject <SKProductsRequestDelegate>  {

SKProduct *proUpgradeProduct;
SKProductsRequest *productsRequest;
}

@end

Это код.m:

#import "SettingsViewController+Purchases.h"

@implementation SettingsViewController (Purchases)

- (void)requestProUpgradeProductData {

NSSet *productIdentifiers = [NSSet setWithObject:@"com.runmonster.runmonsterfree.upgradetopro" ];
productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
productsRequest.delegate = self;
[productsRequest start];

// we will release the request object in the delegate callback
}

#pragma mark -
#pragma mark SKProductsRequestDelegate methods

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response  {

NSArray *products = response.products;
proUpgradeProduct = [products count] == 1 ? [[products firstObject] retain] : nil;
if (proUpgradeProduct)
{
    NSLog(@"Product title: %@" , proUpgradeProduct.localizedTitle);
    NSLog(@"Product description: %@" , proUpgradeProduct.localizedDescription);
    NSLog(@"Product price: %@" , proUpgradeProduct.price);
    NSLog(@"Product id: %@" , proUpgradeProduct.productIdentifier);
}

for (NSString *invalidProductId in response.invalidProductIdentifiers)
{
    NSLog(@"Invalid product id: %@" , invalidProductId);
}

// finally release the reqest we alloc/init’ed in requestProUpgradeProductData
[productsRequest release];

[[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerProductsFetchedNotification object:self userInfo:nil];
}

@end

Проблема в том, что SKProduct и SKProductsRequest недоступны для файла.m, что, я уверен, вызвано тем, как я настроил файл.h. Помощь будет принята с благодарностью.

1 ответ

Решение

Похоже, вы пытаетесь использовать категорию для неподходящей цели. В частности, похоже, что ваша категория должна содержать объявление свойства. Но, как сказано в документации:

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

Другие вопросы по тегам