开始编写你的第一个应用

优质
小牛编辑
123浏览
2023-12-01

YodaOS 开发者工具

YodaOS 开发者工具 提供了一系列的便捷工具来对 YodaOS 设备进行操作,启动应用,安装应用,查看应用日志等。

可以从 YodaOS 开发者工具 Releases 页面下载 YodaOS 开发者工具。

创建 YodaOS 应用项目

通过 YodaOS 开发者工具,我们可以快速地创建一个 YodaOS 应用项目:

~/workspace > yoda-cli init app awesome-demo-app
✔ Name of the package … awesome-demo-app
✔ A short description of the package … A demo application project
✔ Is this package private? … no / yes
✔ Keywords … demo,app

运行了以上命令后,就可以在当前目录下的 awesome-demo-app 目录中看到生成的 YodaOS 应用项目了。

更多的 yoda-cli 命令可以通过 yoda-cli help 查看。

生成项目之后,即可将应用安装到 YodaOS 设备上:

~/workspace > yoda-cli pm install awesome-demo-app

--- OR ---

~/workspace/awesome-demo-app > yoda-cli pm install .

程序入口:YodaOS Application

对于 YodaOS 来说,每个应用都是一个 CommonJS 模块。YodaOS 的应用的主入口即为通过 require('@yodaos/application').Application 创建的 Application 实例。

var Application = require('@yodaos/application').Application
var app = Application({})

应用通过这个 Application 对象来与系统交互,接收系统、应用事件等。

接收系统事件

在创建 Application 的时候,Application 接收一个字面对象,这个对象上可以挂载多个事件的监听函数,通过这些监听函数我们可以监听应用与系统的事件:

var Application = require('@yodaos/application').Application
var logger = require('logger')('app')

var app = Application({
  url: function url (urlObj) {
    logger.info(`Received url: ${urlObj.href}`)
  },
  broadcast: function broadcast (event) {
    logger.info(`Received broadcast: ${event}`)
  }
})

应用 Manifest

除了程序代码,应用还需要向声明自己的身份、权限请求等信息,以便 YodaOS 向应用分配资源等。YodaOS 应用的 package.json 就包含了这些信息:

{
  "name": "com.company.example.awesome-app",
  "version": "1.0.0",
  "main": "app.js",
  "manifest": {
    "services": [
      [ "a-service", { "main": "a.js" } ],
      "b-service"
    ],
    "hosts": [
      "awesome-app"
    ]
  }
}

package.json 类似于 npm 包,但是对于 YodaOS 应用来说,其中最重要的字段莫过于 name 与 manifest:前者声明了应用的本地 ID,后者声明了需要向系统申请的资源等信息。

查看更多 package.json 描述文档:应用 Manifest

处理 URL 请求

应用可以通过 URL 的形式唤起其它应用,并将当前的交互托付给能处理这个 URL 的应用。

如果希望处理某个域名的 URL,需要在应用的 package.json 中注册这个 URL,如下是注册一个 foobar.app 域名的例子:

{
  "name": "com.example.app.foobar",
  "manifest": {
    "hosts": [
      "foobar.app"
    ]
  }
}

查看更多应用 Manifest 文档:应用 Manifest

而注册了该域名的应用就可以通过如下代码处理如 yoda-app://foobar.app/data/media/music.mp3 的 URL 请求:

var Application = require('@yodaos/application').Application
var AudioFocus = require('@yodaos/application').AudioFocus
var MediaPlayer = require('@yoda/multimedia').MediaPlayer
var logger = require('logger')('app')
var path = require('path')

var app = Application({
  url: function url (urlObj) {
    logger.info('Received url: ', urlObj.href)
    var focus = new AudioFocus()
    var resumeOnGain = false
    var player
    focus.onGain = () => {
      resumeOnGain = false
      if (player == null) {
        player = new MediaPlayer()
      }
      if (resumeOnGain) {
        player.resume()
      } else {
        player.start(this.privateTransformPath(urlObj.pathname))
      }
    }
    focus.onLoss = (transient) => {
      if (transient) {
        player.pause()
        resumeOnGain = true
      } else {
        player.stop()
      }
    }
    focus.request()
  }
})

app.privateTransformPath = function (mediaPath) {
  /** a very private method should not be used by others */
  return path.join('/a-private-path', mediaPath)
}

查看更多 URL Object 的文档:Legacy urlObject