1

目前,我正在尝试为 Xamarin.iOS 项目绑定 Qualtrics 库,我做到了,但是当我运行项目时,应用程序崩溃了,它说

错误:“无法注册成员 'QualtricsIos.QualtricsSurveyViewController.UserContentController' 的选择器 'userContentController:didReceiveScriptMessage:',因为选择器已在成员 'DidReceiveScriptMessage' 上注册。

无法注册成员“QualtricsIos.QualtricsSurveyViewController..ctor”的选择器“initWithCoder:”,因为选择器已在成员“ConstructorCoder”上注册。

我已经尝试过类似于它的解决方案,但到目前为止还没有运气。我也检查了ApiDefinitionsStructsAndEnums我没有找到根本原因。谁能告诉我出了什么问题?

ApiDefinitions 文件:

namespace QualtricsLib
{
    // @interface InitializationResult : NSObject
    [BaseType(typeof(NSObject))]
    [Protocol]
    [DisableDefaultCtor]
    interface InitializationResult
    {
        // -(NSString * _Nullable)getMessage __attribute__((warn_unused_result));
        [NullAllowed, Export("getMessage")]

        string Message { get; }

        // -(BOOL)passed __attribute__((warn_unused_result));
        [Export("passed")]

        bool Passed { get; }
    }

// @interface Properties : NSObject
[BaseType(typeof(NSObject))]
[Protocol]
interface Properties
{
    // -(void)setStringWithString:(NSString * _Nonnull)string for:(NSString * _Nonnull)key;
    [Export("setStringWithString:for:")]
    void SetStringWithString(string @string, string key);

    // -(void)setNumberWithNumber:(double)number for:(NSString * _Nonnull)key;
    [Export("setNumberWithNumber:for:")]
    void SetNumberWithNumber(double number, string key);

    // -(void)setDateTimeFor:(NSString * _Nonnull)key;
    [Export("setDateTimeFor:")]
    void SetDateTimeFor(string key);
}

// @interface Qualtrics : NSObject
[BaseType(typeof(NSObject))]
[Protocol]
[DisableDefaultCtor]
interface Qualtrics
{
    // @property (readonly, nonatomic, strong, class) Qualtrics * _Nonnull shared;
    [Static]
    [Export("shared", ArgumentSemantic.Strong)]
    Qualtrics Shared { get; }

    // @property (readonly, nonatomic, strong) Properties * _Nonnull properties;
    [Export("properties", ArgumentSemantic.Strong)]
    Properties Properties { get; }

    // -(void)initializeWithBrandId:(NSString * _Nonnull)brandId zoneId:(NSString * _Nonnull)zoneId interceptId:(NSString * _Nonnull)interceptId completion:(void (^ _Nullable)(InitializationResult * _Nonnull))completion;
    [Export("initializeWithBrandId:zoneId:interceptId:completion:")]
    void InitializeWithBrandId(string brandId, string zoneId, string interceptId, [NullAllowed] Action<InitializationResult> completion);

    //-(void) evaluateTargetingLogicWithCompletion:(void (^ _Nonnull)(TargetingResult* _Nonnull))completion;
    [Export("evaluateTargetingLogicWithCompletion:")]
    void EvaluateTargetingLogicWithCompletion(Action<TargetingResultNew> completion);

    // -(BOOL)handleLocalNotificationWithResponse:(UNNotificationResponse * _Nonnull)response displayOn:(UIViewController * _Nonnull)viewController __attribute__((availability(ios, introduced=10.0))) __attribute__((warn_unused_result));
    //[iOS(10, 0)]
    [Export("handleLocalNotificationWithResponse:displayOn:")]
    bool HandleLocalNotificationWithResponse(UNNotificationResponse response, UIViewController viewController);

    // -(BOOL)handleLocalNotification:(UILocalNotification * _Nonnull)notification displayOn:(UIViewController * _Nonnull)viewController __attribute__((warn_unused_result));
    [Export("handleLocalNotification:displayOn:")]
    bool HandleLocalNotification(UILocalNotification notification, UIViewController viewController);

    // -(BOOL)displayWithViewController:(UIViewController * _Nonnull)viewController __attribute__((warn_unused_result));
    [Export("displayWithViewController:")]
    bool DisplayWithViewController(UIViewController viewController);

    // -(void)displayTargetWithTargetViewController:(UIViewController * _Nonnull)targetViewController targetUrl:(NSString * _Nonnull)targetUrl;
    [Export("displayTargetWithTargetViewController:targetUrl:")]
    void DisplayTargetWithTargetViewController(UIViewController targetViewController, string targetUrl);

    // -(BOOL)hide __attribute__((warn_unused_result));
    [Export("hide")]
    bool Hide { get; }

    // -(void)registerViewVisitWithViewName:(NSString * _Nonnull)viewName;
    [Export("registerViewVisitWithViewName:")]
    void RegisterViewVisitWithViewName(string viewName);

    // -(void)resetTimer;
    [Export("resetTimer")]
    void ResetTimer();

    // -(void)resetViewCounter;
    [Export("resetViewCounter")]
    void ResetViewCounter();
}

//@interface QualtricsSurveyViewController : UIViewController<WKScriptMessageHandler>
[BaseType(typeof(UIViewController))]
[Protocol]
[DisableDefaultCtor]
interface QualtricsSurveyViewController : IWKScriptMessageHandler
{
    // -(instancetype _Nonnull)initWithUrl:(NSString * _Nonnull)url __attribute__((objc_designated_initializer));
    [Export("initWithUrl:")]
    [DesignatedInitializer]
    IntPtr Constructor(string url);

    // -(instancetype _Nullable)initWithCoder:(NSCoder * _Nonnull)aDecoder __attribute__((objc_designated_initializer));

    [Export("initWithCoder:")]
    [DesignatedInitializer]
    //[Static]
    IntPtr ConstructorCoder(NSCoder aDecoder);

    // -(void)viewDidAppear:(BOOL)animated;
    [Export("viewDidAppear:")]
    void ViewDidAppear(bool animated);

    // -(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator> _Nonnull)coordinator;
    [Export("viewWillTransitionToSize:withTransitionCoordinator:")]
    void ViewWillTransitionToSize(CGSize size, IUIViewControllerTransitionCoordinator coordinator);

    // -(void)userContentController:(WKUserContentController * _Nonnull)userContentController didReceiveScriptMessage:(WKScriptMessage * _Nonnull)message;
    [Export("userContentController:didReceiveScriptMessage:")]
    //[Static]
    void UserContentController(WKUserContentController userContentController, WKScriptMessage message);
}

// @interface TargetingResult : NSObject
[BaseType(typeof(NSObject))]
[Protocol]
[DisableDefaultCtor]
interface TargetingResultNew
{
    // -(NSString * _Nullable)getSurveyUrl __attribute__((warn_unused_result));
    [NullAllowed, Export("getSurveyUrl")]

    string SurveyUrl { get; }

    // -(enum targetingResultStatus)getTargetingResult __attribute__((warn_unused_result));
    [Export("getTargetingResult")]

    TargetingResultStatus TargetingResult { get; }

    // -(BOOL)passed __attribute__((warn_unused_result));
    [Export("passed")]

    bool Passed { get; }

    // -(TargetingResultError * _Nullable)getError __attribute__((warn_unused_result));
    [NullAllowed, Export("getError")]

    TargetingResultError Error { get; }

    // -(void)recordImpression;
    [Export("recordImpression")]
    void RecordImpression();

    // -(void)recordClick;
    [Export("recordClick")]
    void RecordClick();
}

// @interface TargetingResultError : NSObject
[BaseType(typeof(NSObject))]
[Protocol]
[DisableDefaultCtor]
interface TargetingResultError
{
}

}

StructsAndEnums 文件:

namespace QualtricsLib
{
    [Native]
    public enum TargetingResultStatus : long
    {
        Passed = 0,
        FailedLogic = 1,
        SampledOut = 2,
        MultipleDisplayPrevented = 3,
        Error = 4
    }
}
4

1 回答 1

2

我通过删除initWithCoder方法QualtricsSurveyViewController并删除继承来解决了这个问题。此选项修复了选择器问题,但在运行应用程序时会抛出未设置为对象异常实例的对象引用。

我查看了头文件,并在头文件中找到了SWIFT_CLASS名称,例如

SWIFT_CLASS("_TtC9Qualtrics29QualtricsSurveyViewController")

所以,我对ApiDefinitions文件应用了同样的东西

[BaseType(typeof(UIViewController), Name = "_TtC9Qualtrics29QualtricsSurveyViewController")]

还有宾果!!这是工作!!!

该解决方案解决了我的所有问题,并且绑定库成功运行。

于 2019-05-07T04:53:19.840 回答