В приложении покупка вызывает случайные сбои
Я искал в интернете помощь по этому вопросу, но безрезультатно. Мое приложение находится в реальном времени в app store, и меньшинство пользователей сообщают, что приложение замораживается на них и падает после совершения покупки в приложении (единственный IAP в моей игре, он в основном разблокирует полную версию). Даже когда они перезагружают свое устройство и пытаются продолжить, оно снова выходит из строя. Я не смог воспроизвести аварию - вот отчет о катастрофе:
{"bug_type":"109","os_version":"iPhone OS 9.2 (13C75)","timestamp":"2015-12-12 15:34:59.59 +0000","build_version":"1","app_name":"MyApp","bundleID":"com.MyName.MyApp","name":"MyApp","is_first_party":false,"app_version":"1.0","share_with_app_devs":true,"slice_uuid":"7abb6a6c-91be-3da0-af0f-2cc21f9a6b83","adam_id":1021569826}
Incident Identifier: 59B078E3-ABC9-47C7-A3BE-6311BBB968F6
CrashReporter Key: b30d57098eecd5a7dfcd44f3a04cfb01bdef557f
Hardware Model: iPad2,5
Process: MyApp [977]
Path: /private/var/mobile/Containers/Bundle/Application/EFAB47F6-F1A3-42A4-A6F1-8A038932ED86/MyApp.app/MyApp
Identifier: com.MyName.MyApp
Version: 1 (1.0)
Code Type: ARM (Native)
Parent Process: launchd [1]
Date/Time: 2015-12-12 15:34:59.59 +0000
Launch Time: 2015-12-12 15:30:02.02 +0000
OS Version: iOS 9.2 (13C75)
Report Version: 104
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x00000000e7ffdefe
Triggered by Thread: 0
Filtered syslog:
None found
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 MyApp 0x001f8cb8 function signature specialization <Arg[0] = Dead and Owned To Guaranteed, Arg[1] = Owned To Guaranteed> of MyApp.IAPHelper.paymentQueue (MyApp.IAPHelper)(__ObjC.SKPaymentQueue, updatedTransactions : [__ObjC.SKPaymentTransaction]) -> () (IAPHelper.swift:0)
1 MyApp 0x001f59a8 @objc MyApp.IAPHelper.paymentQueue (MyApp.IAPHelper)(__ObjC.SKPaymentQueue, updatedTransactions : [__ObjC.SKPaymentTransaction]) -> () (IAPHelper.swift:0)
2 StoreKit 0x2e7c1a80 __NotifyObserverAboutChanges + 82
3 CoreFoundation 0x25464630 CFArrayApplyFunction + 34
4 StoreKit 0x2e7c1a1c -[SKPaymentQueue _notifyObserversAboutChanges:sendUpdatedDownloads:] + 126
5 StoreKit 0x2e7c2318 -[SKPaymentQueue _processUpdates:trimUnmatched:sendUpdatedDownloads:] + 1042
6 StoreKit 0x2e7c2ca6 -[SKPaymentQueue _updatePaymentsForMessage:] + 120
7 StoreKit 0x2e7c1938 __44-[SKPaymentQueue _handleMessage:connection:]_block_invoke + 142
8 libdispatch.dylib 0x250c9b5a _dispatch_call_block_and_release + 8
9 libdispatch.dylib 0x250c9b46 _dispatch_client_callout + 20
10 libdispatch.dylib 0x250d7ee0 _dispatch_main_queue_callback_4CF$VARIANT$mp + 1522
11 CoreFoundation 0x255133fc __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 6
12 CoreFoundation 0x255118f6 __CFRunLoopRun + 1572
13 CoreFoundation 0x25464bf8 CFRunLoopRunSpecific + 518
14 CoreFoundation 0x254649e4 CFRunLoopRunInMode + 106
15 GraphicsServices 0x266b0ac8 GSEventRunModal + 158
16 UIKit 0x296f4ba0 UIApplicationMain + 142
17 MyApp 0x0018bc24 main (AppDelegate.swift:12)
18 libdyld.dylib 0x25113872 start + 0
Thread 1 name: Dispatch queue: com.apple.libdispatch-manager
Thread 1:
0 libsystem_kernel.dylib 0x251e6320 kevent_qos + 24
1 libdispatch.dylib 0x250de098 _dispatch_mgr_invoke + 254
2 libdispatch.dylib 0x250dddf6 _dispatch_mgr_thread$VARIANT$mp + 36
Thread 2 name: com.apple.NSURLConnectionLoader
Thread 2:
0 libsystem_kernel.dylib 0x251d0c24 mach_msg_trap + 20
1 libsystem_kernel.dylib 0x251d0a28 mach_msg + 38
2 CoreFoundation 0x25513354 __CFRunLoopServiceMachPort + 134
3 CoreFoundation 0x255116dc __CFRunLoopRun + 1034
4 CoreFoundation 0x25464bf8 CFRunLoopRunSpecific + 518
5 CoreFoundation 0x254649e4 CFRunLoopRunInMode + 106
6 CFNetwork 0x25aa781e +[NSURLConnection(Loader) _resourceLoadLoop:] + 484
7 Foundation 0x25d69164 __NSThread__start__ + 1146
8 libsystem_pthread.dylib 0x2528985a _pthread_body + 136
9 libsystem_pthread.dylib 0x252897ce _pthread_start + 108
10 libsystem_pthread.dylib 0x25287724 thread_start + 6
Thread 3 name: com.apple.CFSocket.private
Thread 3:
0 libsystem_kernel.dylib 0x251e4f14 __select + 20
1 CoreFoundation 0x255187a2 __CFSocketManager + 564
2 libsystem_pthread.dylib 0x2528985a _pthread_body + 136
3 libsystem_pthread.dylib 0x252897ce _pthread_start + 108
4 libsystem_pthread.dylib 0x25287724 thread_start + 6
Thread 4:
0 libsystem_kernel.dylib 0x251e588c __workq_kernreturn + 8
1 libsystem_pthread.dylib 0x25287b34 _pthread_wqthread + 1034
2 libsystem_pthread.dylib 0x25287718 start_wqthread + 6
Thread 5:
0 libsystem_kernel.dylib 0x251e588c __workq_kernreturn + 8
1 libsystem_pthread.dylib 0x25287b34 _pthread_wqthread + 1034
2 libsystem_pthread.dylib 0x25287718 start_wqthread + 6
Thread 6:
0 libsystem_kernel.dylib 0x251e588c __workq_kernreturn + 8
1 libsystem_pthread.dylib 0x25287b34 _pthread_wqthread + 1034
2 libsystem_pthread.dylib 0x25287718 start_wqthread + 6
Thread 0 crashed with ARM Thread State (32-bit):
r0: 0x00000000 r1: 0x3bc6d0b0 r2: 0x00000000 r3: 0x00000000
r4: 0x00000000 r5: 0x17222bc2 r6: 0x15ea4330 r7: 0x003fdaf0
r8: 0x1736bce0 r9: 0x00000000 r10: 0x003fdbcc r11: 0xffffffff
ip: 0xf6535949 sp: 0x003fd934 lr: 0x001f7478 pc: 0x001f8cb8
cpsr: 0x60000010
Binary Images:
<not included for reasons of brevity>
Метод, на который ссылаются как на причину аварии, выглядит следующим образом: образом:
public func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch (transaction.transactionState) {
case .Purchased:
completeTransaction(transaction)
break
case .Failed:
failedTransaction(transaction)
break
case .Restored:
restoreTransaction(transaction)
break
case .Deferred:
break
case .Purchasing:
break
}
}
}
Я не уверен, с чего начать на самом деле, поскольку код в paymentQueue: updatedTransactions
выглядит нормально для меня и на самом деле был взят непосредственно из учебника Рэя Вендерлиха по IAPs: http://www.raywenderlich.com/105365/in-app-purchases-tutorial-getting-started
function signature specialization <Arg[0] = Dead and Owned To Guaranteed, Arg[1] = Owned To Guaranteed>
Что это значит?
У кого-нибудь есть какие-нибудь идеи? Или совет, как воспроизвести аварию? Поскольку это произошло всего несколько раз, может ли это быть как-то связано с пользователем? устройство или обработка IAP Apple, или это определенно мой код?
Заранее спасибо!
Редактировать:
В ответ на ответ Алпеша моя функция теперь выглядит так:
public func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
for transaction in transactions {
switch (transaction.transactionState) {
case .Purchased:
self.completeTransaction(transaction)
break
case .Failed:
self.failedTransaction(transaction)
break
case .Restored:
self.restoreTransaction(transaction)
break
case .Deferred:
break
case .Purchasing:
break
}
}
}
}
1 ответ:
Это сбой из-за проблемы с памятью. Я думаю, что вы putto код, как это после некоторой задержки он работает тесто. вы также можете использовать таймер отправки GCD
Public func paymentQueue (queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) dispatch_after(delayTime, dispatch_get_main_queue()) { for transaction in transactions { switch (transaction.transactionState) { case .Purchased: completeTransaction(transaction) break case .Failed: failedTransaction(transaction) break case .Restored: restoreTransaction(transaction) break case .Deferred: break case .Purchasing: break } }
} }