2012-11-02 30 views
10

Tôi đang xây dựng một Ứng dụng PhoneGap. Thật không may, khi triển khai các thiết bị iOS và mô phỏng sự kiện deviceready sẽ không bao giờ xảy ra. Tôi đang sử dụng Phonegap 2.2.0.Phonegap deviceready không kích hoạt bằng Cordova 2.2.0 trong iOS

Khi tôi triển khai cùng một mã cho Android (sử dụng tệp cordova.js dành riêng cho Android), ứng dụng sẽ hoạt động hoàn hảo.

Khi tôi thay thế deviceready bằng ứng dụng jQuery- ready(), ứng dụng cũng sẽ tải trên iOS, nhưng sau đó nó sẽ thiếu quyền truy cập vào các API cụ thể của thiết bị.

cordova.js được tải vì tôi sẽ thấy thông báo cảnh báo đơn giản mà tôi đặt bên trong, tuy nhiên deviceready không bao giờ kích hoạt và API sẽ không bao giờ bị lộ.

HTMLs My head:

<script type="text/javascript" charset="utf-8" src="js/cordova.js"></script> <!-- yes it is the iOS version --> 
<script src="js/jquery-1.8.2.min.js"></script> 
<script src="js/app.js"></script> 

JS của tôi:

function doStuff(){ 
//app functionality 
} 
document.addEventListener('deviceready', doStuff, false); 

Nhưng bằng cách nào đó những thứ sẽ chỉ được thực hiện trên Android ...

Trả lời

10

trong html của tôi, tôi có một onload rằng trigger việc thêm người nghe sự kiện vào deviceready

 function onDeviceReady() { 
     console.log("we are an app"); 
     MyApp.initialize_phonegap(); 
     } 

     function onBodyLoad() { 
     document.addEventListener("deviceready", onDeviceReady, false); 
     } 

    </script> 

    </head> 

    <body onload="onBodyLoad()"> 
+0

Đó dường như là nguyên nhân của vấn đề này, cảm ơn. Nhưng phải trung thực tôi vẫn còn một chút khó hiểu vì tôi không hoàn toàn hiểu tại sao tôi cần phải tổ chức một trình xử lý sự kiện bên trong một trình xử lý sự kiện khác. Phương thức 'addEventListener' sẽ có sẵn ngay từ đầu cũng như' document', phải không? Bạn có lời giải thích cho hành vi đó không? – m90

+0

bạn có tải trọng cơ thể =? Điều đó đã làm tôi thất vọng lần đầu tiên. Tôi đồng ý với bạn nó sẽ là lạ nếu thiết lập xử lý sự kiện đôi là giải pháp. – olore

+0

Không, tôi không có một cái ở nơi đầu tiên vì tôi đã không nhận được "logic", khi sử dụng nó "bằng cách nào đó" hoạt động, nhưng tôi đã tiếp tục sử dụng phương pháp mà thiết lập dự án mặc định sử dụng, xem câu trả lời của tôi phía dưới. – m90

4

Để thêm vào câu trả lời của olore, tôi đã sử dụng cách tiếp cận mã trong dự án mặc định (được xây dựng từ tập lệnh ./create) (khác với mã trong Event docs).

Sự khác biệt chủ yếu là (tôi không thực sự biết được một trong những thực sự đang được đưa vào tài khoản):

  • cordova-2.2.0.js nằm trong thư mục gốc
  • <script> s có ngay trước khi đóng </body> -tag và không có trong head
  • deviceready công trình -Xử lý của tài liệu như:

    var app = { 
    // Application Constructor 
    initialize: function() { 
        this.bindEvents(); 
    }, 
    // Bind Event Listeners 
    // 
    // Bind any events that are required on startup. Common events are: 
    // 'load', 'deviceready', 'offline', and 'online'. 
    bindEvents: function() { 
        document.addEventListener('deviceready', this.onDeviceReady, false); 
    }, 
    // deviceready Event Handler 
    // 
    // The scope of 'this' is the event. In order to call the 'receivedEvent' 
    // function, we must explicity call 'app.receivedEvent(...);' 
    onDeviceReady: function() { 
        app.receivedEvent('deviceready'); 
        myApp.start(); //this is where I put the call to my App's functionality relying on device APIs 
    }, 
    // Update DOM on a Received Event 
    receivedEvent: function(id) { // I didn't really use this, yet I left it in here as it's in the demo 
        var parentElement = document.getElementById(id); 
        var listeningElement = parentElement.querySelector('.listening'); 
        var receivedElement = parentElement.querySelector('.received'); 
    
        listeningElement.setAttribute('style', 'display:none;'); 
        receivedElement.setAttribute('style', 'display:block;'); 
    
        console.log('Received Event: ' + id); 
    } 
    }; 
    
  • Các <script> thẻ cuối cùng chỉ gọi app.initialize()

Điều này dường như làm việc khá tốt trên iOS và Android và là một chút hiểu với tôi hơn handler đôi làm tổ từ các tài liệu.

+1

tôi nghĩ rằng nó đi như thế này cho các tập tin bên ngoài, mô phỏng hoặc tất cả: -phonegap bắt đầu -loads toàn bộ ứng dụng -fires thiết bị sẵn sàng kiện -Bắt đầu chạy js -assign kiện -Nhưng nó đã bị sa thải. về cơ bản được tải trước rồi chạy sau đó sẽ làm rối loạn logic. –

0

Tôi phát hiện ra rằng nếu bạn vô tình bao gồm tập lệnh cordova.js hai lần, thì sự kiện deviceready không kích hoạt.

1

Có vẻ như để làm cho một sự khác biệt nếu bạn đang thêm các deviceready nghe trước hoặc sau các cordova.js:

tôi đã không thể tìm thấy bất kỳ tài liệu về vấn đề này, nhưng cordova .js chặn các cuộc gọi đến addEventListener + removeEventListener và chỉ gọi các cuộc gọi lại deviceready đã được thêm trước cordova.js.

Giải pháp trong trường hợp của tôi chỉ là để sắp xếp lại thứ tự kịch bản:

<script> 
document.addEventListener('deviceready', ...) 
</script> 
<script src="cordova.js"></script> 
0

Tôi đã có cùng một vấn đề. Tôi đã làm cho nó hoạt động bằng cách thêm plugin thiết bị.

$ cordova plugin add org.apache.cordova.device 

Để xác minh:

$ cordova plugin ls 
Các vấn đề liên quan