2014-09-24 37 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靜態初始化器拋出異常。

正是..崩潰日誌已滿。設備控制檯也顯示了這一點。

相關問題