- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个已发布的应用程序,应用程序内购买似乎有时会在用户购买时起作用,但我在 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/
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6年前关闭。 Improve t
我们有一个专有的销售系统,我们已经使用了一段时间了。最近我们添加了“购买”方面,以便我们可以比较匹配产品的平均购买/销售价格以及查看库存状况。 在 MySQL 中,我有 2 个表:tblPurchas
在查看 Paypal 文档以寻找针对这种情况的解决方案后,我一头雾水。我想要的是一种让购物车订阅(定期付款)和购买商品的方法。有没有一种方法可以解决这个问题,或者我是否必须做一些自定义的事情(如果我使
我想知道是否可以使用youtube api获取可购买或可租借的电影列表。当我转到youtube网站并登录到Google帐户时,我可以看到要购买的电影及其价格。 我想在我的应用程序(http://www
我使用 JavaScript 购买 SDK 和 Node.js。 const fetch = require('node-fetch'); const shopify = require('shopi
我购买了三个不同期限的不同订阅。我已经配置了测试账户,我可以进行测试购买。对于这些购买,谷歌不向我收费,但它们看起来非常像真实的。购买成功后,应用内结算会向我发送一些有关我的购买的数据,例如 pack
我目前正在实现应用内购买,并且刚刚阅读了一些帖子,说需要恢复购买按钮,否则苹果将拒绝应用。 我不想在我的 UI 设计中添加第二个按钮。 所以我的问题是... 有没有办法检查用户之前是否进行过应用内购买
我的应用中有多个项目。我有两个设备。如果我在这些设备中的第一个上购买商品,然后尝试在另一个设备上购买相同的商品,我不能。(Google play intent 显示消息 - 商品已拥有!然后它崩溃了.
有没有办法检测何时通过应用商店为您的应用进行了购买? 检测应用内购买似乎很容易(即我们的服务器可以收到通知),但是对于直接购买有没有办法做到这一点? 如果没有,是否有一些用户的唯一标识符(例如购买时通
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我计划在用户使用该应用程序成功扫描二维码时为应用内购买提供折扣。我知道无法为现有商品提供折扣。我打算以折扣价添加另一件商品。有没有人以前有过使用这种方法的经验? 提前致谢 最佳答案 没有办法直接这样做
我很好奇其他商店在基础应用程序框架方面做了什么?我将应用程序框架视为能够提供额外或扩展的功能以提高基于它构建的应用程序的质量。 有各种开箱即用的框架,例如 Spring(或 Spring.NET)等。
我们正在开发一款使用非续订订阅 IAP 模型的应用。在沙盒中测试订阅购买流程时,我们看到弹出两 strip 有“购买”按钮的消息。 显示第一条消息和产品信息:“您想以 xx.xx 美元购买一个订阅吗?
我的老板购买了 Microsoft 365,它包含三种产品。他现在要求我设计一个管理系统,比如员工自助服务门户。我特此寻求有关从哪里开始或使用哪种产品的建议,因为我对此很陌生。 我尝试了一些研究,发现
我的老板购买了 Microsoft 365,它包含三种产品。他现在要求我设计一个管理系统,比如员工自助服务门户。我特此寻求有关从哪里开始或使用哪种产品的建议,因为我对此很陌生。 我尝试了一些研究,发现
我刚刚了解了IAP Cracker的存在,并试图找出在我的应用中验证IAP购买的最佳方法。 我无法确定的是IAP Cracker是否可以处理“消耗性”商品。如果没有,我没有什么可担心的。 这是维护/验
我正在编写一个允许应用内购买的简单应用。我已经使用 SKU 代码 android.test.purchased 进行了测试,一切正常。 我进入我的 google play 控制台,创建了一个应用程序,
我即将启动一个应用程序,该应用程序将包含多个“应用程序内购买”。 我想做的是有一种方法可以提供少量免费的“应用内购买”来选择评论家等人。 在 apple 框架内有没有办法做到这一点,如果没有,我可以采
所以我在这个网站上工作,用户可以在该网站上发布他们的商品,其他用户可以将一些商品添加到他们的购物车并在线购买。 我考虑的流程是这样的: 商家发布商品及其信用卡/ Paypal 信息。 买家将(来自不同
我对这个主题进行了广泛的研究,但我的知识仍然很模糊。我正在寻找一个简单站点的基本 DV,但我看到每个在线 SSL 都具有三个级别, Root->Intermidiate (充当 Root 的代理)和我
我是一名优秀的程序员,十分优秀!