Meteor Cordova App:如何在 iOS 或 Android 上运行不同的代码

Posted

技术标签:

【中文标题】Meteor Cordova App:如何在 iOS 或 Android 上运行不同的代码【英文标题】:Meteor Cordova App: how to run different code on iOS or Android 【发布时间】:2015-11-24 01:31:15 【问题描述】:

我们需要不同的代码才能在 iosandroid 上运行。

一种方法是在包文件的一开始(在所有代码运行之前)运行包中的不同代码。

Meteor.isCordova 允许确定是在 Cordova 上还是在浏览器上。

如何在 Cordova 中确定是在 iOS 上还是在 Android 上。

这里有一些代码不起作用,因为 Platform.isIOS() 在这个阶段还没有定义:

if (Meteor.isCordova && Platform.isIOS()) 
    Meteor.startup(function () 
        console.log('Using plugin for iOS');
    );
 else 
        console.log('Using plugin for Android');

这与这里提出的问题不同: PhoneGap - Detect device type in phonegap 因为关键是在 Meteor 构建过程中更早地检测到这一点(并且也不使用 PhoneGap 本身)。那里提供的答案在当前上下文中不起作用。

【问题讨论】:

PhoneGap - Detect device type in phonegap的可能重复 依赖导航器的答案不起作用,因为它在这个阶段还没有定义。 副本中的第二个答案不使用navigator 【参考方案1】:

在 Cordova 中,您可以使用 Cordova Device Plugin 检索有关您正在运行的设备的信息。

一旦安装,您就可以使用

device.platform

确定您在哪个平台上运行。

例子:

if (device.platform === 'Android') 
    // Android only code


if (device.platform === 'iOS') 
    // iOS only code

【讨论】:

我无法让它工作,直到 onDeviceReady 之后才定义设备(在这个阶段还不是真的,我不能等待,否则设备将永远不会准备好据我所知)。谢谢。 也许可以尝试为每个平台进行合并,以更改一些 CSS 类,您可以使用这些类来确定运行时的平台。查看developer.com/ws/android/… 以获取在 Cordova 中设置合并功能的示例。或者为每个平台使用预构建钩子并让钩子脚本将“ios”类添加到您的 iOS 的 html 主体和 Android 的“android”然后使用标准 DOM API 来确定哪个类主体具有以及您在哪个平台上. cordova.apache.org/docs/en/dev/guide/appdev/hooks【参考方案2】:
Template.registerHelper('ios',function()
  return ( navigator.userAgent.match(/(iPad|iPhone|iPod)/g) ? true : false );
);
And another for Android:

Template.registerHelper('android',function()
  return navigator.userAgent.toLowerCase().indexOf("android") > -1;
);

那么

Blaze._globalHelpers.ios()
Blaze._globalHelpers.android()

【讨论】:

我无法让它工作。模板本身在这个阶段还没有定义,所以我得到 package.js:9:1: Template is not defined。感谢您的帮助。【参考方案3】:

最后,对我们来说,这种情况的最佳答案是创建应用程序的两个单独的服务器实例:一个用于 ios 和 android。然后,我们将每种设备上的科尔多瓦版本的应用程序指向相应的服务器实例和 URL(ios.server.com、android.server.com)。他们都指向同一个 Mongo 数据库,所以所有的用户信息等最终都在同一个地方。

这不是最优雅的解决方案,但它确实有效。通过使软件包与两个平台兼容最终可能会得到更好的结果,我们可能会这样做,但这使我们能够启动并运行。

这具有将负载分离到两个实例的小好处,因此可以轻松分别处理这两种情况并通过不同的服务器实例分别控制和监视它们的负载等。

【讨论】:

【参考方案4】:

在项目的主目录(不在 www)中创建 merges 文件夹,并在其中创建 iphone/android 文件夹。然后添加依赖于平台的文件,cordova 将在构建您的应用程序时复制它。

如果您在 www 目录中有相同的文件,您应该创建具有相同路径的新文件,例如 merges/android/js/controllers/myController.js 会将特定文件夹的文件替换为www/js/controllers/myController.js

注意:如果您只想替换 all 文件中的一个函数,则可以这样做,但比较棘手。为此,您应该使用 Cordova Hooks。阅读它们并创建一个脚本,将代码的特定部分复制到您想要的文件中......

【讨论】:

以上是关于Meteor Cordova App:如何在 iOS 或 Android 上运行不同的代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cordova 项目中嵌入 Meteor 视图?

Meteor + Cordova + iOS:不允许上传文件

在 iPhone 6 上的 Meteor Cordova 应用程序中进行缩放

Meteor cordova ios项目pch错误

包内的 Meteor Ionic Angular App - 如何链接到模板?

为啥客户端 HTTP.get() 调用在 Cordova (Meteor 0.9.3) 中不起作用?