3

私は電話する必要があります

[[MKLocationManager sharedLocationManager] _applyChinaLocationShift:newLocation]

私のiOSアプリで。

はプライベート クラスだと思いMKLocationManagerますが、MapKit/MKLocationManager.h ファイルがないようです。

私は App Store を対象としていません。そのプライベート API を使用する方法はありますか?

2011 年 6 月 23 日の更新

本当に答えが必要ですか、それとも iOS SDK の準拠を解除できますか?

100の評判は私が持っているほとんどすべてです。私を助けてください。

4

2 に答える 2

10

上記の回答がうまくいかない場合は、クラス全体がプライベート (ヘッダーを含む) である可能性があります。これは、実行時のトリックを使用した別のアプローチです。署名が正しいことを確認する必要がありますが、防御的なコーディングを使用してクラッシュを回避できます。

まず、これを 1 回だけ呼び出す場合を除き、コードをヘルパー メソッドにまとめます。

// 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 のすぐ上の 1 か所でのみ使用する場合にも使用できます。

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