gpt4 book ai didi

ios - 应用内购买偶尔崩溃

转载 作者:行者123 更新时间:2023-11-28 06:47:47 27 4
gpt4 key购买 nike

我有一个已发布的应用程序,应用程序内购买似乎有时会在用户购买时起作用,但我在 Crashlytics(fabric) 上注意到该应用程序不断崩溃,我无法弄清楚原因,因为我无法复制任何设备上的崩溃。这是我第一次集成应用内购买,请多多包涵。

我不知道哪里出了问题,特别是因为没有针对特定设备的模式,有时它可以工作,有时却不能(显然)。我知道这可能有多种原因,但朝着正确的方向插入会很好。这是崩溃日志

Thread : Crashed: com.apple.main-thread
0 app 0xc2658 WelcomeViewController.purchaseAlert() -> () (WelcomeViewController.swift)
1 app 0xc2658 WelcomeViewController.purchaseAlert() -> () (WelcomeViewController.swift)
2 app 0xc1148 @objc WelcomeViewController.removeAdsTapped(UIButton) -> () (WelcomeViewController.swift:164)
3 UIKit 0x29691771 -[UIApplication sendAction:to:from:forEvent:] + 80
4 UIKit 0x29691701 -[UIControl sendAction:to:forEvent:] + 64
5 UIKit 0x2967961f -[UIControl _sendActionsForEvents:withEvent:] + 446
6 UIKit 0x29691051 -[UIControl touchesEnded:withEvent:] + 616
7 UIKit 0x29690cbf -[UIWindow _sendTouchesForEvent:] + 646
8 UIKit 0x296895d7 -[UIWindow sendEvent:] + 642
9 UIKit 0x2965a119 -[UIApplication sendEvent:] + 204
10 UIKit 0x29658757 _UIApplicationHandleEventQueue + 5134
11 CoreFoundation 0x25485257 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14
12 CoreFoundation 0x25484e47 __CFRunLoopDoSources0 + 454
13 CoreFoundation 0x254831af __CFRunLoopRun + 806
14 CoreFoundation 0x253d5bb9 CFRunLoopRunSpecific + 516
15 CoreFoundation 0x253d59ad CFRunLoopRunInMode + 108
16 GraphicsServices 0x2664faf9 GSEventRunModal + 160
17 UIKit 0x296c1fb5 UIApplicationMain + 144
18 app 0xbaba4 main (AppDelegate.swift:15)
19 libdispatch.dylib 0x25088873 (Missing)

有什么我想念的吗?

编辑:

这是当用户点击删除广告按钮时调用的内容

 func purchaseAlert() {


let priceFormatter: NSNumberFormatter = {

let pf = NSNumberFormatter()
pf.formatterBehavior = .Behavior10_4
pf.numberStyle = .CurrencyStyle
return pf


}()

priceFormatter.locale = storeProducts.first!.priceLocale

let productPrice = storeProducts.first!.price

let price = priceFormatter.stringFromNumber(productPrice)!

let alert = UIAlertController(title: "Remove Ads for \(price)", message: "This purchase will remove all ad's that show through out the app", preferredStyle: .Alert)

alert.addAction(UIAlertAction(title: "Go Back", style: .Default, handler: nil))

alert.addAction(UIAlertAction(title: "Remove Ad's", style: .Default, handler: { (_) -> Void in


self.removeADs()

}))




self.presentViewController(alert, animated: true, completion: nil)

}

购买商品

 func removeADs() {

let product = storeProducts.first

Purchasables.store.purchaseProduct(product!)


}

这假设总会有一种产品,而且应该有。

更新:我已经更新了应用程序并等待了一个多星期才获得一些数据,结果发现用户仍然无法购买。我现在安全地打开所有可选值,因此没有 nil 值,因此不会导致崩溃,但我一直在跟踪点击删除广告按钮,我注意到我得到了这样的东西(20taps, 10 个用户)表示用户不断点击并导致没有购买。我还跟踪查看是否有产品从商店退回,并且 97% 的时间都有。我仍然无法确定问题所在,点击按钮绝对不是偶然的,因为删除广告按钮几乎不碍事。我仍然进行了一些购买,但大多数都失败了。

最佳答案

仍然很难在没有任何您可以复制的崩溃或 xCode 错误的情况下帮助您。但是就像我说的那样,您至少可以改进代码以确保在值为 nil 的情况下不会发生崩溃。

所以你应该把你的购买提醒功能改成这个

 func purchaseAlert() {


let priceFormatter: NSNumberFormatter = {

let pf = NSNumberFormatter()
pf.formatterBehavior = .Behavior10_4
pf.numberStyle = .CurrencyStyle
return pf


}()

/// safely unwrap storeProducts.first! to ensure its not nil
/// if its nil than exit the method
guard let firstStoreProduct = storeProducts.first! else { return }

// no more ! needed at the end which might caused a crash before
priceFormatter.locale = firstStoreProduct.priceLocale

// safely create the product price, if you can't exit the method
guard let productPrice = firstStoreProduct.price else { return }

// no more ! needed at the end which might also caused a crash before because product price cannot be nil anymore when getting to this line
let price = priceFormatter.stringFromNumber(productPrice)


let alert = UIAlertController(title: "Remove Ads for \(price)", message: "This purchase will remove all ad's that show through out the app", preferredStyle: .Alert)

alert.addAction(UIAlertAction(title: "Go Back", style: .Default, handler: nil))

alert.addAction(UIAlertAction(title: "Remove Ad's", style: .Default, handler: { (_) -> Void in


self.removeADs()

}))




self.presentViewController(alert, animated: true, completion: nil)

}

如您所见,我使用了 2 个保护语句(与 let 相同)来安全地解包。与使用“if let”金字塔相比,我更喜欢这种方式。如果您不喜欢这种方式,或者出于某种原因不想在出现错误时提前从该方法返回,您可以将其更改为“if let”。

您的移除广告方法应如下所示

 func removeADs() {

if let product = storeProducts.first! {

Purchasables.store.purchaseProduct(product)
}
}

这样你就摆脱了一些!在不确保值不为零的情况下展开值的地方。我需要查看您的数组或字典以及相关代码,以便进一步确定哪些内容可能为 nil。

关于ios - 应用内购买偶尔崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35827310/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com