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

Global.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];

ベンダーのコードのどれだけを貼り付けてもよいかわからないため、急いで名前を変更しようとしましたが、問題を混乱させなかったことを願っています.

これは以下に関連しています:バインディング #define を定数として使用

詳しくは:

これをシミュレーターではなくデバイスで実行すると、次のエラーが発生します。

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

編集

re @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

tl;dr Options クラスがコンパイルされていません

あなたのプロジェクトと、バインドしようとしている機能を確認しました。プリコンパイルされて配布されている組み込みフレームワークと、アプリでコンパイルすることになっている.h設定するを含むその他のもの (主に Options クラス) の 2 つの部分があるようです。AppKey

xcodeそれを行う(および のセッターを公開する)最小限のプロジェクトを作成しない限りAppKey、バインディングが機能する方法はありません。

もう 1 つのオプションは、その部分を捨てて C# で XLXtifyOptions を完全に実装することです。その後、自分で AppKey を設定する必要があります。

UPDATE : コンパイルされた組み込みフレームワークの一部の API 呼び出しはオプションをパラメーターとして受け取るため、C# のみでオプションを定義する場合[Export]は、Options.h ファイルで定義されているすべての関数またはプロパティに属性を追加してください。

それが役に立てば幸いです。私の要点を理解してください。

于 2013-03-12T13:52:23.037 に答える
3

独自の管理された Options クラスを構築する必要があるため、それを行う方法は次のとおりです (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 に答える
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 に答える
2

まず第一に、この API の設計はひどいものです。ApiKey などの初期構成の #define プリプロセッサ ディレクティブ、ヘッダーの大量のスペースに依存しています...いくつかの問題について言及するだけです。

ここでバインド プロジェクトを見つけることができます。テストして、問題が解決するかどうか教えてください。

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


バインディングに APIKey が設定されていません。

SDK ヘッダー ファイル内に、XLXtifyOptions.hこれXLXtifyOptions.mXLXtifyOptionsクラスが Static 内に存在しないことを意味するXtifyPushため、両方のファイルを取得し、それらを少し変更して、libXtifyLibHelper.a.

このライブラリには 2 つのヘルパー objc メッセージが含まれてgetXtifyOptionsWithAppKey:locationRequired:backgroundLocationRequired:logging:multipleMarkets:manageBadge:おりgetXtifyOptionsWithAppKey:、API キーを正しく設定するのに役立ちます。

上記のヘルパーのいずれかを使用して API キーを設定してください。これらは XLXtifyOptions クラス内の静的メソッドとしてバインドされています。

libXtifyLibHelper.a補足として、提供されたプロジェクトをビルドすると、自動的に (TM) DLL 内に含まれるため、心配する必要はありません。

お役に立てれば

アレックス

于 2013-03-13T09:03:10.713 に答える