乌徒帮乌徒帮闲语 › 新浪微博客户端内置浏览器JSAPI

新浪微博客户端内置浏览器JSAPI

分类:乌徒帮闲语 标签:,,

使用条件

微博 Android 与 iPhone 官方客户端 4.3.0 以上版本的内置浏览器。

初始化事件

网页加载完成时,会向?document?发送?WeiboJSBridgeReady?消息,网页需要监听此消息,收到后再访问 JSBridge。

1
2
3
document.addEventListener('WeiboJSBridgeReady', function () {
  // do something.
});

主动触发初始化

有时网页加载速度较慢,可能在?DOMContentLoaded?之后很久 bridge 才会注入。如果对速度要求很高,可以在?DOMContentLoaded?时主动告诉 native 来注入 bridge,具体方式如下:

  • 等待?DOMContentLoaded?事件($(document).ready()
  • 生成与 native 通信的?iframe?标签。
  • 注意将?iframe?的?id?设为?__WeiboJSInvokeIframe?可以避免 bridge 注入时重复生成。
  • 将?iframe?的?src?设为?sinaweibo://bridge_initialize
  • 等待?WeiboJSBridgeReady?事件
1
2
3
4
5
6
7
8
9
10
document.addEventListener("DOMContentLoaded", function(event) {
  if (typeof window.WeiboJSBridge === 'undefined') {
      var invokeIframe = document.createElement('iframe');
      invokeIframe.id = '__WeiboJSInvokeIframe';
      invokeIframe.style.display = 'none';
      document.documentElement.appendChild(invokeIframe);

      invokeIframe.src = 'sinaweibo://bridge_initialize';
  }
});

调用Bridge的Action

通过?window.WeiboJSBridge?的?invoke?方法来调用 bridge 的 action。

1
2
3
4
5
6
7
8
9
WeiboJSBridge.invoke("getNetworkType", {"param" : "value"}, function (params, success, code) {
  if (success) {
      document.write('网络状态是' + params.network_type);
  } else {
      if (code == WeiboJSBridge.STATUS_CODE.NO_RESULT) {
          // do something.
      }
  }
});

第一个参数为要调用的 action,第二个为 参数列表,第三个为回调函数。

或者可以为成功失败提供不同的回调方法,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
WeiboJSBridge.invoke('getLocation', {}, {
  success: function(params) {
      resultDiv.innerHTML = params.lat + ', ' + params.long;
  },
  fail: function(params, code) {
      var reason;
      if (code == WeiboJSBridge.STATUS_CODE.SERVICE_FORBIDDEN) {
          reason = '定位服务未启用';
      }
      resultDiv.innerHTML = '定位失败, ' + reason;
  },
  final: function(params) {
      alert('定位结束!');
  },
});

响应 Event

有时 native 会给网页发送一些通知,网页可以选择性接收。

1
2
3
WeiboJSBridge.on('networkTypeChanged', function(params){
  document.write('网络状态已变为:' + params.network_type);
});

Action 列表

openImage 查看大图

  • 参数列表:
    • url: 当前选中的图片src;
    • urls: 当前页面中的所有图片src,用于支持横滑查看
  • 返回值:无
  • 错误码:
    • MISSING_PARAMS😕url?与?urls?至少需要传递一个

getNetworkType 获取网络状态

  • 参数列表:无
  • 返回值:{"network_type": "wwan"}wwan?代表 2G 或 3G,?wifi?代表 WIFI,?fail?代表无网络

scanQRCode 扫描二维码

  • 参数列表:无
  • 返回值:{"result": "http://weibo.com"}
  • 错误码:
    • USER_CANCELLED: 用户取消了扫描
    • SERVICE_FORBIDDEN: 设备没有摄像头或用户不允许使用摄像头

pickImage 获取照片

  • 参数列表:
    • source😕camera?为拍照,其他为从相册选择
  • 返回值:{"base64": "9sa1..."}
  • 错误码:
    • USER_CANCELLED: 用户取消了选图
    • SERVICE_FORBIDDEN: 设备没有摄像头或用户不允许选图

getLocation 定位

  • 参数列表:无
  • 返回值:{"lat": 100, "long": 100}
  • 错误码:
    • SERVICE_FORBIDDEN: 定位服务不可用
    • NO_RESULT: 获取位置失败

queryPreloadCache 获取预加载内容

  • 使用条件:
    • 仅 weibo.com、weibo.cn 及其子域名可以调用
  • 参数列表:
    • cid: 内容的id,必需
  • 返回值:{"result": "{'key': 'value'}"},result为内容预加载接口返回值
  • 错误码:
    • MISSING_PARAMS: 未传递?cid?参数
    • NO_RESULT: 指定缓存不存在
    • INTERNAL_ERROR: 缓存读取失败
    • ILLEGAL_ACCESS: 调用域名无权限访问

deletePreloadCache 删除预加载缓存

  • 使用条件:
    • 仅 weibo.com、weibo.cn 及其子域名可以调用
  • 参数列表:
    • cid: 内容的id,必需
  • 返回值:无
  • 错误码:
    • MISSING_PARAMS: 未传递?cid?参数
    • INTERNAL_ERROR: 文件删除失败(不包括缓存不存在)
    • ILLEGAL_ACCESS: 调用域名无权限访问

setBrowserTitle 设置顶导标题

  • 参数列表:
    • title: 新标题,必需
  • 返回值:无
  • 备注:通过此方法设置的标题优先级最高
  • 错误码:
    • MISSING_PARAMS: 未传递?title?参数

Event 列表

networkTypeChanged 网络状态改变

  • 使用条件:
    • 目前仅iPhone支持
  • 参数列表:
    • network_type: 改变后的状态,wwan?或?wifi?或?fail

Status Code 列表

状态码会在 action 的回调中提供

1
2
3
4
5
6
7
8
OK:              操作成功
MISSING_PARAMS:   缺少必须的参数
ILLEGAL_ACCESS:   非法调用
INTERNAL_ERROR:   客户端内部处理错误
ACTION_NOT_FOUND:     客户端未实现此 action
NO_RESULT:            客户端没有获取到结果
USER_CANCELLED:   用户取消了操作
SERVICE_FORBIDDEN:    相关服务未启用或被禁止 (如定位服务,相册权限)

网页通过比对回调的code值和以上值进行处理

1
2
3
if (code == WeiboJSBridge.STATUS_CODE.NO_RESULT) {
  // 客户端没有获取到结果
}

本文转载自:http://beginios.com/javascript/weibo-client-js-api.html

填写个人信息,赶快回复吧!