2017-12-08 4 views
0

Cordova iOSプロジェクトで中央のブルートゥースを初期化しようとしています。プラグインはthis githubです。私のコードは以下のようになります。デバッグモードでリフレッシュしない限り、ソースを正しく読み込むことができません。Cordova iOSプロジェクト

-www

index.js

​​

/ServiceS/BLEService.js

function initializeSuccess(result) { 

    if (result.status === "enabled") { 

     log("Bluetooth is enabled."); 
     log(result); 
    } 

    else { 

     document.getElementById("start-scan").disabled = true; 

     log("Bluetooth is not enabled:", "status"); 
     log(result, "status"); 
    } 
} 

function handleError(error) { 

    var msg; 

    if (error.error && error.message) { 

     var errorItems = []; 

     if (error.service) { 

      errorItems.push("service: " + (uuids[error.service] || error.service)); 
     } 

     if (error.characteristic) { 

      errorItems.push("characteristic: " + (uuids[error.characteristic] || error.characteristic)); 
     } 

     msg = "Error on " + error.error + ": " + error.message + (errorItems.length && (" (" + errorItems.join(", ") + ")")); 
    } 

    else { 

     msg = error; 
    } 

    log(msg, "error"); 

    if (error.error === "read" && error.service && error.characteristic) { 

     reportValue(error.service, error.characteristic, "Error: " + error.message); 
    } 
} 

function log(msg, level) { 

    level = level || "log"; 

    if (typeof msg === "object") { 

     msg = JSON.stringify(msg, null, " "); 
    } 

    console.log(msg); 

    if (level === "status" || level === "error") { 

     var msgDiv = document.createElement("div"); 
     msgDiv.textContent = msg; 

     if (level === "error") { 

      msgDiv.style.color = "red"; 
     } 

     msgDiv.style.padding = "5px 0"; 
     msgDiv.style.borderBottom = "rgb(192,192,192) solid 1px"; 
     document.getElementById("output").appendChild(msgDiv); 
    } 
} 

とのindex.html

<html> 
    <head> 
     <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; img-src 'self' data: content:;"> 
     <meta name="format-detection" content="telephone=no"> 
     <meta name="msapplication-tap-highlight" content="no"> 
     <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width"> 
     <link rel="stylesheet" type="text/css" href="css/index.css"> 
     <title>Hello World</title> 
    </head> 
    <body> 

     <div class="app"> 
      <h1>Apache Cordova</h1> 
      <div id="deviceready" class="blink"> 
       <p class="event listening">Connecting to Device</p> 
       <p class="event received">Device is Ready</p>     
      </div> 
      <p id="output"></p> 
     </div> 
     <script type="text/javascript" src="cordova.js"></script> 
     <script type="text/javascript" src="js/Services/BLEService.js"></script> 
     <script type="text/javascript" src="js/index.js"></script> 
    </body> 
</html> 

基本的にここのすべてがjuですstはスタートアップコードをCordova hellowordから取得し、そのブルートゥースプラグインのgithubから取得します。私はXCodeでプロジェクトを構築しようとしましたが、これまでのところすべて正常に動作します。デバイスのビルドと実行にエラーはありません。

私の電話で直接プロジェクトを実行すると、初期化の成功または失敗のいずれの応答もありません。私はxcodeでの出力のメッセージが "受け取ったイベント:deviceready"を示しています。だから私はそれがちょうど "約束" JavaScriptの仕事の一部ではないと思う。私はサファリからデバッガをリンクし、その上に開発者ツールを使用します。私が手動で更新をクリックすると、次にアプリケーションが電話で再読み込みされるまでに、出力に「Bluetoothが有効になっています」と{「ステータス」:「有効になっています」}と表示されます。

しかし、私は約束のすべての機能が初めて読み込まれない理由を知りません。誰かがそれについて何か手掛かりを持っていますか?

答えて

0

いいえ。私はこのプラグインの.m部分を実際に理解してこの全部を終わらせます。 cordova-plugin-bluetoothのgithubで2017/12/11まで、BluetoothLePlugin.m行664を調べると、最初にcentralManagerを初期化するときに、初めて初期化するときに有効か無効かが返されません。あなただけがそれをもう一度思い出して、あなたは "有効"なフィードバックを見ることができます。したがって、index.jsのコードを次のように変更しました。

document.addEventListener('deviceready', function() { 
      //the reason following function be called twice is, the plugin is designed like this 
      //(check BluetoothLePlugin.m line 664 and after) 
      //first time this function will intialize the centralManager, but will not check whether it is enabled or not 
      new Promise(function (resolve) { 
         bluetoothle.initialize(resolve, { request: true, statusReceiver: false }); 
         }).then(initializeSuccess, handleError); 
      //for the second time it will check if it's enabled or not 
      new Promise(function (resolve) { 
         bluetoothle.initialize(resolve, { request: true, statusReceiver: false }); 
         }).then(initializeSuccess, handleError); 
      }); 

これは私が期待したとおりに動作します。私は、この奇妙な解決策が私の誤解や何かによるものかどうかを知るために、この興味深い「機能」を著者に報告することを検討しています。

関連する問題