我正在创建QuickBlox聊天服务的monodouch绑定。我在以前的版本(1.9.x)上成功完成了这项工作,但是在2.0.2库上成功完成了这项工作,但遇到了在设备上启动新绑定的问题。它在模拟器上启动罚款。猜测这是连接器标志的问题,但已经用完了想法。Xamarin iOS项目引用绑定在SIM卡上启动,但不在设备上
绑定项目编译得很好。该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 MobileCoreS ervices.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();
}
感谢您的想法!
检查设备控制台日志(崩溃前的提示)和崩溃报告本身。如果它们中的信息不明显,那么您可能希望将它们纳入您的问题。 – poupou 2014-09-25 14:53:57
@poupou感谢您的建议。问题是设备上没有生成崩溃日志,也没有控制台中的任何语句。应用程序在黑屏前显示,然后消失,没有日志。猜猜它并不真正崩溃,就像流程本身刚刚退出一样。 – 2014-09-25 16:33:05
另外,在AppDelegate.FinishedLaunching中设置断点永远不会被击中。在退出之前没有那么远。不知道如何从这个问题中获得任何调试信息。 – 2014-09-25 16:43:55