KaiOS IAC 应用间通信
Kai OS 是Firefox OS 的一个fork版本。本文内容基于KaiOS。
什么是IAC?
IAC 是Inter APP Communication 的缩写,意为 应用之间的通信。 一个应用想要发送或接收另一应用的消息的时候,这个API 可以在两个应用见建立桥梁传递信息。
基础用法
两个“身份”
- 信息发布者,发布消息,可以类比为android中的发送广播的角色。
- 订阅者,接受消息,类比为android中静态注册广播并接受的角色。
下面以实际案例讲解用法:
示例
发布信息:
首先是发送端的实例代码:
这里有一个keyword “ftucomms” ,这是约定好的标识,发送和接收就靠这个keyword 作为唯一标识。
接收信息
要想能够接收消息,先要在manifest.webapp 里的connections 字段下声明keyword,表示要接收用此keyword 发送的消息。注意修改manifest.webapp 后要重置手机,这也就意味着这个方法只适用于系统应用。
除了ftucomms 还可以看到systoaster,可见系统的toaster 虽然是在各个应用“弹出”的,但是代码真正做的只是把弹出的消息发给了system,由system 弹出。
下面就是接收消息的代码,这是初版。其实消息发过来是一个request 对象,它有几个成员变量,其中比较重要的是keyword 和message, keyword 的重要性我们前面已经说过了,message 正是发布者发布的消息。除了这两个还有一个成员变量from, 它存储了形如:app://***.gaiamobile.org/***/***.html 这样的内容。
其实用摆出api 来讲解不是更明白吗?不摆api 的原因在于,网上可查到的api 很可能和你实际的代码中是不一样的。所以我们还是先讲大体逻辑,具体的api 看具体的代码吧。
由于hander 处理消息的一些原因,两位开发着把接收消息的代码做了一个封装。只需用 <script defer src="shared/js/iac_handler.js"></script>
引入iac_handler.js 之后,就可以用下面的代码接收消息:
注意,这里keyword 前面加了个前缀iac,具体实现逻辑请参考iac_handler.js 源码(github可查)。
高级用法
- 双向通信
在建立连接之后,我们可以通过keyword 来获得通信的port。
這樣做的假設前提是:另一端的 app 一定會先建立連線,因此這時透過 keyword 一定可以取得 port 。
- 限制消息传送来源或信息接收对象
使用rules来限定消息的来源,只接收特定应用或特定安装源的应用:
假如我们发送的消息不想被其他不相关的应用接收,那么可以指定消息接收的对象:
- 缓存app 对象
按照上面的发送信息的写法,每次傳送訊息都必須要透過 mozApps API 的 geSelf() 取得自身的 app 物件,然而 getSelf() 是非同步的 DOMRequest ,事實上在同一個 app 內部每次呼叫 getSelf() 取得的 app 物件都是同一個,我們何不直接把它 cache 起來以避免不必要的 DOMRequest 呢?
如上,我們在 SomeClass 內部有一個 _realConnect() 負責真正建立 IAC 連線, connect() 則是提供外部元件呼叫的函式。當外部元件第一次呼叫 connect() 時, this.app 不存在,因此我們透過 mozApps.getSelf() 取得 app 物件,並把它存在 that.app ,之後當外部元件再次呼叫 connect() 時,就不必再多花一次 DOMRequest 的成本,可以直接呼叫 _realConnect() 建立 IAC 連線。