Что плохого в том, как я настроил файл 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 ответ
Похоже, вы пытаетесь использовать категорию для неподходящей цели. В частности, похоже, что ваша категория должна содержать объявление свойства. Но, как сказано в документации:
Категории могут использоваться для объявления либо методов экземпляра, либо методов класса, но обычно они не подходят для объявления дополнительных свойств. Это допустимый синтаксис для включения объявления свойства в интерфейс категории, но невозможно объявить дополнительную переменную экземпляра в категории. Это означает, что компилятор не будет синтезировать никакую переменную экземпляра и не будет синтезировать любые методы доступа к свойствам. Вы можете написать свои собственные методы доступа в реализации категории, но вы не сможете отслеживать значение этого свойства, если оно уже не сохранено в исходном классе.