SKStoreProductViewController 在 iOS 15.6 beta5 中因名为 sceneDisconnected 的无法识别的选择器而崩溃

Qia*_*Kai 44 storekit ios ios16

在 iOS 15.6 beta5 和 iOS 16.0 beta 中:

\n

当发布 UISceneDidDisconnectNotification 时,任何活动的 SKStoreProductViewController 实例都会因名为 sceneDisconnected 的无法识别的选择器而崩溃。

\n

-[SKStoreProductViewController sceneDisconnected:]: 无法识别的选择器发送到实例 0x115161a00

\n

该崩溃仅发生在最新的iOS15.6和iOS16 beta版本中。然而我在任何官方文档中都找不到选择器名称\xe2\x80\xa6\xe2\x80\xa6

\n

有什么解决办法吗?还是我有什么地方没做对?

\n

Lor*_*nzo 25

看起来这个问题已在今天发布的 iOS 15.6 候选版本中得到修复。

2022 年 9 月 14 日更新: Apple 在官方 15.7 版本中重新引入了此崩溃。它似乎只在应用程序强制退出时才会发生,因此不会影响用户。我已在 Feedbackassistant.apple.com 上向 Apple 提交了一张罚单,并鼓励其他人也这样做。

  • iOS 15.7 崩溃依然存在 (5认同)

ted*_*ock 11

这不是一个解决方案,但明确表明这是苹果需要修复的错误。从一个干净的示例项目开始,您所需要做的就是提供一个 SKStoreProductViewController,然后强制退出您的应用程序:

import StoreKit
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let storeKitViewController = SKStoreProductViewController()
        storeKitViewController.loadProduct(withParameters: [
            SKStoreProductParameterITunesItemIdentifier: NSNumber(integerLiteral: 364709193)
        ])
        present(storeKitViewController, animated: true)

        // Force quit after presentation to trigger crash
        // -[SKStoreProductViewController sceneDisconnected:]: unrecognized selector sent to instance
    }

}
Run Code Online (Sandbox Code Playgroud)

我已通过反馈助理向 Apple 提交了此信息。


Hus*_*sam 10

iOS16 已修复崩溃问题

以下是Apple框架工程师的解释

此崩溃发生在 iOS/iPadOS 15.7 的公开版本以及种子 4 之前的 iOS/iPadOS 16 种子版本中 [1]。在 iOS 16 的公开版本中不会发生这种情况。崩溃主要发生在应用程序处于后台且即将被操作系统终止时。因此,预计大多数最终用户不会看到这些崩溃。(一个例外是在 iPad 上,其应用程序支持多个场景,并且用户手动终止场景。)您的分析将显示崩溃率增加,但您的客户不应受到此问题的影响。我们正在积极努力解决此次事故。[1] 在这种情况下,您应该更新到最新版本。

来源:https ://developer.apple.com/forums/thread/714464?answerId=729646022#729646022


Chr*_*ris 7

能够在本地使用相同的堆栈符号重现崩溃,并且下面的代码可以阻止崩溃的发生。该代码创建空函数来处理无法识别的选择器消息,并将此扩展限制为 iOS 15.7:

@available(iOS, introduced: 15.7, obsoleted: 16.0)
@objc extension SKStoreProductViewController {
    func sceneDisconnected(_ arg: AnyObject) {}
    func appWillTerminate() {}
}
Run Code Online (Sandbox Code Playgroud)