Monotouch 区分 iPad 3G 和 WiFi(检查 GPS)
Posted
技术标签:
【中文标题】Monotouch 区分 iPad 3G 和 WiFi(检查 GPS)【英文标题】:Monotouch Tell Difference Between iPad 3G and WiFi (Check for GPS) 【发布时间】:2012-01-19 14:22:17 【问题描述】:我目前有一些客观的 C 代码,用于识别 iPad 3G 和 iPad WiFi 之间的区别。奇怪的是,这两种型号都在设备代码 iPad1,1 下(iPad 2s 有三个不同的代码 iPad2,1 iPad2,2 和 iPad2,3,可以让您分辨出区别)。
所以我用来区分第一代 iPad 型号的代码使用以下代码检查是否存在 GPS 功能:
void *libHandle = dlopen(GRAPHICS_SERVICES_PATH, RTLD_LAZY);
int (*GSSystemHasCapability)(NSString *);
GSSystemHasCapability = dlsym(libHandle, "GSSystemHasCapability");
BOOL result = GSSystemHasCapability(@"gps");
dlclose(libHandle);
作为 Monotouch 的新手,我不确定如何移植它。有没有人有任何关于如何移植这个(或任何其他方式来区分)的指针?
【问题讨论】:
【参考方案1】:奇怪的是,这两种型号都在设备代码 iPad1,1 下(iPad 2s 有三个不同的代码 iPad2,1 iPad2,2 和 iPad2,3,可以让您分辨出区别)。
是的,在下载更新时,第一代 iPad 始终只有一个二进制文件。
因此,我用来区分 iPad 第一代机型的代码使用以下代码检查 GPS 功能是否存在:
警告,如果您希望您的应用程序在 AppStore 中可用,Apple 可能会拒绝上述 ObjectiveC 代码。那是因为您正在查看的功能是 私有 框架的一部分。
#define GRAPHICS_SERVICES_PATH "/System/Library/PrivateFrameworks/GraphicsServices.framework/GraphicsServices"
如果您想使用它(例如,非 AppStore 应用程序),那么您应该能够使用以下方法 p/invoke 到函数中:
using System.Runtime.InteropServices;
...
[DllImport ("/System/Library/PrivateFrameworks/GraphicsServices.framework/GraphicsServices")]
static extern bool GSSystemHasCapability (IntPtr value);
...
bool HasGPS ()
using (NSString gps = new NSString ("gps"))
return GSSystemHasCapability (gps.Handle);
更新 检测 GPS 的唯一(对 AppStore 有效)方法似乎是使用定位服务并查询其准确性。见:How can I tell if an ios device has a GPS?
【讨论】:
太棒了,谢谢。我知道这是一个私有框架,但迄今为止我已在四个 App Store 发布的应用程序中成功使用它,没有任何问题。我不建议其他人使用它,因为我知道它可能永远无法通过下一次批准,但在此之前它可以很好地满足我的需求!再次感谢。奥利 请注意,使用dlopen
、dlsym
和dlclose
可能会在 Apple 工具中隐藏符号(这使您可以通过 AppStore 检查)。 YMMV :)
有趣!你认为情况可能是这样吗?不要以为你能想出另一种方法来区分 3G 和 WiFi(没有这个框架?)
我用替代/链接更新了我的答案。它的优点是告诉您 GPS 当前是否可用(不仅仅是可用),这可能更有用(至少对于某些应用程序而言)。以上是关于Monotouch 区分 iPad 3G 和 WiFi(检查 GPS)的主要内容,如果未能解决你的问题,请参考以下文章
Monotouch - 在 monotouch 项目中附加 Sqlite 数据库并部署到 iPad
Monotouch - 带有 iPad 应用的 UIImagePickerController
Monotouch - UIActionSheet 无法在 iPad 上正确显示