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