6

次のコードを使用して、iOS アプリでリージョンを監視しています。iOS6でアプリをビルドすると完全に機能します。iOS7 でビルドすると、didEnterRegion がトリガーされません。

// リージョンを作成して iOS に登録する

CLLocationCoordinate2D venueCenter = CLLocationCoordinate2DMake([favoriteVenue.venueLat      doubleValue], [favoriteVenue.venueLng doubleValue]);
CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:venueCenter radius:REGION_RADIUS identifier:favoriteVenue.venueId];

AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
[appDelegate.locationManager startMonitoringForRegion:[self regionForVenue:favoriteVenue]];

// AppDelegate.m 内

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    NSLog(@"Entered region: %@", region.identifier);
}

また、必要なバックグラウンド モードを、plist ファイルで「アプリが位置情報の更新に登録する」として設定しました。

この機能が iOS7 で動作するために何が欠けているかについてのアイデアはありますか?

ありがとう!

4

1 に答える 1

0

iOS 6 と 7 の両方で機能する必要があるCLLocationManagerDelegateのは、リージョンの監視を開始するように指示するプロトコルに準拠するクラス内にパブリック メソッドを作成することです。例えば:

//LocationManagerClass.h

@interface LocationManagerClass : NSObject

      {... other stuff in the interface file}

- (void)beginMonitoringRegion:(CLRegion *)region;

@end

そして、

//LocationManagerClass.m

@interface LocationManagerClass () <CLLocationManagerDelegate>
@end

@implementation LocationManagerClass

     {... other important stuff like locationManager:didEnterRegion:}

- (void)beginMonitoringRegion:(CLRegion *)region
{
    [[CLLocationManager sharedManager] startMonitoringForRegion:region];
}

@end

だからあなたの場合、あなたは電話するでしょう[appDelegate beginMonitoringRegion:region];

余談ですが、位置情報管理コードをアプリ デリゲートに配置しないことをお勧めします。技術的には機能しますが、一般的にこのようなものには適したデザイン パターンではありません。代わりに、上記の例のように、おそらくシングルトンになる独自のロケーション マネージャー クラスに配置してみます。このブログ投稿は、アプリの委任に大量のものを入れない理由について、いくつかの良いサポートを提供します: http://www.hollance.com/2012/02/dont-abuse-the-app-delegate/

于 2014-01-18T00:21:14.373 に答える