微信小游戏:主域子域

主域

  • 通常我们所有的功能在主域中就可以完成,主域中有游戏开发所需的所有接口。但是当我们想要做需要访问用户好友数据信息的时候,就需要用到开放数据域中的接口,开放数据域中的接口只能在子域中访问,这也就是我们为什么需要用到子域的原因。

  • 子域存在的目的主要是为了保护玩家的隐私,因为子域中不能调用除特定接口外的其他接口,所以开发者并不能获取玩家的隐私信息。如果在主域中可以调用,那么有些开发者或许会把这些信息发送到自己的服务器,所以微信会限制开放数据域的访问范围。

子域

开放数据域 是一个封闭、独立的 JavaScript 作用域。要让代码运行在开放数据域,需要在 game.json 中添加配置项 openDataContext 指定开放数据域的代码目录。如果使用Cocos Creator,可以再创建一个独立的工程,发布的时候选择微信开放数据域即可。
wx.getUserCloudStorage、wx.getFriendCloudStorage() 和 wx.getGroupCloudStorage() 只能在 开放数据域 中调用。如果在主域中调用会得到 TypeError: wx.getUserCloudStorage is not a function TypeError: wx.getFriendCloudStorage is not a function TypeError: wx.getGroupCloudStorage is not a function

  • wx.getUserCloudStorage 获取当前用户托管数据当中对应 key 的数据。该接口只可在开放数据域下使用, keyList字段是wx.setUserCloudStorage()中定义的字段中的key
wx.getUserCloudStorage({
              keyList : ["max_score"],
              success : this.get_user_data_success,
              fail : this.get_user_data_fail,
          });

获得的数据形式如下图
在这里插入图片描述

  • wx.getFriendCloudStorage() 拉取当前用户所有同玩好友的托管数据。该接口只可在开放数据域下使用,keyList字段是wx.setUserCloudStorage()中定义的字段中的key
wx.getFriendCloudStorage({
                keyList : ["max_score"],
                success : this.get_friend_data_success,
                fail : this.get_friend_data_fail,
            });

数据样式如下图所示
在这里插入图片描述

  • wx.getGroupCloudStorage() 获取群同玩成员的游戏数据。小游戏通过群分享卡片打开的情况下才可以调用,用法与wx.getFriendCloudStorage()类似,只是多了个群分享对应的 shareTicket,涉及到分享的shareTicket

wx.setUserCloudStorage() 和 wx.removeUserCloudStorage() 可以同时在 主域 和开放数据域中调用。

  • wx.setUserCloudStorage() 对用户托管数据进行写数据操作。允许同时写多组 KV 数据,要注意KVDataList的写法,getUserCloudStorage、getFriendCloudStorage等返回的数据也是这个形式,特别注意value需要是字符串形式,否则会报错
wx.setUserCloudStorage({
                    KVDataList : [{key : "max_score", value : score.toString()}],
                    success : self.set_data_success,
                    fail : self.set_data_fail,
                });

wx.postMessage

主域向子域发送消息需要用到这个接口,但是这个接口只能由主域调用。子域只能接受消息,不能发送消息给主域,如果在子域中调用这个接口会收到 TypeError: wx.postMessage is not a function的错误。

wx.postMessage({type : "close"});

在子域中通过onMessage监听主域事件,主域可以调用这个onMessage函数,不会报错,但是没有意义,因为子域并不会也不能调用postMessage

wx.onMessage(this.on_message_come);
on_message_come : function(data)
    {
        if(data["type"] == "open")
        {
        }
    },

下一篇将主要介绍下CocosCreator中使用开放数据域的方法

推广一下自己做的简单的小游戏
在这里插入图片描述

创建了一个小游戏交流群,如果过期或者满了或者有问题交流 可以加我微信 备注“微信小游戏”
在这里插入图片描述
在这里插入图片描述