2013-05-01 29 views
10

Bối cảnh

Tôi đang cố gắng nâng cấp ứng dụng iOS được xây dựng trên Cordova 2.0 lên phiên bản 2.7. Về cơ bản, đây là màn hình chào mừng trỏ tới công cụ tìm kiếm từ xa (vui lòng giữ lại nhận xét về hiệu lực của ứng dụng và có thể phê duyệt, khi chúng tôi đã qua) và chúng tôi đang sử dụng plugin ChildBrowser để bật liên kết mở trong trình duyệt phụ để không bẫy người dùng trong webview của Cordova.Tại sao Cordova 2.7.0 JS dường như không hoạt động trên các trang từ xa?

Cordova 2.7 có một tính năng được gọi là InAppBrowser Tôi hy vọng sẽ sử dụng thay cho ChildBrowser. InAppBrowser thực chất giống như vậy, ngoài việc thiếu một nút để mở trong Safari.

Vấn đề

trang web từ xa Ứng dụng hiện có bao gồm các Cordova JS (cũng như đối với các plugin ChildBrowser) và nó hoạt động tốt cho việc mở các liên kết trong trình duyệt phụ.

Ứng dụng Cordova 2.7 thử nghiệm của tôi dường như không tải chính xác Cordova JS khi nó được tải từ một trang web từ xa.

tôi đã cố gắng sử dụng HTML này chính xác tương tự trên trang bắt đầu nhúng và một trang bắt đầu từ xa:

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <script type="text/javascript" src="http://mydomain.com/mobile/cordova-2.7.0.js"></script> 
    </head> 
    <body> 
    <script> 
     document.addEventListener("deviceready", onDeviceReady, false); 
     function onDeviceReady() { 
     alert("Ready!!"); 
     } 
    </script> 
    </body> 
</html> 

Để kiểm tra điều này là trang bắt đầu nhúng, tôi đặt dòng này trong config.xml:

<content src="index.html" /> 

Khi tôi chạy ứng dụng, tôi nhanh chóng nhận được "Sẵn sàng!" cảnh báo.

Để kiểm tra điều này là trang bắt đầu từ xa (tôi nhằm liên kết vào trang từ xa trong ứng dụng cuối cùng, tôi chỉ sử dụng nó như là trang bắt đầu cho thử nghiệm. Kết quả là như nhau nếu tôi liên kết từ trang được nhúng.), tôi đặt dòng này trong config.xml:

<content src="http://mydomain.com/mobile/index.php" /> 

Khi tôi chạy ứng dụng, tôi chỉ nhận được màn hình trống và không có cảnh báo.

Hơn nữa, trong cordova-2.7.0.js L. 6255, tôi đã thay đổi

console.log('deviceready has not fired after 5 seconds.'); 

để

alert('deviceready has not fired after 5 seconds.'); 

Với sự thay đổi đó, chạy ứng dụng bằng cách sử dụng trang bắt đầu từ xa làm cho trang trắng, và sau đó sau khi lăm giây, tôi nhận được cảnh báo "deviceready đã không bắn sau 5 giây." Vì vậy, điều này cho tôi biết Cordova JS không khởi động chính xác. Không cần phải nói, tôi không thể có được InAppBrowser để khởi động các liên kết trong trình duyệt phụ trên trang web từ xa, nhưng tôi có thể làm cho nó hoạt động tốt trên trang bắt đầu được nhúng.

Bất kỳ ai có ý tưởng về nơi cần đi từ đây? Đây là một ví dụ khá đơn giản, vì vậy tôi giả định đây là vấn đề về cài đặt Cordova hoặc thay đổi chức năng. Tôi đánh giá cao bất kỳ suy nghĩ, cảm ơn!

+0

Tôi vừa mới thử nghiệm với Cordova 2.6 và thiết lập chính xác với 2.6 hoạt động tốt. Cordova JS hoạt động trên các trang từ xa. Vì vậy, một cái gì đó thay đổi trong 2,7 để phá vỡ này. –

+0

Điều này có vẻ liên quan nhưng với phiên bản trước, vì vậy nó rất lạ: https://issues.apache.org/jira/browse/CB-3029 –

Trả lời

10

Có, thứ gì đó đã hỏng trong 2.7 - liên quan đến công việc cordova-cli của chúng tôi. Xem: https://issues.apache.org/jira/browse/CB-3029

Khắc phục là thêm tệp trống có tên "cordova_plugins.json" vào thư mục gốc của bạn.

+0

Cảm ơn, tôi đã đi con đường thay thế khối mã với cuộc gọi và nó làm việc tốt cho tôi! Cám ơn rất nhiều! –

+1

Thêm cordova_plugins.json không hoạt động đối với tôi. Tôi cũng đã nhận xét phần trong cordova.js (theo liên kết của bạn) và hoạt động đó. – asgeo1

+0

Điều này đã loại bỏ được lỗi khi tập lệnh tìm kiếm 'cordova_plugins.json' nhưng tôi vẫn nhận được" deviceready không bị sa thải sau 5 giây ". – Jacksonkr

0

Nếu bạn nhúng Cordova vào trang web bên ngoài, sẽ không có cách nào để mở Trình InAppBrowser từ trong ứng dụng lai của bạn, vì vậy Cordova sẽ không thể tải.Điều này là do InAppBrowser yêu cầu Cordova được nạp đầy đủ và khởi tạo trước khi nó có thể được sử dụng để tìm nạp một trang từ xa. Bạn cần sử dụng trang HTML mà bạn có, với <script type="text/javascript" src="http://mydomain.com/mobile/cordova-2.7.0.js"></script> làm điểm nhập chính cho ứng dụng của bạn. Sau đó, bạn có thể sử dụng InAppBrowser để mở trang từ xa của bạn. (Bạn có thể có thể làm điều này trong onDeviceReady(), không chắc chắn nếu nó sẽ "flash" trang đầu tiên mặc dù.) Tôi không nghĩ rằng các trang từ xa nên có bất kỳ mã Cordova trong nó cả. Tôi không chắc liệu có thể tương tác với Cordova từ trang từ xa do Chính sách xuất xứ giống nhau hay không (có lẽ bạn có thể sử dụng các tính năng của InAppBrowser để chèn mã "cầu nối") để thực hiện việc này.)

+0

Điều này nghe không đúng. Tại sao điều này lại là một vấn đề bây giờ, khi Cordova JS tải tốt trên các trang web từ xa với phiên bản 2.0 và plugin Cordova ChildBrowser cũng hoạt động tốt? –

+0

Hơn nữa, tôi chỉ thử nghiệm với 2,6 thay vì 2,7 và nó hoạt động như tôi muốn nó.Một cái gì đó đã phá vỡ 2.7. –

0

Vì Shazron đã đề cập vấn đề là vấn đề với tệp "cordova_plugins.json".

Để giải quyết sự cố không thay đổi mã, bạn có thể tạo tệp "cordova_plugins.json" trong thư mục gốc và chèn nội dung giữa các dấu ngoặc kép bên trong tệp này. Mine ví dụ có nội dung sau:

"Just a dummy file required since Cordova 2.6.0" 
+0

Tôi đã thử tất cả các hỗ trợ ở trên để sắp xếp cùng một vấn đề, nhưng không có hy vọng nào. Tôi đã thử thêm cordova_plugins.json trống, Đã thử liên kết ref của cordova-2.7.0.js đến máy chủ cục bộ 10.2.0.108:8000/mobile/cordova-2.7.0.js, cũng đã thử tùy chọn nhận xét. – Nassif

+0

Tôi có nhật ký này ngay bây giờ, 2.7.0 và điều này không hoạt động đối với tôi :( – wendigo

0

tạo ra một tập tin có chứa cordova_plugins.json{}. sau đó truy cập cordova-2.7.0.js và nhận xét dòng này require('cordova/channel').onNativeReady.fire(); khi phát triển xong, hãy thêm lại

3

Tôi gặp sự cố tương tự liên quan đến nâng cấp lên Cordova 2.7. Tuy nhiên, vấn đề của tôi là tất cả console.log của tôi đã ngừng kích hoạt khi chạy ứng dụng. Tôi không thể hiểu tại sao cuộc sống của tôi lại xảy ra. Tôi nghĩ đó là vì tôi đã nâng cấp jquery.mobile. Đó không phải là nó. Sau đó tôi nghĩ rằng đó là một vấn đề .htaccess, đó không phải là một trong hai. Hóa ra, đó là Cordova 2.7 đã gây ra vấn đề này.

Tôi đã thử thêm tệp .json trên máy chủ của mình, điều đó không khắc phục được sự cố.

Việc sửa chữa được đi sâu vào nguồn 2.7 và cho ý kiến ​​ra đoạn mã sau:

/*comment out this as it is breaking console.logs 
    var xhr = new context.XMLHttpRequest(); 
    xhr.onload = function() { 
     // If the response is a JSON string which composes an array, call handlePluginsObject. 
     // If the request fails, or the response is not a JSON array, just call finishPluginLoading. 
     var obj = this.responseText && JSON.parse(this.responseText); 
     if (obj && obj instanceof Array && obj.length > 0) { 
      handlePluginsObject(obj); 
     } else { 
      finishPluginLoading(); 
     } 
    }; 
    xhr.onerror = function() { 
     finishPluginLoading(); 
    }; 
    xhr.open('GET', 'cordova_plugins.json', true); // Async 
    xhr.send(); 
    */ 

Thay thế toàn bộ khối với một cuộc gọi đến các chức năng sau:

finishPluginLoading(); 

bản ghi của tôi bây giờ đang làm việc một lần nữa . Chỉ mất 3 ngày tôi gãi đầu.

Hy vọng điều này sẽ giúp ai đó có vấn đề tương tự.

+0

Trên thực tế, tôi đã nói quá sớm. Điều này không khắc phục vấn đề console.log của tôi. Bất kỳ ý tưởng nào tại sao 2.7 sẽ ngắt kết nối console.log trong Chrome? – jjsquared

0

Giống như tôi nếu bạn đang sử dụng Cordova 5.1.1 và muốn truy cập chức năng gốc sau khi chuyển hướng, hãy sao chép cordova.js, cordova_plugins.js và thư mục plugin nằm ở \ platforms \ platform_name \ assets \ www \ và đặt chúng lên máy chủ, cuối cùng tham chiếu cordova.js bên trong html của bạn. Sau mỗi plugin, hãy chắc chắn cập nhật các tệp và thư mục này.

Các vấn đề liên quan