2013-07-26 49 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。我也试过这个。第二个选项是唯一一个提出了模式的选项 - 无法连接到来自模拟器和设备的iTunes消息。我已经尝试了多个应用ID。到底是怎么回事?我如何得到这个工作?

回答

3

你是第一个代码应该工作得很好。但是,在iPhone模拟器中,iTunes Store通常会返回错误。

我已经在iPhone上测试了你的第一个代码(带有其他标识符),它工作得很好,但你提供的SKStoreProductParameterITunesItemIdentifier(36372693196)似乎并不正确。

+0

如果您传入的标识符对您所在的iTunes商店不正确或无效,则控制器将不执行任何操作。 – kamran619

+0

正确,它将在完成块中显示错误。尝试使用其他标识符,例如495922875,它工作得很好。 – Gerharbo

+1

我有一个问题,它根本没有进入块 - 除非标识符是正确的。这就是解决问题的原因。 – kamran619

2

如果iTunes项目标识符无效,completionBlock永远不会被调用 - 在模拟器或真实设备上。这似乎使resulterror参数无用,所以我会说这是一个错误。

模拟器似乎还有其他问题,即使标识符有效(并且在设备上工作),它也不会呈现任何内容。

+0

你对此绝对正确..遗憾的是,我花了一段时间才弄明白这一点,因为它在文档中不清楚 – kamran619

+0

即使在iOS 9.3上有一个有效的标识符,我也会遇到这个问题。在iOS 11.0上,它工作得很好。任何想法还有什么可能是错的? – iosdude