Проект Xamarin iOS со ссылкой на привязку запускается на sim, но не на устройстве

Я создаю моносенсорные привязки к службе чата Quickblox. Я успешно сделал это в предыдущей версии (1.9.x), но в библиотеке 2.0.2 возникли проблемы с запуском новой привязки на устройстве. На симуляторе запускается нормально. Предполагаю, что это проблема с флагами компоновщика, но у меня закончились идеи.

Проект привязки компилируется нормально. DLL создана, и я могу сослаться на нее в своем хост-проекте. Запуск хост-проекта в симуляторе работает нормально. На реальном устройстве приложение запускается, но процесс завершается сбоем, прежде чем пройти через черный экран. Нет вывода в окне «Вывод приложения» Xamarin Studio. Совсем ничего. В любом случае я могу вставить некоторую отладочную информацию, чтобы выяснить, что происходит не так?

Quickblox предоставляет пример проекта iOS со следующими настройками:

Другие флаги компоновщика: -lstdc++ -ObjC -lxml2

Связать двоичный файл с библиотеками:

libxml2.2.dylib libresolv.9.dylib libz.1.2.5.dylib
AVFoundation.framework CoreVideo.framework Quickblox.framework Accelerate.framework CoreMedia.framework AudioToolbox.framework CoreLocation.framework CoreDate.framework CoreGraphics.framework MobileCoreServices.framework SystemConfiguration.framework CFNetwork.framework UIKit.framework Foundation.framework

Вот мой файл «linkwith.cs» в моем проекте привязки:

using System;
using MonoTouch.ObjCRuntime;

[assembly: LinkWith ("libQuickblox.a", LinkTarget.ArmV7 | LinkTarget.ArmV7s | LinkTarget.Simulator, ForceLoad = true, Frameworks = "CFNetwork SystemConfiguration MobileCoreServices CoreGraphics CoreLocation CoreData AudioToolbox CoreMedia Accelerate CoreVideo AVFoundation Security", LinkerFlags = "-lxml2 -lz -lresolv -ObjC -lstdc++")]

Я пробовал это на двух устройствах iPhone 5, оба под управлением iOS 7.1.

Если я закомментирую этот конкретный класс (QBRequest.h) в привязке, проект запустится на устройстве. Это говорит мне, что есть что-то с привязкой к этому конкретному классу. Этот класс наследуется от NSObject и не импортирует какие-либо другие библиотеки, поэтому нет ничего, что вызывало бы какие-либо очевидные опасения.

#import <Foundation/Foundation.h>

@class QBRequest;
@class QBResponse;
@class QBRequestStatus;

@protocol QBResponseSerialisationProtocol;
@protocol QBRequestSerialisationProtocol;
@class QBHTTPRequestSerialiser;

extern const struct QBRequestMethod {
    __unsafe_unretained NSString *POST;
    __unsafe_unretained NSString *GET;
    __unsafe_unretained NSString *HEAD;
    __unsafe_unretained NSString *PUT;
    __unsafe_unretained NSString *DELETE;
} QBRequestMethod;

typedef void (^QBRequestStatusUpdateBlock)(QBRequest *request, QBRequestStatus *status);
typedef void (^QBRequestCompletionBlock)(QBRequest *request, QBResponse *response, NSDictionary *objects);

typedef void (^QBRequestErrorBlock)(QBResponse *response);


@interface QBRequest : NSObject

@property (nonatomic, getter=isCancelled, readonly) BOOL canceled;

@property (nonatomic, copy) QBRequestCompletionBlock completionBlock;
@property (nonatomic, copy) QBRequestStatusUpdateBlock updateBlock;

@property (nonatomic, strong) QBHTTPRequestSerialiser<QBRequestSerialisationProtocol> *requestSerialisator;

// QBHTTPResponseSerialiser<QBResponseSerialisationProtocol>
@property (nonatomic, strong) NSArray *responseSerialisators;

@property (nonatomic, copy) NSDictionary *headers;
@property (nonatomic, copy) NSDictionary *parameters;
@property (nonatomic, copy) NSData *body;

@property (nonatomic) NSStringEncoding encoding;

- (instancetype)initWithCompletionBlock:(QBRequestCompletionBlock)completionBlock;
- (instancetype)initWithUpdateBlock:(QBRequestStatusUpdateBlock)updateBlock completionBlock:(QBRequestCompletionBlock)completionBlock;

- (void)cancel;

@end

Запись привязки в моем файле ApiDefinition.cs такова:

[BaseType (typeof (NSObject))]
public partial interface QBRequest {

    [Export ("canceled")]
    bool Canceled { [Bind ("isCancelled")] get; }

    [Export ("completionBlock", ArgumentSemantic.Copy)]
    RequestCompletionDelegate CompletionBlock { get; set; }

    [Export ("updateBlock", ArgumentSemantic.Copy)]
    RequestCompletionDelegate UpdateBlock { get; set; }

    [Export ("headers", ArgumentSemantic.Copy)]
    NSDictionary Headers { get; set; }

    [Export ("parameters", ArgumentSemantic.Copy)]
    NSDictionary Parameters { get; set; }

    [Export ("body", ArgumentSemantic.Copy)]
    NSData Body { get; set; }

    [Export ("encoding")]
    NSStringEncoding Encoding { get; set; }

    [Export ("initWithCompletionBlock:")]
    IntPtr CreateWithCompletionDelegate (RequestCompletionDelegate completionBlock);

    [Export ("initWithUpdateBlock:completionBlock:")]
    IntPtr CreateWithStatusUpdateDelegate (RequestStatusUpdateDelegate updateBlock, RequestCompletionDelegate completionBlock);

    [Export ("cancel")]
    void Cancel ();
}

Спасибо за ваши идеи!!


person Art Haedike    schedule 24.09.2014    source источник
comment
Проверьте как журналы консоли устройства (подсказки непосредственно перед сбоем), так и сам отчет о сбое. Если информация в них не очевидна, вы можете включить их в свой вопрос.   -  person poupou    schedule 25.09.2014
comment
@poupou Спасибо за совет. Проблема в том, что на устройстве не создаются журналы сбоев, а также какие-либо заявления в консоли. Приложение появляется на переднем плане с черным экраном, затем исчезает, никаких логов. Думаю, на самом деле это не сбой, почти как сам процесс просто завершается.   -  person Art Haedike    schedule 25.09.2014
comment
Кроме того, установка точки останова в AppDelegate.FinishedLaunching никогда не срабатывает. Не зайти так далеко перед выходом. Не уверен, как получить какую-либо отладочную информацию из этой проблемы.   -  person Art Haedike    schedule 25.09.2014
comment
Проверьте оба журналы консоли устройства и отчет о сбое ‹ — вы должны что-то увидеть (каждое запускаемое приложение что-то регистрирует) в журналах консоли устройства. В противном случае отправьте отчет об ошибке и прикрепите тестовый пример, который мы можем создать и воспроизвести проблему.   -  person poupou    schedule 25.09.2014
comment
Ааа.. спасибо @poupou!! Журналы консоли устройства раскрывают некоторую правду. Исключение генерируется статическим инициализатором QBRequest. Он вызывается до того, как будут установлены некоторые данные конфигурации, и QBRequest выдает исключение. Странно, что статический инициализатор вызывается на устройстве в другом порядке, чем на симуляторе. Теперь мне нужно выяснить, как встать перед этим статическим инициализатором, чтобы установить параметры конфигурации. Ваш комментарий поставил меня в тупик. Спасибо!!   -  person Art Haedike    schedule 26.09.2014
comment
Рад это слышать :-) Я немного удивлен, что вы не получили отчет о сбое (проверьте логи, возможно, недостаточно места для сохранения новых отчетов о сбоях).   -  person poupou    schedule 26.09.2014
comment
@poupou Точно .. журналы сбоев были заполнены. Консоль устройства тоже это показала. Как я могу принять комментарий в качестве ответа? Вы очень помогли, спасибо!   -  person Art Haedike    schedule 26.09.2014
comment
np :-) Я превратил комментарии в ответ - он окажется более полезным для всех остальных (погуглите что-то подобное) и позволит вам принять его.   -  person poupou    schedule 26.09.2014


Ответы (1)


Проверьте журналы консоли устройства (подсказки непосредственно перед сбоем) и сам отчет о сбое.

Проблема в том, что не создаются журналы сбоев

Вы должны что-то увидеть (каждое запускаемое приложение что-то регистрирует) в журналах консоли устройства.

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

Журналы консоли устройства раскрывают некоторую правду. Исключение генерируется статическим инициализатором QBRequest.

Точно.. журналы сбоев были полны. Консоль устройства тоже это показала.

person poupou    schedule 26.09.2014