.
  • 最新新闻
  • 安卓手机app开发用什么软件_app开发_大鱼科技
    搅局者来了,他叫小程序(微信、支付宝),也叫直达服务(小米)。江湖的玩法变了。 右下角的墨迹天气,是工具类App里的老炮,用户每天开一次、每次瞅一眼的打开方式,让他很头疼。「这怎么卖广告?」 为了挣钱,他在【天气】下面放了一坨新闻,还搞了个【时景】的UGC体系,提升停留时长。又在【我】的页面放了一堆广告入口。
  • 制作手机app大概费用多少钱_app开发_大鱼科技
    有时为了突出名称的意义,可能会跟品牌不一致,但网民搜索又可能搜索不到,这时关键字优化就很重要了,核心优化点在于:内容描述中必须包含核心关键字,并获得较好排名,如搜索『简历』,你的简历相关的小程序是否比较靠前。
  • 开发一个app需要多少钱费用_app开发_大鱼科技
    微信的表情雨让中国人的社交充满了人情味儿。当你在对话框输入“么么哒”或者“想你了”,聊天页面会掉下相应的表情雨,成为大多情侣互传情愫的标准动作。中国传统情人节日“七夕节”已至,情侣们在微信“秀恩爱”的方式又多了一种——黄金红包。
  • 什么是小程序_小程序开发需要多少钱_app开发_大鱼科技
    什么是小程序:小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用。也体现了“用完即走”的理念,用户不关心是否安装太多应用的问题。应用将无处不在,随时随地可用,但又无需安装卸载。
  • 看牌器 透视在哪里买_app开发_大鱼科技
    这个微信小程序的创意始于2012年,当时仅仅开发了Win平台桌面应用,随着移动互联网发展,开发技术栈难度降低
  • 做一个平台app需要多少钱_app开发_大鱼科技
    访问次数:昨日访问小程序内所有页面总次数,多个页面之间的跳转、同一页面的重复访问计为多次访问。 访问人数:昨日访问小程序内所有页面的总用户数,同一用户多次访问不重复计。 新访问用户数:首次访问小程序页面的用户数,同一用户多次访问不重复计。
  • 一天能赚2万的黑方法_app开发_大鱼科技
    没深思小程序最近一个月内更新7次背后是微信内部前所未有的力度在支持小程序(公众号都不曾有此殊遇),特别是微信刚公布2017年Q1月活账号破9.38亿。面对如此巨大的流量洼地,我们如何借助小程序来低成本/0成本获取用户?
  • 网赌破解器哪里下载_app开发_大鱼科技
    小程序定位 对于公司而言,小程序究竟是一个什么产品定位?以目前的大环境而言,无非就是几个关键点: 蹭一波热点,吸引眼球,做小程序这件事情本身就是一个吸引眼球的事情; 延伸产品线,对已有产品线做一个开辟,确保整个线的完整性; 借助小程序,赶上这趟车,营销导流;
  • 定制一款app大概需要多少钱_app开发_大鱼科技
    很多人不禁要对此举的意义发问:以微信的算法而出的搜索结果,岂不是严重遏制了新生小程序的后来者居上?这样即使定义了关键词,对推广而言并没有实质性的意义?微信官方自然也想到了与之相辅相成的策略,我们甚至可以认为后来的这步棋才是微信的本来目的。那就是于6月中旬首次出现于人们视野中的「搜索关键词广告」
  • 软件外包公司_app开发_大鱼科技
    代码的复杂度是评估一个项目的重要标准之一。较低的复杂度既能减少项目的维护成本,又能避免一些不可控问题的出现。然而在日常的开发中却没有一个明确的标准去衡量代码结构的复杂程度,大家只能凭着经验去评估代码结构的复杂程度,比如,代码的程度、结构分支的多寡等等。当前代码的复杂度到底是个什么水平?什么时候就需要我们去优化代码结构、降低复杂度?这些问题我们不得而知。 因此,我们需要一个明确的标准去衡量代码的复杂度。
  • 热门新闻
自己怎么开发一个软件app_app开发_大鱼科技
时间:2021-01-10 14:57:23
自己怎么开发一个软件app_app开发_大鱼科技

webview中的h5页面做某些操作后需要修改当前的分享页面,但是,此时H5页面的链接没有改变。需要有一个机制通知小程序页面要修改分享参数了。

技术解决

根据小程序文档,支持webview中页面以postMessage的形式向小程序通信(仅在分享,返回等特殊操作时,才触发)

要点:

  • 使用wx.miniProgram.postMessage向小程序通信,当用户转发时页面可以监听到消息

  • 页面监听到的消息为历史列表,且不清除,需要自行处理

  • 小程序页面设置了onShareAppMessage可以支持分享,默认分享为当前页面

  • 用户点击转发后,会先触发webview的onMessage,再调用onShareAppMessage设置分享配置

h5和小程序约定的postMessage消息格式:

{

type:'消息类型',//setShareOption

...restData // 其他参数

}

复制代码

h5页面设置分享参数:

/**

* 设置weapp分享链接

* @param option

* @example setWeappShareOption({title:"分享标题",path:"分享链接",imageUrl:'分享图片可为空'})

*/

export function setWeappShareOption(option:{title:string,path:string,imageUrl:string}){

if(window['wx'] && window['wx'].miniProgram && window['wx'].miniProgram.postMessage){

window['wx'].miniProgram.postMessage({

type:'setShareOption',

title:option.title,

path:option.path,

imageUrl:option.imageUrl

});

}

}

复制代码

小程序页面支持分享:

 

import Taro from '@tarojs/taro'

import { WebView } from '@tarojs/components'

import {

getCurrentChannelEventHash,

resetChannelHash,

} from './WebViewHashChannelData'

import { unpackUrl,packUrl } from '../../src/core/UrlHelper'

const DEFAULT_WEB_PATH = 'https://xxx.x.com/xxx' // to 参数默认的域名前缀

/**

* 小程序Page页面

* @param to 要跳转的h5页面地址 e.g:/xxx/xxx or 完整地址 https://xxx....

* @param title 要跳转的h5页面标题

*/

export default class H5WebView extends Taro.Component {

config = {

navigationBarTitleText: ' ',

}

state = {

url: '', // url不支持Hash

hash: '',

}

isBack = false

shareOption = {

title: null,

path: null,

}

componentWillMount() {

this.isBack = false

const to = decodeURIComponent(this.$router.params.to || '')

const urlObj = unpackUrl(to)

let url = urlObj.pathWithSearch

let hash = urlObj.hash

let title = this.$router.params.title

if (title) {

title = decodeURIComponent(title)

Taro.setNavigationBarTitle({ title: title })

}

this.setState({

url,

hash,

})

console.log('[H5WebView] mount', url, hash)

}

componentDidShow() {

// onShow

if (this.isBack) {

// 小程序页面回退,通知h5

let channelEventHash = getCurrentChannelEventHash()

// if (!channelEventHash) {// TODO 仅白名单的页面增加backPush 通过postMessage??

// channelEventHash = getBackEventHash();// 通知游戏,上层的Page 移走了

// }

this.setState({

hash: channelEventHash,

})

// 通知完毕 重置

resetChannelHash()

console.log('[H5WebView] show set hash', channelEventHash, this.state.url)

} else {

console.log('[H5WebView] show first')

}

this.isBack = true

}

_getLastData(itemList, type) {

if (!itemList || itemList.length === 0) {

return null

}

let lastIdx = itemList.length - 1

while (lastIdx >= 0) {

let item = itemList[lastIdx]

if (item && item.type === type) {

return item

}

}

}

handleMessage(e) {

let { data } = e.detail

// 设置最后一条share

let shareOption = this._getLastData(data, 'setShareOption')

if (shareOption) {

this.shareOption = {

title: shareOption.title,

imageUrl: shareOption.imageUrl,

path: shareOption.path,

}

}

console.log('withWV handleMessage', data)

}

/**

* 支持分享消息

*/

onShareAppMessage() {

if (this.shareOption) {

let path = null

if (this.shareOption.path) {

path = packUrl(this.$router.path, {

to: this.shareOption.path,

title: this.shareOption.title,

})

}

return {

title: this.shareOption.title,

path,

imageUrl: this.shareOption.imageUrl,

}

}

}

onWebViewLoad(e) {

console.log('withWV onWebViewLoad', e.detail.src, this.state.hash)

this.shareOption.path = e.detail.src //默认分享页面为当前页面

}

_normalizeTo() {

let to = this.state.url

if (!to) {

return null

}

if (to.substr(0, 4) !== 'http') {

to = DEFAULT_WEB_PATH + to

}

if (this.state.hash) {

to += '#' + this.state.hash

}

return to

}

render() {

let to = this._normalizeTo()

if (!to) {

return null

}

return (

<WebView

src={to}

onMessage={this.handleMessage}

onLoad={this.onWebViewLoad}

/>

)

}

}

复制代码

TODO

可以在postMessage中加一个字段id,每次处理完后,记录上次处理的最后一条消息的id,下次处理从那条消息之后处理