我有一个供应商提供的.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
,结果是相同的。
我的绑定项目有什么问题会阻止本机框架库访问该位置?
答案 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挂在了怪异的状态。