Monotouch/Xamarin Binding: необходимо установить параметры конфигурации перед созданием класса с помощью monotouch.

Я создаю привязки iOS для библиотеки Quickblox. Quickblox написал класс QBRequest для проверки параметров конфигурации (идентификатор учетной записи и т. д.) в статическом методе «инициализации». Библиотека выдает исключение, если параметры конфигурации не установлены.

Кажется, что 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
К вашему сведению ... мой вопрос является продолжением этого поста, в котором @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