Подтвердить что ты не робот

В процессе покупки приложения (IAP), похоже, происходит сбой приложения при запуске для одного из моих пользователей

Я работаю с пользователем моего приложения, которое испытывает сбои при запуске приложения. Мы считаем, что он должен что-то сделать с процессом покупки в приложении, но мне не удалось диагностировать причину, поэтому я подумал, что приведу ее сюда (для каждого другого пользователя, с которым я разговаривал, все работает просто хорошо).

Обращаясь к пользователю с этой проблемой, она говорит, что с момента покупки IAP приложение вылетает при запуске. И после сбоя устройство часто предлагает пользователю ввести свой идентификатор пользователя и пароль (как если бы он пытался сделать покупку снова). Мы попытались переустановить приложение, обновить до iOS 7, обновить приложение самостоятельно... не повезло.

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

Я следовал за IAP Ray Wenderlich в учебнике iOS 6, если это помогает... опять же, никаких других проблем, кроме этого, не возникает, что заставляет меня задаться вопросом, не произошло ли что-то в процессе покупки.

Incident Identifier: 1E0C36A9-C7EC-48D7-9BB8-D56F6203D62E
CrashReporter Key:   2ac3185fb0d2c64d11247cccfa4a55af32fd5462
Hardware Model:      iPhone4,1
Process:             MetricMe [9322]
Path:                /var/mobile/Applications/847DC898-FD57-40F5-98F2-6C361DC7DECC/MetricMe.app/MetricMe
Identifier:          com.anthonydubis.metricme
Version:             3.0.5 (3.0.5)
Code Type:           ARM (Native)
Parent Process:      launchd [1]

Date/Time:           2013-10-04 13:48:13.129 -0400
OS Version:          iOS 7.0.2 (11A501)
Report Version:      104

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Triggered by Thread:  0

Last Exception Backtrace:
0   CoreFoundation                  0x2ebf9f4e __exceptionPreprocess + 126
1   libobjc.A.dylib                 0x38fd26aa objc_exception_throw + 34
2   CoreFoundation                  0x2eb37c12 -[__NSSetM addObject:] + 558
3   MetricMe                        0x00069fc4 -[IAPHelper provideContentForRestoredProductIdentifier:] (IAPHelper.m:172)
4   MetricMe                        0x00069ce8 -[IAPHelper restoreTransaction:] (IAPHelper.m:146)
5   MetricMe                        0x00069b14 -[IAPHelper paymentQueue:updatedTransactions:] (IAPHelper.m:124)
6   StoreKit                        0x312fddc8 __NotifyObserverAboutChanges + 80
7   CoreFoundation                  0x2eb2d714 CFArrayApplyFunction + 32
8   StoreKit                        0x312fdd64 -[SKPaymentQueue _notifyObserversAboutChanges:sendUpdatedDownloads:] + 124
9   StoreKit                        0x312fe646 -[SKPaymentQueue _processUpdates:trimUnmatched:sendUpdatedDownloads:] + 1022
10  StoreKit                        0x312fed1c -[SKPaymentQueue _setTransactionsWithReply:] + 124
11  StoreKit                        0x312fd906 __38-[SKPaymentQueue _establishConnection]_block_invoke_2 + 58
12  libdispatch.dylib               0x394b5d76 _dispatch_call_block_and_release + 6
13  libdispatch.dylib               0x394b5d62 _dispatch_client_callout + 18
14  libdispatch.dylib               0x394bc7bc _dispatch_main_queue_callback_4CF$VARIANT$mp + 264
15  CoreFoundation                  0x2ebc481c __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 4
16  CoreFoundation                  0x2ebc30f0 __CFRunLoopRun + 1296
17  CoreFoundation                  0x2eb2dce2 CFRunLoopRunSpecific + 518
18  CoreFoundation                  0x2eb2dac6 CFRunLoopRunInMode + 102
19  GraphicsServices                0x3384e27e GSEventRunModal + 134
20  UIKit                           0x313cfa3c UIApplicationMain + 1132
21  MetricMe                        0x00043842 main (main.m:16)
22  libdyld.dylib                   0x394daab2 tlv_initializer + 2


Thread 0 Crashed:
0   libsystem_kernel.dylib          0x395911fc __pthread_kill + 8
1   libsystem_pthread.dylib         0x395faa2e pthread_kill + 54
2   libsystem_c.dylib               0x39541ff8 abort + 72
3   libc++abi.dylib                 0x38870cd2 abort_message + 70
4   libc++abi.dylib                 0x388896e0 default_terminate_handler() + 248
5   libobjc.A.dylib                 0x38fd291e _objc_terminate() + 190
6   libc++abi.dylib                 0x388871c4 std::__terminate(void (*)()) + 76
7   libc++abi.dylib                 0x38886a18 __cxa_throw + 112
8   libobjc.A.dylib                 0x38fd277e objc_exception_throw + 246
9   CoreFoundation                  0x2eb37c12 -[__NSSetM addObject:] + 558
10  MetricMe                        0x00069fc4 -[IAPHelper provideContentForRestoredProductIdentifier:] (IAPHelper.m:172)
11  MetricMe                        0x00069ce8 -[IAPHelper restoreTransaction:] (IAPHelper.m:146)
12  MetricMe                        0x00069b14 -[IAPHelper paymentQueue:updatedTransactions:] (IAPHelper.m:124)
13  StoreKit                        0x312fddc8 __NotifyObserverAboutChanges + 80
14  CoreFoundation                  0x2eb2d716 CFArrayApplyFunction + 34
15  StoreKit                        0x312fdd64 -[SKPaymentQueue _notifyObserversAboutChanges:sendUpdatedDownloads:] + 124
16  StoreKit                        0x312fe646 -[SKPaymentQueue _processUpdates:trimUnmatched:sendUpdatedDownloads:] + 1022
17  StoreKit                        0x312fed1c -[SKPaymentQueue _setTransactionsWithReply:] + 124
18  StoreKit                        0x312fd906 __38-[SKPaymentQueue _establishConnection]_block_invoke_2 + 58
19  libdispatch.dylib               0x394b5d78 _dispatch_call_block_and_release + 8
20  libdispatch.dylib               0x394b5d64 _dispatch_client_callout + 20
21  libdispatch.dylib               0x394bc7bc _dispatch_main_queue_callback_4CF$VARIANT$mp + 264
22  CoreFoundation                  0x2ebc481c __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 4
23  CoreFoundation                  0x2ebc30f0 __CFRunLoopRun + 1296
24  CoreFoundation                  0x2eb2dce2 CFRunLoopRunSpecific + 518
25  CoreFoundation                  0x2eb2dac6 CFRunLoopRunInMode + 102
26  GraphicsServices                0x3384e27e GSEventRunModal + 134
27  UIKit                           0x313cfa3c UIApplicationMain + 1132
28  MetricMe                        0x00043842 main (main.m:16)
29  libdyld.dylib                   0x394daab4 start + 0

Отредактировано для добавления строки 172 IAPHelper:

Он вызывается во время восстановления продукта и передает его в идентификатор продукта IAP. Интересно, что это происходит прямо при запуске приложения, что заставляет меня задаться вопросом, является ли это сценарий, когда интернет-соединение было потеряно во время процесса покупки IAP, и теперь оно пытается восстановить его при запуске.

IAPHelper содержит множество методов для покупки и восстановления продукта (также наблюдателя для уведомлений о покупке). SharedInstance вызывается в applicationDidFinishLaunching, чтобы он был готов получать квитанции от Apple. Строка 172 - это то, где идентификатор продукта добавляется в _purchasedProductIdentifiers, который является переменной экземпляра NSMutableSet. Будет ли ошибка означать, что что-то не так с _purchasedProductIdentifiers (набор NSMutable должен быть инициализирован до его получения) или передан идентификатор продукта? На практике мы никогда не должны доходить до этой точки, если не создано sharedInstance из IAPHelper, в котором создается _purchasedProductIdentifiers.

- (void)provideContentForRestoredProductIdentifier:(NSString *)productIdentifier
{
    [_purchasedProductIdentifiers addObject:productIdentifier]; 
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:productIdentifier];
    [[NSUserDefaults standardUserDefaults] synchronize];
    [[NSNotificationCenter defaultCenter] postNotificationName:IAPHelperProductRestoredNotification object:productIdentifier userInfo:nil];

}
4b9b3361

Ответ 1

Недавно мы начали получать похожие отчеты о сбоях от некоторых наших пользователей, проблема в том, что передаваемый здесь productId - это "nil", что приведет к сбою b/c, который будет использоваться в качестве ключа, и хэш понадобится для вычисления по линии.

Однако, до сих пор неясно, почему это иногда "ноль". Но, по крайней мере, сбой можно избежать, защищая от возможности того, что productId может быть ноль время от времени.

Ответ 2

Я столкнулся с этой проблемой сегодня утром с моим iPhone 5S и приложением. Проблема, по-видимому, вызвана тем, что мне нужно проверить код безопасности на недавно добавленной кредитной карте при попытке выполнить покупку в приложении. Это вытащило меня из приложения, в App Store.

После проверки моего кода безопасности мне было предложено снова купить покупку в приложении. Я сделал это, но с тех пор, как меня не было в приложении, приложение не было уведомлено о том, что я совершил покупку. Я переключился на приложение и использовал опцию покупки при восстановлении приложения, и как только я ввел свой пароль в App Store, приложение затем разбилось и продолжалось сбой при запуске даже после его удаления, телефон перезагрузился и приложение было повторно установлено. Я даже попробовал сбросить все настройки и выйти из своей учетной записи iTunes App Store. Ничто не помешало авариям.

Я посмотрел на стек сбоя, и он был очень похож на тот, который был вставлен выше, с кучей записей StoreKit в стеке. К сожалению, я не сохранил стек до принятия ядерного варианта (см. Ниже). Это было в iOS 7.0.3. Похоже, что покупка прошла, когда я установил приложение на другое устройство и сделал покупки восстановления, и это сработало.

К сожалению, единственный способ исправить это, который я нашел, - это стереть телефон и восстановить его из резервной копии, сделанной до покупки. К счастью для меня, я только что поддержал iCloud за 30 минут до этого, поэтому я сделал "Стереть все настройки и данные", а затем "Восстановить из iCloud Backup". Это закончилось тем, что заняло несколько часов, но после этого я снова смог совершить покупку, и мне сказали, что я уже купил ее, и это сработало.

Это не помогает никому, у кого нет недавней резервной копии, или столкнулся с этой проблемой, и продолжал использовать устройство с тех пор. В основном там что-то хранится на устройстве в тот момент, который не очищается, удаляя приложение или выполняя "Reset" Все настройки ". Это исправляет только стирание устройства.

Я предполагаю, что все, что хранится, является частью "Приобретённого приложением", который создается под резервными копиями, поэтому любые сделанные после этого резервные копии, скорее всего, будут "повреждены", если только не удастся исправить их вручную с помощью третьего сторонней программы.

Я предлагаю сообщить об этом bugreport.apple.com. Вы можете указать им свои данные в дополнение к трассе трассировки, если хотите.

Ответ 3

У меня были подобные симптомы (приложение разбилось с каждым запуском), и проблема заключалась в том, что StoreObserver не был сохранен в очереди:

StoreObserver *observer = [[StoreObserver alloc] init];
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

Решение заключалось в том, чтобы сделать наблюдателем переменную экземпляра.

Тема, связанная с этой проблемой: Ошибка приложения в [[SKPaymentQueue defaultQueue] addTransactionObserver: observer];