2016-03-06 4 views
1

У меня есть приложение, которое выпущено, и покупка в приложении, похоже, работает в случаях, когда пользователи купили, но я замечаю на 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) 

Все, что я не хватает?

Edit:

Это то, что вызывается, когда пользователь нажимает на кнопку удалить объявления

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!) 


    } 

Это предполагает, что всегда будет продукт, и должно быть.

Update: Я обновил приложение и ждали больше, чем на неделю, чтобы получить какие-то данные и получается, что пользователи по-прежнему не в состоянии купить. Теперь я безопасно разворачиваю все опции, поэтому нет никаких значений nil, поэтому никаких сбоев не приводит к сбоям, но я отслеживаю нажатия на кнопку удаления , и я замечаю, что я получаю что-то вроде этого (20 точек, 10 пользователей), что указывает на то, что пользователи продолжают нажимать снова и снова и не получают никаких покупок. Я также отслеживал, есть ли продукт, возвращенный из магазина, и 97% времени. Я все еще не могу указать проблему, и кнопки на кнопке определенно не случайны, так как кнопка удаления объявлений в значительной степени не работает. Я все еще получаю некоторые покупки, но большинство терпит неудачу.

+0

Может ли вы опубликовать некоторые из соответствующих бит вашей в приложении покупке коды. Трудно сказать вам, просто глядя на эту ошибку – crashoverride777

+0

Конечно, я добавил еще код. Меня смущает то, что некоторые пользователи могут совершать покупки, а большинство - нет. Я пробовал разные магазины разных устройств и до сих пор не смог воспроизвести проблему. –

+1

argh его трудно для меня, чтобы помочь, потому что вы не можете реплицировать проблему, таким образом, вы не получите сообщений об ошибках, чтобы увидеть, что происходит. Его разочарование я знаю, у меня тоже есть проблема с моей игрой, где у меня появляется ошибка, которую команда проверки яблок говорит мне о том, что я не могу, чтобы моя жизнь повторялась. – crashoverride777

ответ

1

Сложно помочь вам без каких-либо сбоев или ошибок xCode, которые вы можете реплицировать. Однако, как я уже сказал, вы, по крайней мере, можете улучшить свой код, чтобы убедиться, что не может быть сбоев, где значения равны нулю.

Таким образом, вы должны изменить свое уведомление о покупке FUNC к этому

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 сторожевого заявление (такой же, как если позволить) безопасно разворачивать вещи. Я предпочитаю это так, как использовать «если пусть» пирамиды. Вы можете изменить его на «if let», если вам это не нравится или по какой-то причине не хотят возвращаться из метода раньше, если произошла ошибка.

Ваш удалить объявления метод должен выглядеть следующим образом

func removeADs() { 

    if let product = storeProducts.first! { 

     Purchasables.store.purchaseProduct(product) 
    } 
} 

Таким образом, вы избавляетесь от некоторых из! где вы разворачиваете ценности, не гарантируя, что они не ноль. Мне нужно было бы увидеть ваш массив или словари и связанный код, чтобы, возможно, определить, что может быть ноль.

+0

Нужно сделать это, жестко я сделал руководство по настройке iap, поэтому я буду обвинять его в руководстве, ха. Но в этом случае это помогло, поскольку значение кажется нулевым, и если бы я безопасно развернул опции, я бы не знал, что пользователи не могут их купить. Вот почему мне нужно отслеживать нажатия кнопки удаления объявления. Спасибо, я сделаю это, и после того, как обновление начнет жить, я обновлю. –

+1

Не проблема, держите нас в курсе, если он исправляет разбитый – crashoverride777

+0

Авария исправлена, но проблема остается. Я обновил свой пост, если вы хотите немного сбить с толку. –

0

У меня была та же проблема 1 месяц назад, без сбоев всегда только в 90% случаев. Это ошибка Apple, нить не останавливается, я не знаю, почему ...Но решить эту проблему, я отменить запрос (SKProductsRequest) и она отлично работает:

var request: SKProductsRequest! //global to cancel when disappear 
//request products when you want (viewDidLoad for example) 
request = SKProductsRequest(productIdentifiers: productID as! Set<String>) 
      request.delegate = self 
      request.start() 

И когда исчезает ViewController:

override func viewDidDisappear(animated: Bool) { 
     super.viewDidDisappear(animated) 
     request.delegate = nil; 
     request.cancel() 
     SKPaymentQueue.defaultQueue().removeTransactionObserver(self) 
    }