SKStoreProductViewController的奇怪行为

时间:2013-07-26 02:30:15

标签: ios objective-c objective-c-blocks

我正在尝试使用SKStoreProductViewController在我的应用程序中以模态方式打开App Store。我在网上看了很多例子,人们有两种方式这样做。

 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语句。

我也看到人们为完成块传递nil,并在此之后立即以模态方式呈现视图控制器,如下所示:

 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。到底是怎么回事?我如何使这个工作?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

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