为什么我的 NearbyMessages Objective-C 到 C# 绑定会在我调用 publish/subscribe 方法时抛出 NSInvalidArgumentException?
Why does my NearbyMessages Objective-C to C# binding throw an NSInvalidArgumentException when I call publish/subscribe methods?
我已经使用 Objective Sharpie 从 libGNSMessages.a 二进制文件和 header 为 Google's Nearby Messages API 生成了 semi-functional iOS C# 绑定s 在 NearbyMessages cocoapod 中。将该绑定库添加到 Xamarin.iOS 项目,我可以创建和访问 GMSMessage 和 GMSMessageManager objects。但是,当我尝试使用 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 header 文件中的方法签名):
// -(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));
}
... }
调试模式显示所有三个参数至少为 non-null。
这里是相同的异常:'NSConcreteMutableAttributedString initWithString:: nil value' when using Google Nearby Messages. However, that bug is allegedly fixed, and the up-to-date CocoaPods I used as the basis for the Sharpie binding work just fine when I build a test swift project in XCode, so my binding is probably the culprit. There's also an older binary C# NearbyMessages library included in NearbyMonkey 我试过使用,但它在当前 iOS 版本中崩溃。
感谢您花时间阅读到这里。非常感谢您提供的任何帮助或建议。
好的,几个月后我终于弄清楚出了什么问题。
Google Nearby pod 随 Resources 文件夹分发 - xcassets,一些本地化内容,所有显示相关 - 我没有包含在我的绑定项目中。当 Nearby 试图访问这些图像等以显示权限提示时,就会触发该错误。将这些资源复制到我的 Xamarin.iOS 项目修复了错误。
我已经使用 Objective Sharpie 从 libGNSMessages.a 二进制文件和 header 为 Google's Nearby Messages API 生成了 semi-functional iOS C# 绑定s 在 NearbyMessages cocoapod 中。将该绑定库添加到 Xamarin.iOS 项目,我可以创建和访问 GMSMessage 和 GMSMessageManager objects。但是,当我尝试使用 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 header 文件中的方法签名):
// -(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));
}
... }
调试模式显示所有三个参数至少为 non-null。
这里是相同的异常:'NSConcreteMutableAttributedString initWithString:: nil value' when using Google Nearby Messages. However, that bug is allegedly fixed, and the up-to-date CocoaPods I used as the basis for the Sharpie binding work just fine when I build a test swift project in XCode, so my binding is probably the culprit. There's also an older binary C# NearbyMessages library included in NearbyMonkey 我试过使用,但它在当前 iOS 版本中崩溃。
感谢您花时间阅读到这里。非常感谢您提供的任何帮助或建议。
好的,几个月后我终于弄清楚出了什么问题。
Google Nearby pod 随 Resources 文件夹分发 - xcassets,一些本地化内容,所有显示相关 - 我没有包含在我的绑定项目中。当 Nearby 试图访问这些图像等以显示权限提示时,就会触发该错误。将这些资源复制到我的 Xamarin.iOS 项目修复了错误。