Xamarin iOS库无法获取位置

时间:2019-07-31 13:43:54

标签: xamarin xamarin.ios stripe-payments

我有一个供应商提供的.framework文件,我创建了一个用于使用Objective Sharpie的iOS绑定项目。我可以调用该库,获取回调,提取数据,除了可以访问当前位置的库之外,几乎所有东西都可以工作。该项目的公共标头位于StripeTerminal

在C#代码中,我使用Xamarin.Essentials提取当前位置。

var location = await Geolocation.GetLastKnownLocationAsync();

这将返回我在模拟器和真实iPhone中的位置。我可以在“隐私”->“位置服务”菜单中看到已授予我的应用访问权限。

我的info.plist文件中包含以下内容,我尝试将其定位为9.0 SDK和12.0 SDK。

<key>NSLocationWhenInUseUsageDescription</key>
<string>Location required for accepting payments.</string>

在供应商提供的示例XCode项目中,该项目能够通过检查其详细日志来提取位置。在Xamarin应用程序中,他们的日志卡在requestLocation上,并且永远不会过去。我什至尝试将Link选项设置为Don't Link,结果是相同的。

我的绑定项目有什么问题会阻止本机框架库访问该位置?

1 个答案:

答案 0 :(得分:0)

问题是Xamarin和iOS的混合使用。我在C#代码中创建了一个CLLocationManager对象,并为位置更改设置了侦听器,但该方法从未起作用。因此,我尝试使用Xamarin.Essentials软件包GetLastKnownLocationAsync来获取当前位置,并且每次都能使用,因此这不是权限问题或模拟器问题。深入研究Xamarin.Essentials代码,我发现了以下内容。

NSRunLoop.Main.InvokeOnMainThread(() => manager = new CLLocationManager());

通过阅读更多文档,我发现CLLocationManager仅可以从活动运行循环中成功创建。将调用包装到NSRunLoop.Main.InvokeOnMainThread中的Stripe Terminal iOS SDK中可以使工作正常,因为它们正在创建CLLocationManager时期望该调用处于活动运行循环中,而无需先检查或记录该行为。 Stripe的内部代码等待回调,但从未发生,因此将SDK挂在了怪异的状态。