web-dev-qa-db-ja.com

コルドバアプリのバックグラウンドでのGPS座標

私は現在、ionic/cordovaを使用してハイブリッドアプリを実行しています。アプリには、1分程度ごとにバックエンドにその場所をpingする機能が必要です。バックエンドAPIは、何か面白いものが近くにある場合に応答します。答えが「はい」の場合、アプリはローカル通知をキューに入れ、ユーザーがアプリを開くようにします。この機能は、アプリがバックグラウンドモードの場合、および電話がロックされている場合でも必要です。アプリは、アプリストア、Google Play、そして最終的にはWindowsPhoneの両方にデプロイできる必要があります。

私は現在、これら3つのプラグインを組み合わせて使用​​しています。

https://www.npmjs.com/package/cordova-plugin-geolocation -場所の場合 https://github.com/katzer/cordova-plugin-background-mode = --bgモードの場合 https://github.com/katzer/cordova-plugin-local-notifications -ローカル通知の場合

これは現在Androidデバイスがロックされていない場合(フォアグラウンドモードとバックグラウンドモードで機能します)で機能しますが、デバイスがロックされている場合はGPS座標を取得できません。

私のコードは現在次のようになっています:

        // Enable background worker          
        (cordova as any).plugins.backgroundMode.enable();

   intervalPromise = $interval(intervalWork, 30000, 0, false);

    function intervalWork() {
        $log.log('Trying to fetch pos');

        var options = { maximumAge: 30000, timeout: 30000, enableHighAccuracy: false };

        navigator.geolocation.getCurrentPosition(success,
            err,
            options);
    }

    function success(pos) {
        $log.log("lat: " + pos.coords.latitude + " long: " + pos.coords.longitude);

        var Checkin = $resource(ApiDataEndpoint.url + 'checkin/:lat/:lng/', {});

        var res= Checkin.get({ lat: pos.coords.latitude, lng: pos.coords.longitude });

               if (res) { 

                $cordovaLocalNotification.schedule({
                    id: 1,
                    title: 'test',
                    text: 'test',
                }).then(function(result) {
                    $log.log("ok");
                });
            };
         }

だから...私の質問は:

1)デバイスがロックされているときにソリューションを機能させる方法(デバイスがロックされている場合でもgetCurrentPositionが呼び出されますが、タイムアウトが返されます)?

2)このソリューションをiOSで動作させることは可能ですか?

3)この方法で作成されたアプリは、Google PlayおよびApp Storeで承認されますか?

4)プロジェクトが運命づけられている場合、私の代替案は何ですか?

私は本当にこれについて助けが必要です!

11
iCediCe

だから私は現在あなたが上にリストしたすべての問題に対処するアプリを持っています、そしてここに私が使っているプラ​​グインがあります:

https://github.com/mauron85/cordova-plugin-background-geolocation

  1. プラグインは、getCurrentPosition()ではなくwatchPosition()を使用します。これは、デバイスに常にpingを実行するには時間がかかりすぎ、より多くのバッテリー電力を消費するためです。

  2. これは間違いなくAndroid&iOSで機能しますが、精度とキープアライブ機能に関しては、後者よりもAndroidでうまく機能します。

  3. 私はそれをGooglePlayに問題なく入れました、Appleはこのプラグインを許可します、Appleストアにこのプラグインを使用しているアプリがたくさんありますが、Appleはおそらく最初はそれを拒否し、アプリにバックグラウンドでの使用の意図を尋ねます。その後、アプリがバックグラウンドで何をしているのかをアピールし、無期限に実行されないようにする必要があります(これは私の経験でした)。

    a。また、Appleは、ユーザーがバックグラウンドジオロケーショントラッキングをオフにする方法があることを確認していることを確認する必要があります。あると思いますか?それはプラグインの使用に関する主な問題。

幸運を。

11
Faraji Anderson

このプラグインには、meteorサーバーとcordovaを使用して必要なことを実行する方法に関する優れたガイドがあります。

zeroasterisk/meteor-cordova-geolocation-background

AndroidとiOSの両方で自動的に構成されます。WindowsPhoneの場合はわかりません。

  1. MeteorはCordovaでこのプラグインを構成します(構成する必要があります)
  2. MeteorはCordovaでこのプラグインを構成します(構成する必要があります)
  3. Meteorは、バックグラウンドサービスをトリガーして、ジオロケーション(GPS)の詳細を取得できます。
  4. Cordovaバックグラウンドサービスは、データをMeteorサーバーに定期的にPOSTします(クライアントのCordovaインスタンスには送信しません)。
  5. Meteorサーバーはコレクション(またはその他のもの)を更新できます
  6. Meteorクライアントはサーバーと同期します
2
Mark Ryan

使用したのと同じプラグインを使用して、まったく同じ問題が発生しました。それはデバイスのアクセス許可の問題であることが判明しました。

Cordova-plugin-geolocationプラグインにはバックグラウンドで実行する権限がなく、さらに重要なことに、バックグラウンドでGPSを追跡する権限がありません。 cordova-plugin-background-modeプラグインを使用すると、バックグラウンドでコードを実行できますが、バックグラウンドでGPS座標を取得することはできません。

解決策は、アプリがバックグラウンドにあるときに位置データの取得をサポートするプラグインを追加することですmauron85/cordova-plugin-background-geolocation プラグイン(前述のとおり)など、これをサポートするプラグインがいくつかあります。別の方法は、独自のカスタム権限を指定できる cordova-custom-config プラグインを使用することです。 バックグラウンドロケーションサービスをサポートしている限り、実際には任意のプラグインを追加できます。追加のコードは必要ありません。

(iOSで)アプリの設定を開き、[常に]オプションが使用可能であることを確認することで、正しい権限があることを確認できます。

enter image description here

2
attila226