【问题标题】:Xamarin iOS Library can't get locationXamarin iOS 库无法获取位置
【发布时间】:2019-07-31 13:43:54
【问题描述】:

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

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

var location = await Geolocation.GetLastKnownLocationAsync();

这将返回我在模拟器和真实 iPhone 上的位置。我可以在 Privacy-> Location Services 菜单中看到我的应用已获得访问权限。

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

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

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

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

【问题讨论】:

  • 也许,您的供应商 iOS 框架实际上是在使用另一个库/框架来访问位置数据?如果是这种情况,则必须将此依赖项添加到您的绑定项目中作为参考。在 iOS 中,依赖项没有嵌入到 .Framework 存档中
  • 他们的示例项目只是将 Static.framework 和 AlamoFire.framework 链接/嵌入到他们的项目中。两者都用于编写示例代码。

标签: xamarin xamarin.ios stripe-payments


【解决方案1】:

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

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

阅读更多文档,我发现CLLocationManager 只能从活动的运行循环中成功创建。将调用包装到 NSRunLoop.Main.InvokeOnMainThread 中的 Stripe 终端 iOS SDK 允许事情在创建 CLLocationManager 时工作,期望调用处于活动运行循环中,而无需先检查或记录该行为。 Stripe 的内部代码等待回调,但从未发生过,因此使 SDK 处于奇怪的状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2015-03-05
    • 2014-09-03
    相关资源
    最近更新 更多