0

大きな問題があります。iOS 7.1 では、アプリが閉じている (バックグラウンドではなく、完全に閉じている) 場合でも、ビーコン領域の出入りを監視できます。

しかし、これはビーコン デリゲートがメイン コントローラーにある場合にのみ可能であり、他のコントローラーにある場合 (たとえば、モーダルな方法で呼び出された場合) には可能ではないことに気付きました。

たとえば、私のアプリは次のもので構築されています。

appDelegate --> firstController --> secondController

beaconManager とそのデリゲートを firstController に配置すると、アプリを閉じた状態でも呼び出されますが、2 番目のコントローラー (モーダル viewController として表示) で同じことを行うと、呼び出されません (フォアグラウンドまたはバックグラウンド)。

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

0

この問題に対処する一般的な方法は、AppDelegate を CLLocationManager デリゲートとして排他的に使用することです。AppDelegate のコールバック メソッドでは、特定の時点でアクティブな ViewController (存在する場合) を確認し、必要に応じてコールバック メソッドからその ViewController を呼び出します。

これを行うには、CoreLocation サービスを使用する各 ViewController の AppDelegate でプロパティを作成する必要があります。

@interface MyAppDelegate : UIResponder <CLLocationManagerDelegate>
@property (strong, nonatomic) FirstViewController *firstViewController;
@property (strong, nonatomic) SecondViewController *secondViewController;
@end

次に、ViewController が読み込まれるときに対応するプロパティを設定します。このような:

- (void)viewDidLoad
{
    [super viewDidLoad];
    MyAppDelegate *appDelegate = (MyAppDelegate *) [[UIApplication sharedApplication] delegate];
    appDelegate.firstViewController = self;
    ...
}

これが完了したら、コールバックを MyAppDelegate に排他的に登録できますが、次のように個々の ViewController に渡します。

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    if (self.firstViewController != Nil) {
        [self locationManager:manager didEnterRegion:region]; 
    }
}
于 2014-05-12T16:10:13.883 に答える
0

CLLocationManager を扱うときに私がやっていることは次のとおりです。

  • CLLocationManager コールバックのデリゲートとして機能するシングルトン パターンを実装するクラスを作成します。
  • 次に、特定のビュー コントローラーに転送するデリゲート メソッドを使用するプロトコルを作成します。
  • 必要なビュー コントローラーにプロトコル メソッドを実装します。
  • AppDelegate(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsメソッドで、初めてシングルトンをインスタンス化して、CLLocationManager と UUID が登録されるようにします
  • CLLocationManager からのコールバックが登録済みのビュー コントローラーの 1 つに到着すると、アプリが現在アクティブかどうかを確認し、それに応じてコールバックを処理します。

    UIApplicationState state = [application applicationState];
    if (state == UIApplicationStateActive) {
    // Application is in foreground
    }
    
于 2014-05-13T22:19:30.697 に答える