【问题标题】:Odd behavior with SKStoreProductViewControllerSKStoreProductViewController 的奇怪行为
【发布时间】:2013-07-26 02:30:15
【问题描述】:

我正在尝试使用 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。到底是怎么回事?我如何让它发挥作用?

【问题讨论】:

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


    【解决方案1】:

    您的第一个代码应该可以正常工作。但是在 iPhone Simulator 中,iTunes Store 经常返回错误。

    我已经在 iPhone 上测试了您的第一个代码(使用其他标识符),它运行良好,但您提供的 SKStoreProductParameterITunesItemIdentifier (36372693196) 似乎不正确。

    【讨论】:

    • 如果你传入的 Identifier 不正确或对你所在的 iTunes 商店无效,控制器将什么也不做。
    • 正确,它会在完成块中显示错误。尝试其他标识符,例如 495922875,它工作得很好。
    • 我遇到了一个问题,它根本没有进入区块 - 除非标识符是正确的。这就是为什么要进行故障排除如此痛苦的原因。
    • 另请注意,根据文档,SKStoreProductParameterITunesItemIdentifier 应该是 NSNumber,而不是 NSString。
    • 即使在 iOS 9.3 上使用有效标识符,我也遇到了这个问题。在 iOS 11.0 上它工作得非常好。知道还有什么问题吗?
    【解决方案2】:

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

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

    【讨论】:

    • 您对此完全正确..不幸的是,我花了一段时间才弄清楚这一点,因为它在文档中并不清楚
    • 即使在 iOS 9.3 上使用有效标识符,我也遇到了这个问题。在 iOS 11.0 上它工作得非常好。知道还有什么问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2015-07-20
    • 2010-10-03
    • 2021-07-12
    • 2013-10-04
    • 2019-01-23
    相关资源
    最近更新 更多