iOS 上的 PhoneGap 网络信息插件问题

Posted

技术标签:

【中文标题】iOS 上的 PhoneGap 网络信息插件问题【英文标题】:Issue with PhoneGap Network Information Plugin on iOS 【发布时间】:2015-11-11 09:21:13 【问题描述】:

我正在开发一款 PhoneGap 应用,但在安装一个特定模块“网络信息”(https://github.com/apache/cordova-plugin-network-information) 时遇到问题。 phonegap -v 显示我正在运行 5.3.7 版

所有其他插件似乎工作正常。这是我正在处理的应用程序中的一个问题,但我也设法在一个新应用程序中重现它:在这个示例中,我更改的唯一两个文件是 index.html 和 js/index.js,还有是没有 js/cordova.js 文件,自动包含(Cordova Network and Camera API returns undefined)

我使用以下命令创建了应用程序:

phonegap create ios-test
cd ios-test
phonegap cordova plugin add cordova-plugin-dialogs
phonegap cordova plugin add cordova-plugin-network-information

phonegap cordova plugin list的输出是:

cordova-plugin-dialogs 1.1.1 "Notification"
cordova-plugin-network-information 1.0.1 "Network Information"

根据here 的建议,我已将其包装在 setTimeout() 调用中,但这似乎没有什么不同。

这里是 HTML (index.html):

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <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, height=device-height, target-densitydpi=device-dpi" />
        <link rel="stylesheet" type="text/css" href="css/index.css" />
        <title>Hello World</title>
    </head>
    <body>
        <div class="app">
        </div>
        <script type="text/javascript" src="cordova.js"></script>
        <script type="text/javascript" src="js/index.js"></script>
        <script type="text/javascript">
            app.initialize();
        </script>
    </body>
</html>

还有 JS:

var app = 
    initialize: function() 
        this.bindEvents();
    ,

    bindEvents: function() 
        document.addEventListener('deviceready', this.onDeviceReady, false);
    ,

    onDeviceReady: function() 
        navigator.notification.alert('Test', null, 'Test', 'OK');

        setTimeout(function() 
            navigator.notification.alert('Debug', null, 'Checking connection', 'OK');

            if (navigator.connection == undefined) 
                navigator.notification.alert('navigator.connection is undefined', null, 'Error', 'OK');
                return;
            

            var networkState = navigator.connection.type;

            var states = ;
            states[Connection.UNKNOWN]  = 'Unknown connection';
            states[Connection.ETHERNET] = 'Ethernet connection';
            states[Connection.WIFI]     = 'WiFi connection';
            states[Connection.CELL_2G]  = 'Cell 2G connection';
            states[Connection.CELL_3G]  = 'Cell 3G connection';
            states[Connection.CELL_4G]  = 'Cell 4G connection';
            states[Connection.CELL]     = 'Cell generic connection';
            states[Connection.NONE]     = 'No network connection';

            navigator.notification.alert('Network Status', null, 'Connection type: ' + states[networkState], 'OK');
        , 5000);
    
;

在我的 iPhone 上使用 phonegap serve 和开发者应用程序运行代码后,我收到调试警报,然后看到“navigator.connection 未定义”。


我也尝试过为 iOS 构建:

phonegap platform add ios

Adding ios project...
Running command: /Users/James/.cordova/lib/npm_cache/cordova-ios/3.9.2/package/bin/create /Web/ios-test/platforms/ios com.phonegap.helloworld "Hello World" --cli
iOS project created with cordova-ios@3.9.2
Discovered plugin "cordova-plugin-whitelist" in config.xml. Installing to the project
Fetching plugin "cordova-plugin-whitelist@1" via npm
Installing "cordova-plugin-whitelist" for ios
Installing "cordova-plugin-dialogs" for ios
Installing "cordova-plugin-network-information" for ios

这会创建一个platforms/ios 文件夹,但我仍然遇到同样的问题。


我也试过了:

检查 ARC 已启用,iOS8 phonegap cordova network-information app crashes

将以下内容添加到config.xml Check internet connection on iOS app with Cordova Phonegap 3.3.0 not working:

<feature name="NetworkStatus">
  <param name="ios-package" value="CDVConnection" />
</feature>
使用navigator.network.connection.type 代替Check internet connection on iOS app with Cordova Phonegap 3.3.0 not working 检查AudioToolbox.framework和SystemConfiguration.framework都添加了:Cordova Network Plugin does not build on iOS

【问题讨论】:

【参考方案1】:

您没有正确使用this 上下文。这是一个常见的错误。 Javascript this 不像 Java this 那样工作。

它不起作用的原因是this运行时得到解决,而不是在汇编时(或编译时 em>)。当事件触发时,this 解析为全局 this,因为您的 app 对象现在超出了范围。该事件在您的 app 对象的 *outside* 触发。

快速解决方法是使用 app.onDeviceReady 而不是 this.onDeviceReady 您可以通过将 youronDeviceReady() 设为全局函数并将 this 保留在适当位置来测试这一点。

哦,setTimeout() 的答案是不知道他们需要等待deviceready 事件的人。在 Javascript 世界中,糟糕的代码和糟糕的建议比比皆是。

这些视频应该会有所帮助。 – 祝你好运。

Context in JavaScript - 1/4 - Purpose and Problems with JavaScript's "This"

Context in JavaScript - 2/4 - How JavaScript Decides What "This" Actually Is

Context in JavaScript - 3/4 - "This" May Not Be What You Expected & How to Fix It

Context in JavaScript - 4/4 - Mastering "This:" Additional Techniques & Future Support

【讨论】:

感谢您的回复,这真的很有用!使用以下内容,我仍然得到“network.connection is undefined”:gist.github.com/jfi/14fcff97e8c3c98259aa 我不做 CLi,虽然我应该做。我一直在使用 Phonegap Build。在无法访问网络的情况下,如果您使用的是 iOS9,则需要申请CSPATS。几天前,whitelist 插件已被删除。我没有时间修复这篇文章。 HOW TO apply the Cordova/Phonegap the whitelist system。同样,whitelist 插件不再适用于 iOS9,CSPATS 仍然有效。祝你好运 @JamesI,请参阅我的 cmets 到您的原始帖子。您的config.xml 有问题。【参考方案2】:

对于任何感兴趣的人,我确实设法使用以下方法与 PhoneGap Build 一起工作:

<gap:plugin name="cordova-plugin-network-information" version="1.0.1" />

<feature name="Geolocation">
    <param name="ios-package" value="CDVLocation" />
</feature>

虽然 CLI 不走运,所以不要回答这个问题,因为这是最初的问题(并且仍然更容易让它工作)。

【讨论】:

&lt;feature (...)&gt; 已弃用。请参阅#12 的Top Mistakes by Developers new to Cordova/Phonegap 您的插件将失败失败,不是现在,将来,请参阅博客"PhoneGap 5.2.0 Now Available on Build"。引用:“还要确保您的第三方插件都是最新的,并且您的核心插件是从 NPM 采购的,如下所示:”

以上是关于iOS 上的 PhoneGap 网络信息插件问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS8 phonegap cordova 网络信息应用程序崩溃

iOS 上的 Phonegap 触发自定义事件

如何在 iOS 上的 Phonegap 中获取 Parse.com PUSH 注册设备令牌

Phonegap 1.1 / iOS5 插件未触发

在 iOS 应用上的子 iFrame 和 PhoneGap 应用之间调用方法并传递参数

Phonegap 3.3.0 iOS FileSystem 插件未触发完成、进度或错误