24

アプリケーションが (バックグラウンドではなく) 強制終了されたときに、iOS で地理ベースのプッシュ通知を利用することは可能ですか?

ユーザーが地図上の位置を選択するアプリの構築に興味があります。たとえば、ユーザーがそのエリアに近い場合、ローカルの地理ベースのプッシュ通知がトリガーされます。

しかし、この「アイデア」は可能ですか?アプリが強制終了されたときに GPS を実行して座標を比較し、配置されているときにユーザーに通知できますか? 私が読むことができる主題に関するあらゆる種類のチュートリアル/記事/詳細情報はありますか?

私がオンラインで読んだ情報のほとんどは、問題について具体的なことは何もなくても、実装の一般的なアイデアのようなものでした.

4

1 に答える 1

34

アプリが実行されていない (つまり、以前に終了された) ユーザーの位置を追跡するには、次の 2 つのオプションがあります。

  1. 「ユーザーの位置を追跡する」の下のiOS アプリ プログラミング ガイドから:

    大幅な位置情報サービスは、高精度の位置データを必要としないアプリに強くお勧めします。このサービスでは、ユーザーの場所が大幅に変更された場合にのみ、場所の更新が生成されます。したがって、ソーシャル アプリや、ユーザーに重要ではない場所に関連する情報を提供するアプリに最適です。更新が発生したときにアプリが中断された場合、システムは更新を処理するためにバックグラウンドでアプリを起動します。アプリがこのサービスを開始して終了した場合、新しい場所が利用可能になると、システムはアプリを自動的に再起動します。このサービスは iOS 4 以降で利用でき、セルラー無線を搭載したデバイスでのみ利用できます。

    ただし、CLLocationManager クラス リファレンスによると、あまり正確ではなく、更新も頻繁ではありません。

    注: アプリは、デバイスが前回の通知から 500 メートル以上移動するとすぐに通知を受け取ることができます。5 分に 1 回以上の頻度で通知を期待するべきではありません。デバイスがネットワークからデータを取得できる場合、ロケーション マネージャーはタイムリーに通知を配信する可能性が高くなります。

  2. リージョン モニタリングは、終了後にアプリを再起動するなど、同様の方法で機能しますが、より高い精度で動作します (Wifi ネットワークとセル タワーの可用性によって異なります)。

    特定のしきい値距離は、現在利用可能なハードウェアとロケーション テクノロジによって決まります。たとえば、Wi-Fi が無効になっていると、地域の監視の精度が大幅に低下します。ただし、テスト目的で、最小距離は約 200 メートルであると想定できます。

    リージョン モニタリングに関するもう 1 つの考慮事項は、( CLLocationManager クラス リファレンスによると) リージョンのエントリと終了の通知は、リージョンの境界を越えてから 3 ~ 5 分程度しか受信されない可能性があることです。

    実際の要件に応じて、地域モニタリングを使用して「大まかな」位置を取得し、ユーザーが特定の地域内にいるときに、より正確な GPS ベースのサービスをロケーション マネージャーで開始することができます。ユーザーが関心のある地域を離れたら、GPS サービスをオフにしてバッテリーを節約し、大まかな位置監視サービス (つまり、地域監視) にもう一度戻ります。基本的な実装は次のとおりです。

    SomeViewController.m :

    ...
    @interface SomeViewController () <CLLocationManagerDelegate>
    
    @property (nonatomic, strong) CLLocationManager *locationManager;
    @property (nonatomic, strong) CLRegion *someRegion;
    
    @end
    
    @implementation SomeViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        self.locationManager = [[CLLocationManager alloc] init];
    
        CLLocationDistance radius = 10; // 10 metre sensitivity
        self.someRegion = [[CLRegion alloc] initCircularRegionWithCenter:someCoordinates radius:radius identifier:@"Smithtown Dry Cleaners"];
    
        self.locationManager.delegate = self;
        [self.locationManager startMonitoringForRegion:self.someRegion];
    
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        self.locationManager.distanceFilter = 10;
        [self.locationManager startUpdatingLocation];
    }
    
    - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
    {
        [self.locationManager startUpdatingLocation];
    }
    
    - (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
    {
        [self.locationManager stopUpdatingLocation];
    }
    
    // Delegate method from the CLLocationManagerDelegate protocol.
    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    {
        CLLocation* location = [locations lastObject];
    
        // If the user's current location is not within the region anymore, stop updating
        if ([self.someRegion containsCoordinate:location.coordinate] == NO) {
            [self.locationManager stopUpdatingLocation];
        }
    
        NSString *locationData = [NSString stringWithFormat:@"latitude %+.6f, longitude %+.6f\n",
                                  location.coordinate.latitude,
                                  location.coordinate.longitude];
        NSLog(@"%@", locationData);
    
        UILocalNotification *localNotification = [[UILocalNotification alloc] init];
        localNotification.alertBody = locationData;
        localNotification.alertAction = @"Location data received";
        localNotification.hasAction = YES;
        [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
    }
    

    アプリが適切なリソースにアクセスしてバックグラウンドで実行されるように、アプリの plist ファイルに適切なエントリを追加することを忘れないでください。

    MyApp-Info.plist :

    <key>UIBackgroundModes</key>
    <array>
            ...
            <string>location</string>
    </array>
    <key>UIRequiredDeviceCapabilities</key>
    <array>
            ...
            <string>location-services</string>
            <string>gps</string>
    </array>
    

    上記のコードは、iOS6 と ARC の使用を前提としています

于 2013-03-23T22:08:06.200 に答える