Ошибка при создании экземпляра SBNotificationHub - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь реализовать push-уведомление в своем приложении Xamarin на iOS.Используя пример из документов, у меня есть:

        if (_hub == null)
        {
            string connectionString = "Endpoint=<whatever>";
            string hubName = "<hub name>";
            _hub = new SBNotificationHub(connectionString, hubName);
        }

По какой-то причине я получил исключение: "Foundation.MonoTouchException: брошено исключение Objective C. Имя: NSInvalidArgumentException Причина: *** - [__ NSDictionaryM setObject: forKey:]: ключ не может быть нулевым. Собственная трассировка стека: "

Любые идеи или указания, где искать, приветствуются.Подробнее об ошибке:

    1   libobjc.A.dylib                     0x00000001988ea9f8 objc_exception_throw + 56
2   CoreFoundation                      0x0000000199688f8c _CFArgv + 0
3   CoreFoundation                      0x00000001995fe2b4 <redacted> + 904
4   TennisUmpireXamariniOS              0x0000000102355038 -[SBLocalStorage readContent] + 508
5   TennisUmpireXamariniOS              0x000000010235472c -[SBLocalStorage initWithNotificationHubPath:] + 296
6   TennisUmpireXamariniOS              0x000000010234dbe4 -[SBNotificationHub initWithConnectionString:notificationHubPath:] + 420
7   TennisUmpireXamariniOS              0x0000000104530a7c wrapper_managed_to_native_ApiDefinition_Messaging_IntPtr_objc_msgSend_IntPtr_IntPtr_intptr_intptr_intptr_intptr + 236
8   TennisUmpireXamariniOS              0x0000000104521038 WindowsAzure_Messaging_SBNotificationHub__ctor_string_string + 792
9   TennisUmpireXamariniOS              0x0000000102418a00 TennisUmpireXamarin_iOS_AppDelegate_RegisteredForRemoteNotifications_UIKit_UIApplication_Foundation_NSData + 480
10  TennisUmpireXamariniOS              0x000000010271d998 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr + 248
11  TennisUmpireXamariniOS              0x0000000104d30e80 mono_jit_runtime_invoke + 948
12  TennisUmpireXamariniOS              0x0000000104db54e8 mono_runtime_invoke_checked + 144
13  TennisUmpireXamariniOS              0x0000000104db8d90 mono_runtime_invoke + 80
14  TennisUmpireXamariniOS              0x00000001023ccf3c _ZL31native_to_managed_trampoline_23P11objc_objectP13objc_selectorPP11_MonoMethodP13UIApplicationP6NSDataj + 680
15  TennisUmpireXamariniOS              0x00000001023ccc88 -[AppDelegate application:didRegisterForRemoteNotificationsWithDeviceToken:] + 64
16  libdispatch.dylib                   0x000000019914fa38 <redacted> + 24
17  libdispatch.dylib                   0x00000001991507d4 <redacted> + 16
18  libdispatch.dylib                   0x00000001990fe004 <redacted> + 1068
19  CoreFoundation                      0x00000001996a0ec0 <redacted> + 12
20  CoreFoundation                      0x000000019969bdf8 <redacted> + 1924
21  CoreFoundation                      0x000000019969b354 CFRunLoopRunSpecific + 436
22  GraphicsServices                    0x000000019b89b79c GSEventRunModal + 104
23  UIKitCore                           0x00000001c5897b68 UIApplicationMain + 212
24  TennisUmpireXamariniOS              0x00000001031962c8 wrapper_managed_to_native_UIKit_UIApplication_UIApplicationMain_int_string___intptr_intptr + 328
25  TennisUmpireXamariniOS              0x00000001030f723c UIKit_UIApplication_Main_string___intptr_intptr + 44
26  TennisUmpireXamariniOS              0x00000001030f71fc UIKit_UIApplication_Main_string___string_string + 172
27  TennisUmpireXamariniOS              0x00000001024178c0 TennisUmpireXamarin_iOS_Application_Main_string__ + 128
28  TennisUmpireXamariniOS              0x000000010271d998 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr + 248
29  TennisUmpireXamariniOS              0x0000000104d30e80 mono_jit_runtime_invoke + 948
30  TennisUmpireXamariniOS              0x0000000104db54e8 mono_runtime_invoke_checked + 144
31  TennisUmpireXamariniOS              0x0000000104dbb320 mono_runtime_exec_main_checked + 120
32  TennisUmpireXamariniOS              0x0000000104d1141c mono_jit_exec + 268
33  TennisUmpireXamariniOS              0x0000000104ea94d4 xamarin_main + 2184
34  TennisUmpireXamariniOS              0x00000001024177b8 main + 96
35  libdyld.dylib                       0x00000001991618e0 <redacted> + 4

1 Ответ

0 голосов
/ 29 мая 2019

Никто, похоже, не сталкивался с этой проблемой, но, думаю, я понял, что происходит, и хочу изложить это в письменном виде.

Компонент SBNotificationHub сохраняет состояние в хранилище. Когда вызывается конструктор, это состояние восстанавливается. И мои параметры для конструктора были просто хороши, первый вызов прошел без ошибок.

Однако, когда я попытался вызвать метод RegisterTemplate, я передал недопустимые параметры, что привело к ошибке 400 из концентратора уведомлений. Проблема в том, что даже с этими недопустимыми параметрами состояние обновлялось.

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

Теперь я застряну, пока приложение не будет удалено. Это с версией https://www.nuget.org/packages/Xamarin.Azure.NotificationHubs.iOS/ (1.2.5.2). Проблема в том, что я использовал пакет https://www.nuget.org/packages/Xamarin.Azure.NotificationHubs.iOS-updated/,, который является раздвоенной версией, которая хранит состояние в KeyChain. Как мы знаем, даже если приложение удалено, значения в KeyChain сохраняются, поэтому даже после переустановки приложения я застревал до тех пор, пока фактически не уничтожил устройство.

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

Мне кажется, что правильное поведение - не обновлять состояние, если вызов RegisterTemplate не был успешным. Кроме того, было бы неплохо иметь возможность очистить состояние в хранилище (связка ключей или нет), если оно повреждено. Или зачем конструктору вообще нужно восстанавливать состояние?

...