Метод делегата StoreKit не вызывается - PullRequest
4 голосов
/ 30 марта 2012

У меня проблема. Методы делегатов SKProductsRequest никогда не вызываются. об этом раньше спрашивали, но ответов не было. Функции делегата StoreKit не вызываются

Я не являюсь носителем английского языка, иногда я могу звучать смешно: P: (

Я хочу реализовать StoreKit в своем приложении для iOS. Я сделал класс для обработки всех сообщений StoreKit. Это код:

@implementation VRStoreController
- (void) requestProducts
{
    SKProductsRequest *request= [[SKProductsRequest alloc]
                                 initWithProductIdentifiers:
                                 [NSSet setWithObject: @"myProductID"]];
    request.delegate = self;
    [request start];
    [[UIApplication sharedApplication]setNetworkActivityIndicatorVisible:YES];

}

- (void) productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    NSLog(@"F7U12");
    [[UIApplication sharedApplication]setNetworkActivityIndicatorVisible:NO];
    NSArray *myProducts = response.products;
    NSLog(@"%@", myProducts);

}

Я создал экземпляр в моем делегате приложения

@interface VRAppDelegate
@property (strong, nonatomic) VRStoreController *store;
@end

Странно, но этот код работает нормально, когда я запускаю [store requestProducts] в моем appDidFinishLaunching: метод.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //app initialization...

    self.store = [[VRStoreController alloc]init];   
    [store requestProducts]; //This works ok, delegate method gets called.
    return YES;
}

Но когда я запускаю код в настройках tableView: didSelectRowAtIndexPath: метод делегата никогда не вызывается.

//VRAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //app initialization...
    self.store = [[VRStoreController alloc]init];//initialize store 
    return YES;
}

//VRSettingsViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    switch (indexPath.section) {
        //case 0, 1...
        case 2:
        {
            VRStoreController *store = ((VRAppDelegate *)[UIApplication sharedApplication].delegate).store;
            [store requestProducts]; //calls SKProductRequest start, but never calls delegate method.
            NSLog(@"GO PRO");
        }
        default:
            break;
    }
}

Я не знаю, что я делаю плохо. Перепробовал практически все и без ошибок, без сбоев, но делегат никогда не вызывали Любая помощь будет принята с благодарностью.

Заранее большое спасибо!

Ответы [ 2 ]

18 голосов
/ 30 марта 2012

Я наконец нашел проблему, которая у меня была. Я не сохранял SKProductRequest, поэтому запрос был запущен, а затем был сброшен. Я исправил это, сделав это

//VRStoreController.m

@interface VRStoreController ()
@property (strong, nonatomic) SKProductRequest *request; //Store the request as a property
@end

@implementation VRStoreController
@synthesize request;

- (void) requestProducts
{
    self.request = [[SKProductsRequest alloc] //save the request in the property
                             initWithProductIdentifiers:
                             [NSSet setWithObject: @"myProductID"]];
    self.request.delegate = self;
    [self.request start];
    [[UIApplication sharedApplication]setNetworkActivityIndicatorVisible:YES];
}

Хотя проблема исправлена, я думаю, что не нужно сохранять запрос, поскольку я уже вызвал метод start и установил его делегат, он должен делать все остальное самостоятельно и должен сохранять себя до он получает ответ (или ошибку) и после этого освобождает себя.

18 голосов
/ 30 марта 2012

Протокол SKProductsRequestDelegate также соответствует протоколу SKRequestDelegate, который имеет следующие методы:

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error;
- (void)requestDidFinish:(SKRequest *)request;

Реализуйте их и посмотрите, вызывается ли один из них. Возможно, вы получили ошибку или неожиданный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...