3

我需要打电话

[[MKLocationManager sharedLocationManager] _applyChinaLocationShift:newLocation]

在我的 iOS 应用程序中。

我相信MKLocationManager是一个私有类,似乎没有 MapKit/MKLocationManager.h 文件。

我不是针对 App Store。有什么办法可以使用该私有 API?

更新于 2011-6-23

我真的需要答案,还是我可以反编译iOS SDK?

100声望几乎是我的全部。请帮我。

4

2 回答 2

10

如果上述答案对您不起作用,这可能是因为整个类都是私有的(包括它的标题)。这是使用一些运行时技巧的替代方法;您必须确保签名正确,但我们可以使用一些防御性编码来避免崩溃。

首先,除非您只调用一次,否则我会将代码包装在一个辅助方法中:

// in some header file, you may want to give the method a prefix too
CLLocation *ApplyLocationManagerChinaLocationShift(CLLocation *newLocation);

您现在可以使用NSClassFromString来获取对类的引用并performSelector执行该方法。为了安全起见,我们可以尝试确保该方法首先存在:

CLLocation *ApplyLocationManagerChinaLocationShift(CLLocation *newLocation)
{
  id sharedLocationManager = [NSClassFromString(@"MKLocationManager") performSelector:@selector(sharedLocationManager)];

  SEL theSelector = @selector(_applyChinaLocationShift:);

  // this will ensure sharedLocationManager is non-nil and responds appropriately
  if (![sharedLocationManager respondsToSelector:theSelector]) {
    return nil; // fail silently - check this in the caller
  }
  return [sharedLocationManager performSelector:theSelector withObject:newLocation];
}

我没有运行上面的代码,但它应该可以解决问题。如果由于某种原因@selector()调用不起作用(我认为它们应该),那么您可以用NSSelectorFromString()调用替换它们。

于 2011-06-22T23:41:30.543 回答
1

您可以简单地自己创建方法描述,本质上是在 MKLocationManager 上创建自己的类别。通过定义私有方法的外观,您可以使其可调用。但是您必须确定它的签名,因为如果您关闭,那么您的应用程序就会崩溃。

这个类别可以放在它自己的 .h 文件中,或者如果你只在@implementation 正上方的一个地方使用它。

@interface MKLocationManager (china)
- (CLLocation *)_applyChinaLocationShift:(CLLocation *)newLocation;
@end
于 2011-06-19T09:45:31.063 回答