ios - Xamarin iOS 项目引用绑定(bind)在 sim 上而不是在设备上启动

标签 ios xamarin.ios xamarin ios-simulator quickblox

我正在为 Quickblox 聊天服务创建单点触控绑定(bind)。我在以前的版本(1.9.x)上成功地做到了这一点,但在 2.0.2 库上,在设备上启动新绑定(bind)时遇到问题。它可以在模拟器上正常启动。猜测这是链接器标志的问题,但已经没有想法了。

绑定(bind)项目编译良好。 DLL 已创建,我可以在我的宿主项目中引用它。在模拟器中运行宿主项目工作正常。在实际设备上,应用程序启动,但进程在通过黑屏之前崩溃。 Xamarin Studio“应用程序输出”窗口中没有输出。根本不值一提。有什么办法可以插入一些调试信息来找出问题所在?

Quickblox 提供具有以下设置的 iOS 示例项目:

Other Linker Flags: -lstdc++ -ObjC -lxml2

Link Binary With Libraries:

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



这是我的绑定(bind)项目中的“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++")]

我在两个运行 iOS 7.1 的 iPhone 5 设备上试过这个

如果我在绑定(bind)中注释掉这个特定的类 (QBRequest.h),项目将在设备上启动。它告诉我有一些东西绑定(bind)到那个特定的类。该类继承自 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 文件中的绑定(bind)条目是这样的:
[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 ();
}

谢谢你的想法!!

最佳答案

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

Problem is that there are no crash logs being generated



您应该在设备控制台日志中看到一些内容(每个启动的应用都会记录一些内容)。

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

Device console logs reveals some truth. The exception is being thrown by the QBRequest static initializer.



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

关于ios - Xamarin iOS 项目引用绑定(bind)在 sim 上而不是在设备上启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26026048/

相关文章:

ios - 删除 iOS 中的缓存。 cocoa 错误 513

c# - 如何确定 macOS 应用程序是否是通过 url 启动的

ios - UIScreenEdgePanGestureRecognizer 对 subview 没有反应

c# - System.TypeLoadException 当我尝试将 JArray 转换为线程中的对象时

c# - 如何在 Xamarin iOS 中将本地钥匙串(keychain)同步到设备和 iCloud

xamarin - 错误 MT5306 : Failed to create the a fat library. 请查看构建日志

某些设备上的 Play 商店中未显示 Android 应用

ios - 适用于 Swift iOS 的 Smaato : linker command with exit code 1 (use -v to see invocation)

ios - 删除 Controller (B) 中的表行时,如何更新 Controller (A) 中的标签?

ios - 在声明 strong self 后在闭包中使用 [弱 self ] 是否有潜在的缺点?