我有一个已发布的应用,在用户购买产品后,有时会进行应用内购买,但是我注意到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值,因此不会导致崩溃,但是我一直在跟踪“删除广告”按钮上的点击,并且我注意到我得到了类似的信息(20个抽头,10个用户),表明用户一直一次又一次点击并导致没有购买。我还跟踪查看商店是否有退货,并且有97%的时间在退货。我仍然无法找出问题所在,并且点击按钮绝对不是偶然的,因为“移除广告”按钮几乎是不合时宜的。我仍然可以进行一些购买,但是大多数都失败了。
最佳答案
在没有崩溃或可复制的xCode错误的情况下,仍然很难为您提供帮助。但是,就像我说的那样,您至少可以改进代码以确保值为零时不会发生崩溃。
因此,您应该将购买提醒功能更改为此
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”;或者由于某种原因,如果出现错误,您不希望早日从该方法返回。
您的删除广告方法应如下所示
func removeADs() {
if let product = storeProducts.first! {
Purchasables.store.purchaseProduct(product)
}
}
这样您就摆脱了一些!在其中展开值而不确保它们不为零的情况。
我需要查看您的数组或字典以及相关代码,以便进一步确定可能为零的内容。