2013-07-26 3 views
4

Я пытаюсь использовать SKStoreProductViewController, чтобы открыть App Store в моем приложении. Я просмотрел множество примеров в Интернете, и есть два способа сделать это.Нечеткое поведение с SKStoreProductViewController

SKStoreProductViewController *storeController = [[SKStoreProductViewController alloc] init]; 
       [storeController setDelegate:self]; 
      //set product parameters 
      //must be a number wrapped in a string 
      NSDictionary *productParameters = @{ SKStoreProductParameterITunesItemIdentifier : @"36372693196"}; 
       [storeController loadProductWithParameters:productParameters completionBlock:^(BOOL result, NSError *error) { 
        if (result) { 
         //show 
         [self presentViewController:storeController animated:YES completion:nil]; 
        }else { 
         NSLog(@"ERROR WITH STORE CONTROLLER %@\n", error.description); 
         //redirect to app store 
         //[[UIApplication sharedApplication] openURL:[[self class] appStoreURL]]; 
        } 
       }]; 

Если я так делаю^^ ничего не происходит. Оператор if (result) или else внутри блока никогда не выполняется.

Я также вижу людей, проходящих в ноль для блока завершения, и представить контроллер представления модально сразу после этого, как показано ниже:

SKStoreProductViewController *storeController = [[SKStoreProductViewController alloc] init]; 
       [storeController setDelegate:self]; 
      //set product parameters 
      //must be a number wrapped in a string 
      NSDictionary *productParameters = @{ SKStoreProductParameterITunesItemIdentifier : @"36372693196"}; 
       [storeController loadProductWithParameters:productParameters completionBlock:nil]; 
     [self presentViewController:storeController animated:YES completion:nil]; 

Когда я представляю контроллер представления, код внутри блока для loadProductWithParameters Исполняет , Я очень смущен в этом вопросе. Как проверить успех или неудачу, если блок не запускается до тех пор, пока я его не покажу.

Наконец, я прочитал, что вы должны выполнить loadProductWithParameters в фоновом потоке. Я тоже это пробовал. Второй вариант - единственный, который вызвал модальность - с Can not connect to ITunes сообщение от симулятора и устройства. Я попробовал несколько идентификаторов приложений. Что происходит? Как мне это сделать?

ответ

3

Вы первый код должны работать нормально. Однако в iPhone Simulator iTunes Store часто возвращает ошибку.

Я проверил ваш первый код на iPhone (с другим идентификатором), и он работает нормально, но SKStoreProductParameterITunesItemIdentifier, который вы предоставили (36372693196), кажется неправильным.

+0

Если идентификатор, который вы передаете, неверен или недействителен для хранилища iTunes, на котором вы находитесь, контроллер ничего не сделает. – kamran619

+0

Правильно, в окне завершения будет отображаться ошибка. Попробуйте другой идентификатор, например 495922875, и он работает отлично. – Gerharbo

+1

У меня была проблема, когда он вообще не попадал в блок - если только идентификатор не был прав. Вот почему было так больно устранять неполадки. – kamran619

2

completionBlock никогда не вызывается - на симуляторе или на реальном устройстве - если идентификатор элемента iTunes недействителен. Казалось бы, что параметры result и error бесполезны, поэтому я бы сказал, что это ошибка.

У симулятора также возникнут дополнительные проблемы, так как он не будет содержать контент, даже если идентификатор действителен (и работает на устройстве).

+0

Вы абсолютно правы в этом. К сожалению, мне потребовалось некоторое время, чтобы понять это, поскольку его неясно в документации – kamran619

+0

У меня возникла эта проблема даже с допустимым идентификатором на iOS 9.3. На iOS 11.0 он работает отлично. Любая идея, что еще может быть неправильно? – iosdude

Смежные вопросы