Я создаю моносенсорные привязки к службе чата 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 ();
}
Спасибо за ваши идеи!!