5

为我们的移动网络应用程序和 phonegap 应用程序使用相同的代码库是否明智?它们应该是相似的,phonegap 版本只是让我们做更多的事情。我们能否检测它是否没有在 phonegap 上运行并隔离对 phonegap api 的调用,或者将它们分开是否更有意义。

4

3 回答 3

17

当然,您可以使用大部分相同的代码库。一些 phonegap API 在 html5 中是相同的(例如 localStorage),所以那里的代码没有区别。

如果您使用 phonegap Build 服务,它会将 phonegap.js / cordova.js 脚本文件添加到您的项目根目录。只需将其始终包含在您的 html 中即可。然后您可以检测您的应用程序是否在 phonegap 中运行:

var isPhonegap = function() {
  return (typeof(cordova) !== 'undefined' || typeof(phonegap) !== 'undefined');
}

if (isPhonegap()) {
  // phonegap.js/cordova.js exists.. now let's handle the onDeviceReady event
} else {
  // in-browser
}

如果您需要一些常用的启动代码,请将其放在一个函数中,并从 onDeviceReady 处理程序和上面的else块中调用此函数。

如果您调用的 phonegap api 的名称与 html5 的名称不同(例如,因为它具有 Moz* 或 WebKit* 前缀),只需将两者都包装在一个新名称中。例如:

var requestFileSystem = (isPhonegap() ? requestFileSystem : window.WebKitRequestFileSystem);

如果您使用的 phonegap API 确实没有 html5 等效项,请尽可能尝试在 javascript 中复制该功能,否则您将失去浏览器中的功能。但请确保它在没有该功能的情况下足够优雅地降级。

注意:要在浏览器中测试移动设备功能,如加速度计、地理位置等。请查看Ripple Chrome 扩展程序

于 2012-05-24T08:57:47.080 回答
2

我想出了一种方法来保持网络代码库的完整性......

使用内置 deviceready 事件的当前问题是,当页面加载时,您无法告诉应用程序:“嘿,这不是在移动设备上运行,无需等待设备准备好开始”。

  1. 在代码的本机部分中,例如对于 iOS,在 MainViewController.m 中有一个方法 viewDidLoad,我正在发送一个 javascript 变量,稍后我会在 Web 代码中检查该变量,如果该变量在附近,我将等待启动为我的页面编写代码,直到一切就绪(例如,导航器地理位置)

    在 MainViewController.m 下:

    - (void) viewDidLoad
    {
        [super viewDidLoad];
        NSString* jsString = [NSString stringWithFormat:@"isAppNative = true;"];
        [self.webView stringByEvaluatingJavaScriptFromString:jsString];
    }
    
  2. index.html 的代码如下:

    function onBodyLoad()
    {
        document.addEventListener("deviceready", onDeviceReady, false);
    }
    
    function onDeviceReady(){;
        myApp.run();
    }
    
    try{
        if(isAppNative!=undefined);
    }catch(err){
        $(document).ready(function(){
            myApp.run();
        });
    }
    
于 2012-07-08T16:19:52.747 回答
0

我会使用相同的代码库。PhoneGap 的重点是将您的移动网站转换为应用程序。适当地检测功能和屏幕房地产并不难。单独的代码库的问题通常是双重处理您的内容和样式的成本。如有必要,您可以将它们分离为共享资源并在运行时/访问时将它们捆绑在一起,但我个人仍然会将它们放在一起。

该博客涵盖了检测问题(也参见评论):http ://bennolan.com/2011/08/22/phonegap-detection.html 。不过,症结在于if (window.PhoneGap){...}

于 2012-05-24T05:10:54.800 回答