2017-02-20 27 views
-4

Я подозреваю, что это как-то связано с покупкой на основе подписки. Все отлично работает в режиме разработки и на TestFlight, даже работает Ad Hoc. Но когда он попадает в App Store, он падает каждый раз.Почему мое приложение разбивается на App Store, но не в разработке?

Я проверил журналы сбоев, и единственная информация, которую я получаю, это то, что это SIGTRAP.

Я думаю, что в этом коде:

func checkForSubscription { 

    print("Checking subscription status") 

    guard let receiptURL = Bundle.main.appStoreReceiptURL else { 
     return 
    } 

    let fileManager = FileManager() 
    if fileManager.fileExists(atPath: receiptURL.path) { 

     do { 

      let receipt = try! Data(contentsOf: receiptURL) 

      let requestContents = [ 
       "receipt-data": receipt.base64EncodedString(options: []), 
       "password": "secret generated from iTunes Connect" 
      ] 

      let requestData = try JSONSerialization.data(withJSONObject: requestContents, options: []) 
      let storeURL = URL(string: "https://buy.itunes.apple.com/verifyReceipt") 
      let sandboxURL = URL(string: "https://sandbox.itunes.apple.com/verifyReceipt") 

      var request = URLRequest(url: storeURL!) 
      request.httpMethod = "POST" 
      request.httpBody = requestData 

      let task = URLSession.shared.dataTask(with: request) { data, response, error in 
       guard let httpResponse = response as? HTTPURLResponse, let receivedData = data else { 
        print("No valid http response.") 
        return 
       } 
       switch (httpResponse.statusCode) { 
       case 200: 
        do { 
         let data = try JSONSerialization.jsonObject(with: receivedData, options: .allowFragments) 

         let json = JSON(data) // SwiftyJSON 
         let receipts = json["receipt"]["in_app"].array! 
         let latestReceipts = json["latest_receipt_info"].array! 

         var allReceipts = receipts + latestReceipts 

         var expiresTime: Double = 0 

         for receipt in allReceipts { 
          let expiration = receipt["expires_date_ms"].doubleValue/1000 
          if expiration > expiresTime { 
           expiresTime = expiration 
          } 
         } 

         let currentTime = NSDate().timeIntervalSince1970 
         let expired = currentTime > expiresTime 

         if expired { 
          subscribed = false 
         } else { 
          subscribed = true 
         } 

        } catch { 
         print(error) 
        } 
       default: 
        print("Error code: \(httpResponse.statusCode)") 
       } 
      } 
      task.resume() 

     } catch { 
      // May be because there is no history of subscription 
      print(error) 
     } 

    } else { 
     print("no receipt") 
    } 

} 
+1

Какая линия рушится? - Кроме того, вы знаете, не так ли, что всякий раз, когда вы ставите восклицательный знак, что _means_ «разбивает меня»? Я вижу по крайней мере четыре из них. Это, безусловно, нельзя охарактеризовать как «делать это правильно». – matt

+2

Просьба представить полный символический отчет о сбое – Kerni

+0

«он вылетает каждый раз». Это не может быть правильно, как он прошел проверку Apple App Store, если он сбой каждый раз? И почему бы не подключить телефон к Xcode и получить журнал сбоев – Gruntcakes

ответ

1

Вы можете найти линию аварии symbolicating your crash report.

Когда вы это сделаете, вы сможете выяснить, что вызывает крушение, и взять его оттуда.

1

Вы можете интегрировать Crashlytics в вашем приложении, в следующий раз, если приложение будет врезаться в магазине приложений, вы получите имя класса и номер строки в вашей электронной почте, где ваше приложение разбился.