17948


お世話になっております。  
現在Monacaで開発を進めており、  
Cordovaプラグインを利用してHealthKitから歩数を取得しようと考えました。  
[こちらのプラグイン](http://plugins.telerik.com/cordova/plugin/healthkit)を拝借し、  
Monacaへ下記のように組み込み実際に歩数を取得するところまで出来ました。  
そこで問題なのですが、この歩数…ヘルスケアアプリを開くまで更新されません。  
ヘルスケアアプリを開かなくても、アプリから命令を送り更新することはできないでしょうか？  
よろしくお願いいたします。

[code]

    var hk = null;
    var isHK = false;
    document.addEventListener("deviceready", function(){hk_init();}, false);
    
    /**
     * HealthKit Initialized and Support Check.
     **/
    function hk_init(){
        //モジュールが存在しない
        if(typeof window.plugins.healthkit === 'undefined' || window.plugins.healthkit == null){return false;}
        if(typeof hk === 'undefined' || hk == null){hk=window.plugins.healthkit;}
    
        hk.available(
            function(res){ if(res){ isHK=true; console.log("healthkit ready."); } },
            function(e){ console.log(e); }
        );
        return true;
    }
    
    /**
     * HealthKitへ歩数取得の権限を要求する
     **/
    function requestHealthKit(callback){
        window.plugins.healthkit.requestAuthorization(
            {'readTypes'  : ['HKQuantityTypeIdentifierStepCount']},
            callback,
            hk_error
        );
    }
    
    /**
     * 歩数を取得
     * @param start     Date        計測開始日
     * @param end       Date        計測終了日
     * @param callback  function    戻り値を受け取る関数
     **/
    function call_stepcount(start,end,callback){
        if(!isHK){ hk_noinit(); }
        if(typeof start === 'undefined'){ return false; }
        if(typeof end === 'undefined'){ end=new Date(); }
        if(typeof callback === 'undefined'){ callback=function(res){console.log(res);}; }
    
        window.plugins.healthkit.querySampleType(
            {
                'startDate' : start,
                'endDate'   : end,
                'sampleType': 'HKQuantityTypeIdentifierStepCount',
                'unit'      : 'count' // make sure this is compatible with the sampleType
            },
            callback,
            hk_error
        );
    }
    
    /**
     * HealthKitの返却値から歩数を累計する
     * @param Array 返却値
     * @return Integer 総歩数
     **/
    function analyze_step(res){
        var steps = 0;
        try{
            //分布分配列探査
            for(var n=0,len=res.length;n<len;n++){
                steps += res[n]["quantity"];
            }
            return steps;
        }catch(e){
            return 0;
        }
    }
    
    /**
     * 特定の1日の歩数を取得する
     * @param specific Date or String 指定日(Date型もしくは"yyyy/mm/dd"の文字列)
     * @param callback function 第一引数に歩数(INT)
     **/
    function oneday_steps(specific,callback){
        var start=null;
        if(typeof specific === 'object'){start=new Date(specific.getFullYear()+"/"+(specific.getMonth()+1)+"/"+specific.getDate());}
        else if(typeof specific === 'string'){start=new Date(specific);}
        else{callback(0);return;}
        //開始から24時間後を指定する
        var end=new Date(((start*1)+(24*60*60*1000)));
        call_stepcount(start,end,function(res){callback(analyze_step(res));});
    }
    
    /**
     * 本日の累計歩数を取得する
     * @param callback function 第一引数に歩数(INT)
     **/
    function today_steps(callback){
        var now=new Date();
        var start = new Date(now.getFullYear()+"/"+(now.getMonth()+1)+"/"+now.getDate());
        call_stepcount(start,now,function(res){callback(analyze_step(res));});
    }
    
    /**
     * 日曜日を週の始めとした今週の累計歩数を取得する
     * @param callback function 第一引数に歩数(INT)
     **/
    function week_steps(callback){
        var now=new Date();
        var start = new Date((new Date(now.getFullYear()+"/"+(now.getMonth()+1)+"/"+now.getDate())) - (now.getDay() * (24*60*60*1000)));
        call_stepcount(start,now,function(res){callback(analyze_step(res));});
    }
    
    /**
     * 今月の累計歩数を取得する
     * @param callback function 第一引数に歩数(INT)
     **/
    function month_steps(callback){
        var now=new Date();
        var start = new Date(now.getFullYear()+"/"+(now.getMonth()+1)+"/01");
        call_stepcount(start,now,function(res){callback(analyze_step(res));});
    }
    
    /**
     * 今年の累計歩数を取得する
     * @param callback function 第一引数に歩数(INT)
     **/
    function year_steps(callback){
        var now=new Date();
        var start = new Date(now.getFullYear()+"/01/01");
        call_stepcount(start,now,function(res){callback(analyze_step(res));});
    }
    
    /**
     * 全ての累計歩数を取得する
     * @param callback function 第一引数に歩数(INT)
     **/
    function all_steps(callback){
        var now=new Date();
        var start = new Date("1900/01/01");
        call_stepcount(start,now,function(res){callback(analyze_step(res));});
    }
    
    /**
     * HealthKitのエラーが発生した。
     * @param result Object エラーコールバックへ渡される引数
     **/
    function hk_error(result) {
        console.log("Error: \n" + JSON.stringify(result));
        requestHealthKit(function(ev){console.log(ev);});
        alert("HealthKitへのアクセスに失敗しました。\nこのアプリからのアクセスを許可されていない可能性があります。");
    };
    
    /**
     * HealthKit未初期化なので初期化しなおす
     **/
    function hk_noinit(){
        //再度、初期化かけて通知を表示
        hk_init();
        alert("HealthKitからの応答がありません。\n時間をおいて再度お試しください。");
    }
    
    /**
     * デバッグ関数
     **/
    function debug_hk(no){
        switch (no){
            case 0://昨日の歩数
                oneday_steps((new Date()-(24*60*60*1000)),hk_success);
                break;
            case 1://今日の歩数
                today_steps(hk_success);
                break;
            case 2://今週の歩数
                week_steps(hk_success);
                break;
            case 3://今月の歩数
                month_steps(hk_success);
                break;
            case 4://今年の歩数
                year_steps(hk_success);
                break;
            case 5://全ての歩数
                all_steps(hk_success);
                break;
        }
    }
    
    /**
     * デバッグ用、結果出力
     **/
    function hk_success(result) {
        console.log("success : " + result);
    };
    
[/code]


CC BY-SA 3.0
2015-10-16T04:12:18.227
17709
2020-09-04T14:25:13.727
question
ios monaca cordova health-kit
HealthKitから歩数を取得したい


自己解決いたしました。  
更新時にモニタリングする関数があり、  
モニタリング中の更新が発生した場合のコールバックにて呼び出すと更新できました。  
モニタリングを行わない場合、初回の呼び出しの値を保持し続けるので注意ですね。

[code]

    window.plugins.healthkit.monitorSampleType(
        {'sampleType': 'HKQuantityTypeIdentifierStepCount'},
        function(res){
            window.plugins.healthkit.querySampleType(
                {
                    'startDate' : start,
                    'endDate'   : end,
                    'sampleType': 'HKQuantityTypeIdentifierStepCount',
                    'unit'      : 'count'
                },
                callback,
                hk_error
            );
        },
        hk_error
    );
    
[/code]


CC BY-SA 3.0
2015-10-22T08:58:48.940
17948
2015-10-22T08:58:48.940
17709
answer