2014-09-24 65 views
1

我正在创建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(); 
} 

感谢您的想法!

+0

检查设备控制台日志(崩溃前的提示)和崩溃报告本身。如果它们中的信息不明显,那么您可能希望将它们纳入您的问题。 – poupou 2014-09-25 14:53:57

+0

@poupou感谢您的建议。问题是设备上没有生成崩溃日志,也没有控制台中的任何语句。应用程序在黑屏前显示,然后消失,没有日志。猜猜它并不真正崩溃,就像流程本身刚刚退出一样。 – 2014-09-25 16:33:05

+0

另外,在AppDelegate.FinishedLaunching中设置断点永远不会被击中。在退出之前没有那么远。不知道如何从这个问题中获得任何调试信息。 – 2014-09-25 16:43:55

回答

0

检查设备控制台日志(即将崩溃前的提示)和崩溃报告本身。

问题是,有没有产生

崩溃日志应该会看到在设备控制台日志(每次启动日志什么应用程序)。

同时检查设备日志有可能没有足够的空间来保存新的崩溃报告。

设备控制台日志揭示了一些事实。 QBRequest静态初始化器抛出异常。

正是..崩溃日志已满。设备控制台也显示了这一点。

相关问题