0

我使用 Objective Sharpie 为Google 的 Nearby Messages API从 libGNSMessages.a 二进制文件和 NearbyMessages cocoapod 中的标头生成了一个半功能的 iOS C# 绑定。将该绑定库添加到 Xamarin.iOS 项目,我可以创建和访问 GMSMessage 和 GMSMessageManager 对象。但是,当我尝试使用 GMSMessageManager.publishWithMessage() 时,我得到了这个异常,即使我使用了正确的参数类型:

Foundation.MonoTouchException: Objective-C exception thrown.  
Name: NSInvalidArgumentException 
Reason: NSConcreteMutableAttributedString initWithString:: nil value

这是我在 AppDelegate.cs 的 FinishedLaunching 方法中使用的测试代码(我检查过,管理器和消息都是它们类型的有效实例):

  GNSMessageManager manager = new GNSMessageManager(apiKey);
  GNSMessage message = GNSMessage.MessageWithContent(NSData.FromString("Hello"));
  GNSPublication pub = manager.PublicationWithMessage(message);

这是它所引用的 Visual Studio 绑定项目中 ApiDefinitions.cs 的绑定(注释是原始 Objective-C 头文件中的方法签名):

    // -(id<GNSPublication>)publicationWithMessage:(GNSMessage *)message;
    [Export ("publicationWithMessage:")]
    GNSPublication PublicationWithMessage (GNSMessage message);

这是引发异常的 GNSMessageManager.g.cs (由该 Visual Studio 项目生成)中的代码:

    public virtual GNSPublication PublicationWithMessage (GNSMessage message)
    { ...
        if (IsDirectBinding) {
            return  Runtime.GetNSObject<GNSPublication> (global::ApiDefinitions.Messaging.IntPtr_objc_msgSend_IntPtr (this.Handle, Selector.GetHandle ("publicationWithMessage:"), message.Handle));
        }
    ... }

调试模式显示所有这三个参数至少是非空的。

这里有同样的例外:'NSConcreteMutableAttributedString initWithString:: nil value' when using Google Nearby Messages。但是,据称该错误已修复,当我在 XCode 中构建测试 swift 项目时,我用作 Sharpie 绑定基础的最新 CocoaPods 工作得很好,所以我的绑定可能是罪魁祸首。我尝试使用的NearbyMonkey中还包含一个较旧的二进制 C# NearbyMessages 库,但它在当前 iOS 版本中崩溃。

感谢您抽出宝贵时间阅读本文。您可以提供的任何帮助或建议将不胜感激。

4

1 回答 1

0

好的,几个月后我终于弄清楚出了什么问题。

Google Nearby pod 与 Resources 文件夹一起分发 - xcassets,一些本地化内容,所有显示相关 - 我没有包含在我的绑定项目中。当 Nearby 尝试访问这些图像等以显示权限提示时,触发了该错误。将这些资源复制到我的 Xamarin.iOS 项目修复了错误。

于 2019-02-27T23:02:00.257 回答