4

.h:

#import <Foundation/Foundation.h>

typedef enum _XLBadgeManagedType {
    XLInboxManagedMethod = 0,
    XLDeveloperManagedMethod = 1
} XLBadgeManagedType ;


@interface XLXtifyOptions :NSObject
{
    NSString *xoAppKey;
    BOOL    xoLocationRequired ;
    BOOL    xoBackgroundLocationRequired ;
    BOOL    xoLogging ;
    BOOL    xoMultipleMarkets;
    XLBadgeManagedType xoManageBadge;
}
+ (XLXtifyOptions *)getXtifyOptions;
- (NSString *)getAppKey ;
- (BOOL) isLocationRequired;
- (BOOL) isBackgroundLocationRequired ;
- (BOOL) isLogging ;
- (BOOL) isMultipleMarkets;
- (XLBadgeManagedType)  getManageBadgeType;
- (void)xtLogMessage:(NSString *)header content:(NSString *)message, ...;
@end

他们:

#import "XLXtifyOptions.h"
#import "XtifyGlobal.h"

static  XLXtifyOptions *xXtifyOptions=nil;

@implementation XLXtifyOptions

+ (XLXtifyOptions *)getXtifyOptions
{
    if (xXtifyOptions==nil) {
        xXtifyOptions=[[XLXtifyOptions alloc]init];
    }
    return xXtifyOptions;
}

-(id)init
{
    if (self = [super init]) {        
        xoAppKey=xAppKey;
        xoLocationRequired=xLocationRequired;
        xoBackgroundLocationRequired=xRunAlsoInBackground ;
        xoLogging =xLogging ;
        xoMultipleMarkets=xMultipleMarkets;
        xoManageBadge=xBadgeManagerMethod;

    }
    return self;
}

- (NSString *)getAppKey
{
    return xoAppKey;
}
- (BOOL) isLocationRequired
{
    return xoLocationRequired;
}
- (BOOL) isBackgroundLocationRequired 
{
    return xoBackgroundLocationRequired;
}
- (BOOL) isLogging 
{
    return xoLogging;
}
- (BOOL) isMultipleMarkets
{
    return xoMultipleMarkets;
}
- (XLBadgeManagedType)  getManageBadgeType
{
    return xoManageBadge;
}
- (void)xtLogMessage:(NSString *)header content:(NSString *)format, ... {
    va_list args;
    va_start(args, format);
    if (xoLogging) {
        NSString *prettyFmt=[NSString stringWithFormat:@"%@ %@", header,format];
        NSLogv(prettyFmt, args);
    }
    va_end(args);
}
@end

全球.h:

#define xAppKey @"abc123"

#define xLocationRequired NO

#define xRunAlsoInBackground FALSE    

#define xBadgeManagerMethod XLInboxManagedMethod 

#define xLogging TRUE

#define xMultipleMarkets FALSE

我的绑定定义:

[BaseType (typeof (NSObject))]
public interface XLXtifyOptions {

    [Static]
    [Export ("xtifyOptions")]
    XLXtifyOptions Options { get;}

    [Export ("getAppKey")]
    string GetAppKey ();

    [Export ("isLocationRequired")]
    bool IsLocationRequired ();

    [Export ("isBackgroundLocationRequired")]
    bool IsBackgroundLocationRequired ();

    [Export ("isLogging")]
    bool IsLogging ();

    [Export ("isMultipleMarkets")]
    bool IsMultipleMarkets ();

    [Export ("getManageBadgeType")]
    XLBadgeManagedType GetManageBadgeType ();

    //      [Export ("xtLogMessage:content:...")]
    //      void XtLogMessagecontent... (string header, string message,, );
    //      
}

这些返回 null:

XLXtifyOptions.Options;
new XLXtifyOptions().GetAppKey();

供应商入门说明:

  XLXtifyOptions *anXtifyOptions=[Options getVendorOptions];
  [[TheirClass get ]initilizeXoptions:anVendorOptions];

我匆忙尝试重命名一些东西,因为我不确定供应商的代码有多少可以粘贴,所以希望我没有混淆。

这与:Binding #define used as constant

更多信息:

如果我在设备而不是模拟器上运行它,我会收到以下错误:

Unhandled managed exception: Wrapper type 'XtifyPush.XLXtifyOptions' is missing its native ObjectiveC class 'XLXtifyOptions'. 

编辑

回复@Stephane:我更新了代码以不再掩盖供应商。我绑定的是: http: //developer.xtify.com/display/sdk/Getting+Started+with+Apple+Push+Notification+Service,fwiw。我按照您的建议更新了对 getXtifyOptions 的引用,但结果相同。我对您引用的 github 库的了解已尽,但我会继续挖掘。

我正在处理的绑定可在以下位置获得:https ://github.com/lordscarlet/monotouch-bindings/tree/master/Xtify

4

4 回答 4

3

正确的绑定getVendorOptions应该是这样的:

[Static]
[Export ("vendorOptions")]
Options Options { get;}

get部分和大写是按惯例完成的。查看为此生成的代码。GetAppKey 只要您将其绑定为方法而不是属性就可以了。请注意,它不应返回 null 而是抛出异常。

关于

MyNamespace.Current;

我没有看到任何定义。所以我不知道怎么了。

在这一点上,我对如何构建本机库并将其包含在托管库中的方式有​​些担忧(re: 设备上的异常)。确保你做对了,看看https://github.com/mono/monotouch-bindings中的大量示例

于 2013-03-12T09:17:02.377 回答
3

tl; dr Options 类未编译

我查看了您的项目以及您尝试绑定的功能。看起来有 2 个部分,嵌入式框架,它是分布式预编译的,还有一些其他的东西(主要是 Options 类),包括设置.h应该在你的应用程序中编译的 .AppKey

除非您创建一个最小的xcode项目(并为 公开一个设置器AppKey),否则您的绑定无法正常工作。

另一种选择是放弃该部分并在 C# 中完全实现 XLXtifyOptions,然后您负责自己设置 AppKey。

更新:编译后的嵌入式框架的一些 api 调用将选项作为参数,因此如果您仅在 C# 中定义选项,请确保为[Export]Options.h 文件中定义的每个函数或属性添加一个属性

希望它有帮助,你明白我的意思。

于 2013-03-12T13:52:23.037 回答
3

当您需要构建自己的托管选项类时,您可以如何做到这一点(在您的 Extra.cs 文件中)

public class XLXtifyOptions : NSObject {
    static XLXtifyOptions options;
    [Export ("getXtifyOptions")] //not sure that one will be ever called by obj-C code
    public static XLXtifyOptions XtifyOptions () {
        return options ?? (options = new XLXtifyOptions () {
            appKey = "yourappkey",
        });
    }

    string appKey;

    [Export ("getAppKey")]
    public string GetAppKey () {
        return appKey;
    }

    //same for all the getters

    [Export ("getManageBadgeType")
    public XLBadgeManageType GetManageBadgeType () {
        return manageBadge;
    }

    //Have to check if this is the right way to bind method with variable lengths argument, but that's the idea
    [Export ("xtLogMessage:content:")]
    public void LogMessage (string header, params string[] message)
    {
        //print the message
    }
}

public enum XLBadgeManageType {
    Inbox,
    Developer
}

这应该给你一个想法......

于 2013-03-12T15:54:22.620 回答
2

首先,这个 API 的设计很糟糕,它依赖于#define 预处理器指令来进行初始配置,如 ApiKey、标题上的大量空格……仅提及一些问题。

你可以在这里找到一个绑定项目,请测试它并告诉我它是否能解决你的问题。

https://dl.dropbox.com/u/2058130/random%20stuff/XtifyLib.zip


APIKey 尚未在您的绑定上设置。

在 SDK 头文件中,您会发现XLXtifyOptions.hXLXtifyOptions.m意味着XLXtifyOptions类不在 Static 中XtifyPush,因此我对这两个文件进行了一些修改,并创建了另一个名为libXtifyLibHelper.a.

该库包含两个帮助 objc 消息getXtifyOptionsWithAppKey:locationRequired:backgroundLocationRequired:logging:multipleMarkets:manageBadge:getXtifyOptionsWithAppKey:它们将帮助您正确设置 API 密钥。

请使用上述帮助程序之一来设置您的 API 密钥,这些已绑定为 XLXtifyOptions 类中的静态方法。

作为旁注,您不必担心,libXtifyLibHelper.a当您构建提供的项目时,它会自动 (TM) 包含在您的 DLL 中。

希望这可以帮助

亚历克斯

于 2013-03-13T09:03:10.713 回答