我正在創建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