Monotouch/Xamarin Binding: Трябва да зададете конфигурационни параметри, преди класът да бъде създаден от monotouch

Създавам iOS обвързвания за библиотеката Quickblox. Quickblox написа класа QBRequest, за да провери за конфигурационни параметри (идентификационен номер на акаунт и т.н.) в статичния метод „initialize“. Библиотеката хвърля изключение, ако конфигурационните параметри не са зададени.

Изглежда, че monotouch всъщност създава всички класове, преди да имам възможност да задам конфигурационните данни. В резултат на това изключението не е уловено и приложението се срива.

Трябва по някакъв начин да извикам методи на други класове, преди monotouch да създаде класа QBRequest. Освен това проектът ми работи добре в симулатора. Това се случва само на устройството. Може би има флаг за свързване или компилатор, който пропускам?

Ето лог съобщението от Quickblox и проследяването на стека:

Sep 30 10:31:30 FamilyMeiOS[3929] <Error>: *** Terminating app due to uncaught exception         'BaseServiceException', reason: 'You have missed setup credentials.
    Please insert following code inside your application 
    [QBApplication sharedApplication].applicationId = applicationID;
    [QBConnection registerServiceKey:authorizationKey];
    [QBConnection registerServiceSecret:authorizationSecret];
    Before any other code, that uses our service.'

Last Exception Backtrace:
0   CoreFoundation                  0x2e3a4ec6 __exceptionPreprocess + 126
1   libobjc.A.dylib                 0x38b3fce2 objc_exception_throw + 34
2   FamilyMeiOS                     0x000d0c62 __23+[QBRequest initialize]_block_invoke (QBRequest.m:42)
3   libdispatch.dylib               0x3902996a dispatch_once_f + 42
4   FamilyMeiOS                     0x000d09e2 +[QBRequest initialize] (QBRequest.m:40)
5   libobjc.A.dylib                 0x38b40554 _class_initialize + 568
6   libobjc.A.dylib                 0x38b44a0a lookUpImpOrForward + 126
7   libobjc.A.dylib                 0x38b4497e _class_lookupMethodAndLoadCache3 + 30
8   libobjc.A.dylib                 0x38b498b4 _objc_msgSend_uncached + 20
9   FamilyMeiOS                     0x02004bba monotouch_create_classes (registrar.m:33672)
10  FamilyMeiOS                     0x02004f5c monotouch_setup (main.armv7.m:82)
11  FamilyMeiOS                     0x0211a278 monotouch_main (monotouch-main.m:225)
12  FamilyMeiOS                     0x02005008 main (main.armv7.m:96)
13  libdyld.dylib                   0x3903dab2 tlv_initializer + 2

В моя хост проект аз задавам необходимата конфигурация, преди да използвам класа QBRequest:

//Configure QuickBlox
QuickBlox.QBApplication.Shared.ApplicationID = QUICKBLOX_APP_ID;
QuickBlox.QBConnection.RegisterServiceKey (QUICKBLOX_AUTHORIZATION);
QuickBlox.QBConnection.RegisterServiceSecret (QUICKBLOX_SECRET);
QuickBlox.QBSettings.SetAccountKey (QUICKBLOX_ACCOUNT_KEY);

Има ли начин да се изпречи monotouch и да се зададат тези конфигурационни данни, преди да се опита да създаде класа QBRequest?


person Art Haedike    schedule 30.09.2014    source източник
comment
FYI... въпросът ми е продължение на тази публикация, в която @poupou беше най-полезен. В тази публикация изброявам действителния код за обвързване: stackoverflow.com/questions/26026048/   -  person Art Haedike    schedule 30.09.2014


Отговори (1)


Няма начин да стартирате управляван код, преди да възникне това изключение.

Въпреки това можете да стартирате естествен (C/Objective-C) код, по-специално инициализатор на библиотека:

__attribute__((constructor))
static void initialize_quickblox ()
{    
    [QBApplication sharedApplication].applicationId = applicationID;
    [QBConnection registerServiceKey:authorizationKey];
    [QBConnection registerServiceSecret:authorizationSecret];
}

Така че ще трябва да създадете своя собствена собствена библиотека с тази функция и да се свържете с нея (най-лесното вероятно е да я добавите към вашата библиотека за обвързване като втора собствена библиотека).

person Rolf Bjarne Kvinge    schedule 01.10.2014
comment
Благодаря! Вие сте експертът, на когото се надявах да отговоря. Трябва да поддържам множество конфигурации (dev, staging, production) с различни акаунти Quickblox по време на компилация в моя хост проект. Предполагам, че мога да направя това с 'getenv(QUICKBLOX_APP_ID)'. Изглежда, че мога да задавам променливи на средата в Xamarin Studio: kb.xamarin.com/customer/portal/articles/ - person Art Haedike; 01.10.2014
comment
Да, можете да зададете променливи на средата в Xamarin Studio. - person Rolf Bjarne Kvinge; 02.10.2014