HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

uni-ad广告联盟使用指南及收益相关问题

uni-ad ad 广告联盟

uni-ad官网地址:https://uniad.dcloud.net.cn/
uni-ad常见问题汇总与解答:点击查看
微信小程序广告开通指南:点击这里

近期更新~
1)HBX3.8.12+版本APP端已支持海外广告(谷歌Admob,海外穿山甲,华为),需要开通海外广告的请联系uni-ad官方商务/运营。
2)uni-ad同时支持原生应用的广告接入,uni-ad原生应用广告SDK下载链接以及更新日志:点击查看
3)如App需要通过投放平台买量,请联系uniad@dcloud.io
4)微信小程序广告uni-ad已支持,微信小程序广告开通指南查看这里
5)uni-ad的App端广告已支持百度广告和华为广告,请使用HBuilder3.4.0版本以上打包集成

前言

uni-ad支持个人和企业申请广告。
uni-ad支持APP,H5和微信小程序广告。
uni-adAPP端已支持国内七家广告渠道,包括:优量汇,快手,穿山甲,百度,华为,Sigmob,360。从HBX3.8.12开始已支持海外广告,包括:谷歌Admob,海外穿山甲,华为。我们利用现有12亿活跃用户数据以及多年的技术沉淀来不断升级广告优化策略,确保开发者广告收益的最大化。
uni-ad的App端支持所有DCloud框架开发的APP,包括uni-app的App端及5+App、wap2app,uniCloud项目,都可以使用里面的各种广告(开屏、信息流、激励视频...)
uni-ad支持原生应用的广告接入,点击查看。根据我们的经验:开发者在用原生应用接入广告时通常比uni-app应用接入广告要更费时(uni-app接入广告会比原生节省一半时间),这是由于原生代码相比uni-app的代码繁琐导致部署与调试效率下降。我们建议原生开发者在接入前邮件联系以获取我们专业的技术支持和运营服务:uniad@dcloud.io。uni-ad支持Cocos应用程序的广告接入,具体接入方式请咨询:uniad@dcloud.io
以下是uni-ad所有广告形式的开发文档:
APP端
开屏广告 - 无需开发,在uni-ad后台开通即可生效
信息流广告/原生广告插屏广告全屏视频广告激励视频广告Draw视频广告短视频内容联盟广告
H5端
信息流广告/原生广告
微信小程序端开通指南
信息流广告/原生广告插屏广告激励视频广告格子广告

本文将重点描述DCloud技术架构(uni-app,5+,wap2app,uniCloud)开发的APP端广告开通和常见问题。
微信小程序广告开通指南查看这里

本文分为,第一章:使用指南、第二章:收益相关问题。

创建应用

应用创建不能在uni-ad系统进行,只能在HBuilderX中或开发者web控制台新建应用。

应用创建后可以在manifest.json里查看到Appid。

  • 如果你在HBuilder中开发过App,那么一定已经有过Appid。

  • 如果你使用uni-app开发过H5或小程序,还没有开发App,那么很可能你的项目缺少Appid,需要把你的项目拖到HBuilderX中,打开项目下的manifest文件,获取AppID。

  • 如果你还没有使用过DCloud的工具开发App,请先下载HBuilderX,在里面新建一个uni-app/5+/wap2app应用。

开通广告

创建应用之后 ,进入 uni-ad 广告联盟后台(https://uniad.dcloud.net.cn) ,使用 创建应用的DCloud 账号登陆广告联盟管理后台

点击左侧 广告设置,在右侧应用列表找到需要开通的应用,点击 开通广告,进入广告开通页面。

注意:

  • 如果列表中没有你想要的应用,请注意检查你登录uni-ad后台的账户是否是应用的创建者或所有者。如果仅仅是协作者,是不能操作广告后台的。
  • 可以申请转让应用,具体参考https://ask.dcloud.net.cn/article/12861

1. 实名认证

如果当前账号没有进行实名认证,需要点击账户管理并进行实名认证,才能继续使用广告联盟。

2. 财务信息审核

如果当前账号没有进行财务信息审核,需要财务信息并进行财务信息审核,才能继续使用广告联盟。

如果没有完成实名认证、财务信息审核,在HBuilderX的打包界面勾上广告也是没效果的。

3. 开通DCloud快捷广告

uni-ad分DCloud快捷广告和渠道SDK广告。
DCloud快捷广告的特点是:

  • 审核门槛较低;
  • 无需集成三方SDK,云端直接控制开关
  • 但目前的平均收益不及渠道SDK广告。当有大广告主向DCloud直投广告时,DCloud快捷广告的收益在投放期会非常高,高于渠道SDK广告。但目前这种投放密度还不够,常态下的收益不及渠道SDK广告。
    广告开通渠道中选择DCloud快捷广告,广告类型 开屏PUSH至少勾选一个,点击页面最下方 申请开通 即可开通DCloud快捷广告。

Tips:

  • 广告类型 至少勾选一项,才会开启DCloud快捷广告,否则不会开启。
  • 申请开通广告联盟需要审核,DCloud 一般在1-2个工作日内处理申请,遇节假日顺延,请您及时关注后台变化。
  • 真机运行广告不生效,需打包后生效。

4. 开通渠道SDK广告

渠道SDK广告需要集成三方SDK,如腾讯优量汇、字节跳动穿山甲、快手广告(无上架要求,但需提供软著)、360广告联盟、Sigmob广告(无上架要求,无需软著)。审核门槛较高,广告收益更高。

开通渠道SDK广告,需要选择渠道SDK广告并打开是否开启渠道SDK广告按钮。

设置渠道SDK广告相关信息,点击申请开通,即可开通广告。

Tips:

  • 可以只开通安卓或只开通iOS
  • 如果选择开通安卓平台,除了快手、Sigmob广告,其他广告平台均要求在主流的应用商店上线。大部分应用商店会要求著作权证书。以下应用市场暂无软著要求:
    • 酷安市场:没有著作权要求,审核较慢。(只能用于渠道SDK广告中优量汇审核)
    • Google Play:不要求著作权,开发者账号收费25美元 (2020年7月2日以后穿山甲平台已不再支持该应用市场。只能用于渠道SDK广告优量汇审核。如果是强依赖聚合激励视频的网赚类应用,离不开穿山甲,所以不适合这种方式)。
    • 豌豆荚(阿里应用分发平台):不要求著作权,但应用不涉及金融、贷款、医疗等特殊行业内容,可以暂时使用开发者声明代替。
    • 安智:不需要著作权,但打包了推广的上架服务,费用为5000元(某些特定行业分类无法上架,需沟通)。
    • vivo 应用商店:需根据app类型来确定审核所需要的资质。不在表内的app可尝试无著作权提交。特殊行业类资质要求
  • DCloud协调了三方合作伙伴给予DCloud开发者申请著作权的特惠价格,包括加急服务,详情加QQ群893532138了解。
  • 开通渠道SDK广告需要审核,DCloud正常审核时间是1-2个工作日,遇节假日顺延,请您及时关注后台变化。如果超过3个工作日还未审核成功,请联系:uniad@dcloud.io。
  • 三方广告SDK真机运行不生效,打包后生效,并且需要HBuilderX 2.5.11+版本,manifest或打包界面选择渠道SDK广告SDK。

5. 广告管理及新增广告位

开通广告并审核通过后,在应用列表点击应用详情,进行广告管理

1. 开屏广告设置
点击开启开屏广告,可以选择是否在应用中展示开屏广告。开屏广告无需开发,直接云端开启关闭。但注意如需使用渠道SDK开屏广告,如优量汇开屏,需确保App里包含优量汇的sdk。在manifest里或打包界面里,要选择相应的SDK。

2. 应用内广告位设置

应用内广告是需要编程的,它用于信息流/原生广告激励视频全屏视频等广告场景。信息流可以模拟插屏的广告形式具体参考:信息流文档中的“使用 ad/ad-draw 模拟插屏广告效果”部分。

首先点击 新增广告位

填写广告位名称(此名称仅用于开发者自己的识别和报表展现),选择广告类型,即可新建广告位

*开屏广告不需要单独申请,也不需要开发者进行编码。开发者的应用通过审核后,同时uni-ad开启了开屏广告,系统就会自动打开开屏广告。

*信息流广告又名原生广告,在应用内列表页不影响用户浏览体验时出现,uni-ad支持四种信息流广告形式模板,两种素材类型(图片和视频)的选择。在创建信息流广告后还可以自定义样式。信息流广告形式也支持H5页面,开发者在后台创建信息流时可选H5平台,然后进行相关广告样式的创建。

*插屏广告是由客户端原生的图片、文本、视频控件组成的弹窗式广告;插屏广告与信息流相比展现尺寸更大,同样能够满足大量曝光和用户转化的需求

*全屏视频广告在应用中可以在游戏闯关结束或者场景切换时让用户进行观看。另外激励视频广告填充不足时也用全屏视频广告来代替。

*激励视频广告用于一些特定的激励场景,该广告类型强制用户观看后(15秒或者30秒)给予一定的奖励,请在创建广告位名称时做好标注,如:激励视频-登录、游戏复活,激励任务。有助于区分场景填充广告

*Draw视频广告是短视频类应用在滑动若干个视频后出现的一种竖屏全屏式的沉浸式体验广告

*短视频内容联盟广告是⼀个视频内容频道,支持上下滑动切换视频内容,在滑动视频后穿插视频广告。这种形式会丰富开发者的应用内容,同时增加了额外的广告收益。如果需要嵌入到页面控制大小请使用短视频内容联盟组件

3. 使用广告位ID(adpid)
新建广告位后,会生成对应的广告位ID,即adpid,需等待广告位审核通过。不同平台广告位的审核速度不一样。

拿到广告位ID,根据开发文档,编写代码,将广告放置到合适的界面。
开发文档详见:uni-ad应用内广告开发指南

注意需确保App里包含优量汇、穿山甲、快手、360、Sigmob等广告sdk。在manifest里或打包界面进行选择。

<a id="shouyi"/>

非收益相关FAQ问题详见:这里(不断更新中)

1、广告收益的高低与什么有关?

  • AppDCloud快捷广告的收益目前比不上渠道SDK广告。DCloud快捷广告偶尔有高收益广告主,但填充率不足。想获得更高广告收益,应克服App的上架等门槛,开通渠道SDK广告。
  • 你的app日活越高,广告收益越高。注意新增渠道SDK广告SDK后,涉及新包升级问题,带渠道SDK广告sdk的日活才有意义。
  • 开通的广告位越多,广告收益越高。开屏、信息流、Banner、激励视频、Push、悬浮红包都开通,赚的更多。单独对比各种广告位,CPM(千次展示收益)排序是:激励视频 > 开屏> 插屏 > 信息流 ,Banner > 悬浮红包 > Push。尤其是激励视频的CPM能达到数百元,单次点击收益几块钱。每天看的激励视频越多,收益越高(每家广告平台每个用户每天播放激励视频不要超过15个,间隔不要太短,否则会触发反作弊)。
  • 你的app权限越多,广告越精准:IMEI(也称电话权限)、位置、本机app列表读取,这些权限都有影响,足够的数据可以推送更精准的广告。
  • 媒体质量分:uni-ad后台会显示媒体质量分,如果分数太低,也就是你的用户的广告转换效果不好。就会影响cpm。注意维护好自己的用户质量,广告的点击不要太频繁。通过实名认证和活体检测来防止机器流量刷广告,插件市场有这方面的插件
  • 持续的新用户:一般情况下,App刚开通广告时,App的用户出于新鲜感,广告效果会好一些。时间变长后,老用户点击广告的概率会下降,造成收益减少。如果App有持续的新增用户,则收益可以持续拉高。好的App大多有裂变传播能力,即用户邀请好友有奖励,甚至有下线机制
  • uni-ad广告联盟,App端的收益,一般CPM(千次展示收益)在几元到几百元不等,与上面提到的开通方式、匹配度、权限有关。
  • 一般iOS广告的CPM高于Android。

最后,重要的事情要强调三遍:“不会玩激励视频,就别指望用广告赚钱”、“不会玩激励视频,就别指望用广告赚钱”、“不会玩激励视频,就别指望用广告赚钱”!
会玩激励视频的开发者,几个人的团队,月收入几十万,这样的案例比比皆是。详见激励视频文档

2、广告收益和日活大约什么关系,1万日活的app一个月大约能赚多少钱?

我们把应用分2类来看,一类是普通App,加些广告变现;一类是围绕广告设计的App,尤其是充分运用激励视频的网赚类App。

  • 先看普通App,以DCloud自己的hello uni-app应用为例
    hello uni-app每个日活用户,对应2.5次开屏曝光,最近一周(2019年1月1日-7日)的开屏cpm日均值为40元。也就是每个日活用户,每天产生1×2.5×40/1000=0.1元的开屏广告收入。
    hello uni-app还开通了信息流广告,每日活用户对应1.8次曝光,最近一周(2019年1月1日-7日)的开屏cpm日均值为24元。也就是每个日活用户,每天产生1×1.8×24/1000=0.0432元的开屏广告收入。
    合计开屏和信息流,1个日活用户日广告收益为0.1432元。
    如果以hello uni-app为例,日活1万的App,每月广告收益可以达到0.1432×30×10000=42960元。

注意必须开渠道SDK广告,DCloud快捷广告的收益达不到上述数字。

  • 再看围绕广告设计的App,尤其是充分运用激励视频的网赚类App
    如果能引导用户大量点击激励视频,比如每天点击30条激励视频,再配合开屏,基本上每日活用户每天可以赚到1.8元的广告费。
    如果有1万日活用户,每天就是1.8万,一个月就是54万。

如果App的次留在30%以上,可以考虑买量。联系uniad@dcloud.io可以进行流量采购,成为uni-ad的广告主。

<a id="bijiao"/>

3、广告收入和谁结算,账期是多久

uni-ad是DCloud的业务,

  • App端服务开通、审核、运营、结算均是DCloud负责。开发者可以申请配置自己的穿山甲账户,由穿山甲直接付款给开发者,具体发邮件到uniad@dcloud.io申请。
  • H5已经支持,请去先发邮件申请uniad@dcloud.io。

App端每月结算上月收益,并且每月有2个结算日分别是4号和19号,我们收到开发者提现后的发票在最近的结算日进行付款。具体说明见uni-ad后台财务结算页面。
开发者可以放心使用DCloud的服务,DCloud是平台月活10亿的大体量公司,可以保证开发者的合理收益和及时结算。对于日活体量较大的App,还可以申请和DCloud签署纸质协议。
uni-ad是DCloud的业务,里面有聚合算法、直营广告,并不是某个三方广告sdk的代理商。开发者使用uni-ad这个服务,综合收益不会低于自己直接接某个广告sdk。
同时DCloud也是各家广告平台的vip客户,拥有设低价等各种普通开发者无法获得的权限。如有这方面需求请联系uniad@dcloud.io。

4、接入uni-ad后,是否还可以接入其他三方广告sdk?
可以。只要这些三方广告sdk不与uni-ad冲突,比如它们提供了独立于uni-ad的其他广告源,开发者可以接入。

5、广告的计费模式是什么样的,cpm、cpc、cpd、cpa、cps?

由于是广告平台,广告主投放什么样的模式都是有的。但App的广告,使用cpc点击计费的不多,大部分是cpm。
但即便是cpm,它的单价不是恒定的,最终是看广告的效果。
开发者切不可自行刷曝光、刷点击,刷广告会被直接停用账户,收益不会结算。
尤其是使用渠道SDK广告的应用,腾讯、字节跳动、360的反作弊能力非常强大,由于原生sdk直接进入手机,甄别作弊能力远超过h5网页,开发者切不可拿着网页里刷流量那套玩法在app里搞。
给广告主提供实打实的广告效果,才是共赢的良好模型。

6、我的App是有属性的,是否可只投放匹配该属性的广告者。

广告平台是根据广告主的意向分配广告的,在筛选数据时载体App的属性只是一个数据项,主要还是看这个设备的imei在广告平台本身的画像。
比如你的app是教育类app,但某个手机设备使用你的app时,广告平台可能发现这个设备是一个年轻女性用户,就可能匹配时尚电商的广告。
单一匹配教育类相关的广告主,很可能会轮空广告位,无法保障变现效果最大化。
uni-ad后台也提供了一定的广告源自助控制界面,比如可以过滤掉成人保健、美容医疗等广告。

7、iOS平台提交App Store审核时,能否暂时屏蔽广告显示?

其实不影响审核,带着广告上线App Store是合规的。当然也可以登录uni-ad广告联盟后台去关闭或停用广告位,这是实时的,不需要审核的。只有停止广告合作协议,才需要审核。

8、广告位的启用停用,是否需要审核

不需要。只有终止广告联盟进行清算,才需要人工审核,其他操作均可在uni-ad后台自助完成。
部分开发者疑惑为什么开通广告不审核,关闭广告审核。这是误解,实际情况是,开通和终止广告联盟,都需要审核。但开通联盟后,开关广告是不需要审核的。另外,大部分抱怨此问题的开发者其实根本没开通广告联盟,此时根本不需要申请终止广告联盟。

9、广告铺量速度问题

使用DCloud快捷广告,是即开即赚钱的。但渠道SDK广告不是这样。
使用渠道SDK广告后,需要打包时带上优量汇、穿山甲、快手、360、Sigmob的原生sdk,否则渠道SDK广告不生效。也就是开发者开通渠道SDK广告,需要把带着sdk的新包,通过整包更新方式铺给用户。在用户没有全面升级到新包前,只有部分用户能为你赚钱。
推荐的方式是,尽早把渠道SDK广告所需的sdk打包进去,先把新包铺量铺下去,可以先不展示任何广告位。然后再开通和调优广告位。这样可以更早赚到更多钱。

10、激励视频的曝光和点击具体是什么意思

激励视频曝光即该广告视频开始播放,但不是播放完毕,播放完毕是客户端提供了回调事件给开发者的代码,同时穿山甲服务器也提供了服务端的回调地址。
一般建议开发者在收到播放完毕的回调事件后再给予用户激励。
激励视频的点击,是指该视频广告里宣传的内容,被点击了,一般会打开一个网页或下载一个应用。

11、广告误开原因汇总及解决办法:

uni-ad的渠道SDK广告,必须在打包时打上对应的sdk才能使用,不会误开。DCloud快捷广告如果误开,参考这篇文章解决 http://ask.dcloud.net.cn/article/13324
遇到appid管理失误又无法联系到appid的所有者进行变更时,请向service@dcloud.io求助。

12、开通渠道SDK广告后,上架华为应用市场提示“您的应用点闪屏广告或者弹窗广告立即下载,请修复”的问题:

这个需要向三方广告平台提出修改应用下载提示权限。请用开发者帐号的邮箱将应用名称和APP ID邮件发送到uniad@dcloud.io,我们会协助开发者进行处理。1-3个工作日。开发者也可选择上架前在uni-ad后台临时关闭广告,审核通过后再启用。

13、开通渠道SDK广告-激励视频后,想要在播放开始后提供跳过关闭问题:

这个需要向三方广告平台提出修改,增加6秒关闭。请注意:这个修改会对CPM有负向影响。请用开发者帐号的邮箱,将应用名称和APP ID邮件发送到uniad@dcloud.io,我们会协助开发者进行处理。

14、媒体分主要从广告效果角度评估,效果维度包括:下载,安装,激活,注册/报名,下单,成交,付费等。媒体分是对媒体应用的整体情况客观展示,不是媒体分低就影响收入。新开通渠道SDK广告的应用媒体分为0,一个月后会更新媒体分。

15、应用在oppo应用市场上架如何获取应用详情页地址用于渠道SDK广告开通审核提交:

在oppo应用市场上架的应用,https://app.cdo.oppomobile.com/home/detail?app_id=30334505 链接的等号后面加上应用在OPPO应用市场上架时获取的APPid即可。

<a id="more"/>

第三章 影响广告收益的技术问题

如果App无法获取imei(电话权限)、idfa(iOS专用)、定位、本机app列表读取等权限,会导致广告sdk无法有效识别终端设备,进行导致广告重复。开通App的imei和定位权限的方法如下:

Android平台引导用户授权获取设备信息(IMEI、IMSI)权限

设备信息对于广告投放平台非常重要,可以通过设备标识信息对用户及设备进行画像,分析用户的属性、行为等,从而大幅提升广告投放的精准度。
默认情况下,开通广告后应用首次启动会自动申请获取设备信息权限,用户可以拒绝授权,应用也可以继续运行,但广告平台也无法获取设备信息导致下发的广告跟用户匹配度不够高,甚至影响广告填充率。因此如果应用能够拥有获取设备信息权限,将会有助于提升广告收益。

在应用中可以强制设置必须授权获取设备信息权限才能运行,用户拒绝授权将会弹出提示框,配置方法:
打开manifest.json文件,切换到“源码视图”项

  • uni-app项目
    在 "app-plus" -> "distribute" -> "android" 节点下添加 permissionPhoneState 节点
  • 5+ App项目
    在 "plus" -> "distribute" -> "google" 节点下添加 permissionPhoneState 节点

permissionPhoneState节点数据格式如下:

    "permissionPhoneState": {  
        "request": "always",  
        "prompt": "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。"  
     }

request字段需设置为"always",表示强制设置应用必须授权获取设备信息权限
prompt字段为用户拒绝获取设备信息权限时弹出提示框上的内容,建议根据应用功能修改为更为友好的提示信息

需提交云端打包才能生效,更多详情及离线打包配置请参考:https://ask.dcloud.net.cn/article/36549

iOS平台使用广告标识IDFA

IDFA是苹果官方提供用于追踪用户的广告标识符,与Android平台的设备信息类似,广告平台可以通过IDFA来分析用户的属性、行为来提升广告投放的精准度。
应用如果使用广告标识,将会有助于提升广告收益。

使用IDFA的配置方法参考:https://ask.dcloud.net.cn/article/36107

引导用户授权定位(位置信息)权限

同样位置信息对于广告平台的用户的属性、行为分析也很重要,如果能够获取位置信息,也可以大幅提升广告投放的精准度,从而提升广告收益。
如果应用中已经使用了定位或地图功能,manifest.json中配置添加百度或高德地图模块则会自动添加定位权限,调用相关功能会自动弹出授权提示框。
如果应用中没有使用定位或地图功能,可以在manifest.json的“App模块权限配置”中配置定位权限:

  • Android平台
    在“Android权限配置”项下勾选android.permission.ACCESS_COARSE_LOCATION、android.permission.ACCESS_FINE_LOCATION权限:
  • iOS平台
    在“iOS隐私信息访问的许可描述”项下输入访问位置信息的描述:

在应用添加业务场景使用定位功能,并引导用户授权定位权限,可以调用以下5+ API进行定位

plus.geolocation.getCurrentPosition(function(p){//成功回调  
  console.log('Geolocation\nLatitude:' + p.coords.latitude + '\nLongitude:' + p.coords.longitude + '\nAltitude:' + p.coords.altitude);  
}, function(e){//失败回调  
  console.log('Geolocation error: ' + e.message);  
});

调用定位API时会弹出系统位置授权框,如果用户拒绝权限将会触发失败回调,可以弹出警告提示某些业务功能无法使用来引导用户授权定位权限。

防刷

为了提升安全性,建议所有使用激励视频的开发者都要做激励视频服务器回调功能,除此之外还可用如下办法来加强安全保护(防止刷量):

  1. 前端代码加密。涉及激励相关的,在manifest中配置好要加密的代码文件,打包后会自动加密相应文件。详见
  2. apk加固。即便前端代码加密,原生层引擎的java代码仍然可能被反编译,需要对apk加固(https://uniapp.dcloud.net.cn/tutorial/app-security.html#%E4%BA%A7%E5%93%81%E7%AE%80%E4%BB%8B)。
  3. 使用如下安全类API,防止客户端被篡改
    • plus.navigator.getSignature 获取应用签名标识。结合在服务器端存放证书信息,可比对判断App的证书是否被重签 规范
    • plus.navigator.isSimulator 判断App是否运行在模拟器环境 规范
    • plus.navigator.isRoot 判断设备是否被root或越狱 规范
    • plus.networkinfo.isSetProxy 判断设备的网络是否设置了代理 规范
  4. 避免使用短信验证码来识别身份,推荐使用微信登录手机号一键登陆
  5. 必要时可使用生物认证(指纹和faceid)活体检测的sdk
  6. 插件市场还有很多插件,比如识别设备质量,防止羊毛党,详见:https://ext.dcloud.net.cn/search?q=%E7%BE%8A%E6%AF%9B&orderBy=UpdatedDate
继续阅读 »

uni-ad官网地址:https://uniad.dcloud.net.cn/
uni-ad常见问题汇总与解答:点击查看
微信小程序广告开通指南:点击这里

近期更新~
1)HBX3.8.12+版本APP端已支持海外广告(谷歌Admob,海外穿山甲,华为),需要开通海外广告的请联系uni-ad官方商务/运营。
2)uni-ad同时支持原生应用的广告接入,uni-ad原生应用广告SDK下载链接以及更新日志:点击查看
3)如App需要通过投放平台买量,请联系uniad@dcloud.io
4)微信小程序广告uni-ad已支持,微信小程序广告开通指南查看这里
5)uni-ad的App端广告已支持百度广告和华为广告,请使用HBuilder3.4.0版本以上打包集成

前言

uni-ad支持个人和企业申请广告。
uni-ad支持APP,H5和微信小程序广告。
uni-adAPP端已支持国内七家广告渠道,包括:优量汇,快手,穿山甲,百度,华为,Sigmob,360。从HBX3.8.12开始已支持海外广告,包括:谷歌Admob,海外穿山甲,华为。我们利用现有12亿活跃用户数据以及多年的技术沉淀来不断升级广告优化策略,确保开发者广告收益的最大化。
uni-ad的App端支持所有DCloud框架开发的APP,包括uni-app的App端及5+App、wap2app,uniCloud项目,都可以使用里面的各种广告(开屏、信息流、激励视频...)
uni-ad支持原生应用的广告接入,点击查看。根据我们的经验:开发者在用原生应用接入广告时通常比uni-app应用接入广告要更费时(uni-app接入广告会比原生节省一半时间),这是由于原生代码相比uni-app的代码繁琐导致部署与调试效率下降。我们建议原生开发者在接入前邮件联系以获取我们专业的技术支持和运营服务:uniad@dcloud.io。uni-ad支持Cocos应用程序的广告接入,具体接入方式请咨询:uniad@dcloud.io
以下是uni-ad所有广告形式的开发文档:
APP端
开屏广告 - 无需开发,在uni-ad后台开通即可生效
信息流广告/原生广告插屏广告全屏视频广告激励视频广告Draw视频广告短视频内容联盟广告
H5端
信息流广告/原生广告
微信小程序端开通指南
信息流广告/原生广告插屏广告激励视频广告格子广告

本文将重点描述DCloud技术架构(uni-app,5+,wap2app,uniCloud)开发的APP端广告开通和常见问题。
微信小程序广告开通指南查看这里

本文分为,第一章:使用指南、第二章:收益相关问题。

创建应用

应用创建不能在uni-ad系统进行,只能在HBuilderX中或开发者web控制台新建应用。

应用创建后可以在manifest.json里查看到Appid。

  • 如果你在HBuilder中开发过App,那么一定已经有过Appid。

  • 如果你使用uni-app开发过H5或小程序,还没有开发App,那么很可能你的项目缺少Appid,需要把你的项目拖到HBuilderX中,打开项目下的manifest文件,获取AppID。

  • 如果你还没有使用过DCloud的工具开发App,请先下载HBuilderX,在里面新建一个uni-app/5+/wap2app应用。

开通广告

创建应用之后 ,进入 uni-ad 广告联盟后台(https://uniad.dcloud.net.cn) ,使用 创建应用的DCloud 账号登陆广告联盟管理后台

点击左侧 广告设置,在右侧应用列表找到需要开通的应用,点击 开通广告,进入广告开通页面。

注意:

  • 如果列表中没有你想要的应用,请注意检查你登录uni-ad后台的账户是否是应用的创建者或所有者。如果仅仅是协作者,是不能操作广告后台的。
  • 可以申请转让应用,具体参考https://ask.dcloud.net.cn/article/12861

1. 实名认证

如果当前账号没有进行实名认证,需要点击账户管理并进行实名认证,才能继续使用广告联盟。

2. 财务信息审核

如果当前账号没有进行财务信息审核,需要财务信息并进行财务信息审核,才能继续使用广告联盟。

如果没有完成实名认证、财务信息审核,在HBuilderX的打包界面勾上广告也是没效果的。

3. 开通DCloud快捷广告

uni-ad分DCloud快捷广告和渠道SDK广告。
DCloud快捷广告的特点是:

  • 审核门槛较低;
  • 无需集成三方SDK,云端直接控制开关
  • 但目前的平均收益不及渠道SDK广告。当有大广告主向DCloud直投广告时,DCloud快捷广告的收益在投放期会非常高,高于渠道SDK广告。但目前这种投放密度还不够,常态下的收益不及渠道SDK广告。
    广告开通渠道中选择DCloud快捷广告,广告类型 开屏PUSH至少勾选一个,点击页面最下方 申请开通 即可开通DCloud快捷广告。

Tips:

  • 广告类型 至少勾选一项,才会开启DCloud快捷广告,否则不会开启。
  • 申请开通广告联盟需要审核,DCloud 一般在1-2个工作日内处理申请,遇节假日顺延,请您及时关注后台变化。
  • 真机运行广告不生效,需打包后生效。

4. 开通渠道SDK广告

渠道SDK广告需要集成三方SDK,如腾讯优量汇、字节跳动穿山甲、快手广告(无上架要求,但需提供软著)、360广告联盟、Sigmob广告(无上架要求,无需软著)。审核门槛较高,广告收益更高。

开通渠道SDK广告,需要选择渠道SDK广告并打开是否开启渠道SDK广告按钮。

设置渠道SDK广告相关信息,点击申请开通,即可开通广告。

Tips:

  • 可以只开通安卓或只开通iOS
  • 如果选择开通安卓平台,除了快手、Sigmob广告,其他广告平台均要求在主流的应用商店上线。大部分应用商店会要求著作权证书。以下应用市场暂无软著要求:
    • 酷安市场:没有著作权要求,审核较慢。(只能用于渠道SDK广告中优量汇审核)
    • Google Play:不要求著作权,开发者账号收费25美元 (2020年7月2日以后穿山甲平台已不再支持该应用市场。只能用于渠道SDK广告优量汇审核。如果是强依赖聚合激励视频的网赚类应用,离不开穿山甲,所以不适合这种方式)。
    • 豌豆荚(阿里应用分发平台):不要求著作权,但应用不涉及金融、贷款、医疗等特殊行业内容,可以暂时使用开发者声明代替。
    • 安智:不需要著作权,但打包了推广的上架服务,费用为5000元(某些特定行业分类无法上架,需沟通)。
    • vivo 应用商店:需根据app类型来确定审核所需要的资质。不在表内的app可尝试无著作权提交。特殊行业类资质要求
  • DCloud协调了三方合作伙伴给予DCloud开发者申请著作权的特惠价格,包括加急服务,详情加QQ群893532138了解。
  • 开通渠道SDK广告需要审核,DCloud正常审核时间是1-2个工作日,遇节假日顺延,请您及时关注后台变化。如果超过3个工作日还未审核成功,请联系:uniad@dcloud.io。
  • 三方广告SDK真机运行不生效,打包后生效,并且需要HBuilderX 2.5.11+版本,manifest或打包界面选择渠道SDK广告SDK。

5. 广告管理及新增广告位

开通广告并审核通过后,在应用列表点击应用详情,进行广告管理

1. 开屏广告设置
点击开启开屏广告,可以选择是否在应用中展示开屏广告。开屏广告无需开发,直接云端开启关闭。但注意如需使用渠道SDK开屏广告,如优量汇开屏,需确保App里包含优量汇的sdk。在manifest里或打包界面里,要选择相应的SDK。

2. 应用内广告位设置

应用内广告是需要编程的,它用于信息流/原生广告激励视频全屏视频等广告场景。信息流可以模拟插屏的广告形式具体参考:信息流文档中的“使用 ad/ad-draw 模拟插屏广告效果”部分。

首先点击 新增广告位

填写广告位名称(此名称仅用于开发者自己的识别和报表展现),选择广告类型,即可新建广告位

*开屏广告不需要单独申请,也不需要开发者进行编码。开发者的应用通过审核后,同时uni-ad开启了开屏广告,系统就会自动打开开屏广告。

*信息流广告又名原生广告,在应用内列表页不影响用户浏览体验时出现,uni-ad支持四种信息流广告形式模板,两种素材类型(图片和视频)的选择。在创建信息流广告后还可以自定义样式。信息流广告形式也支持H5页面,开发者在后台创建信息流时可选H5平台,然后进行相关广告样式的创建。

*插屏广告是由客户端原生的图片、文本、视频控件组成的弹窗式广告;插屏广告与信息流相比展现尺寸更大,同样能够满足大量曝光和用户转化的需求

*全屏视频广告在应用中可以在游戏闯关结束或者场景切换时让用户进行观看。另外激励视频广告填充不足时也用全屏视频广告来代替。

*激励视频广告用于一些特定的激励场景,该广告类型强制用户观看后(15秒或者30秒)给予一定的奖励,请在创建广告位名称时做好标注,如:激励视频-登录、游戏复活,激励任务。有助于区分场景填充广告

*Draw视频广告是短视频类应用在滑动若干个视频后出现的一种竖屏全屏式的沉浸式体验广告

*短视频内容联盟广告是⼀个视频内容频道,支持上下滑动切换视频内容,在滑动视频后穿插视频广告。这种形式会丰富开发者的应用内容,同时增加了额外的广告收益。如果需要嵌入到页面控制大小请使用短视频内容联盟组件

3. 使用广告位ID(adpid)
新建广告位后,会生成对应的广告位ID,即adpid,需等待广告位审核通过。不同平台广告位的审核速度不一样。

拿到广告位ID,根据开发文档,编写代码,将广告放置到合适的界面。
开发文档详见:uni-ad应用内广告开发指南

注意需确保App里包含优量汇、穿山甲、快手、360、Sigmob等广告sdk。在manifest里或打包界面进行选择。

<a id="shouyi"/>

非收益相关FAQ问题详见:这里(不断更新中)

1、广告收益的高低与什么有关?

  • AppDCloud快捷广告的收益目前比不上渠道SDK广告。DCloud快捷广告偶尔有高收益广告主,但填充率不足。想获得更高广告收益,应克服App的上架等门槛,开通渠道SDK广告。
  • 你的app日活越高,广告收益越高。注意新增渠道SDK广告SDK后,涉及新包升级问题,带渠道SDK广告sdk的日活才有意义。
  • 开通的广告位越多,广告收益越高。开屏、信息流、Banner、激励视频、Push、悬浮红包都开通,赚的更多。单独对比各种广告位,CPM(千次展示收益)排序是:激励视频 > 开屏> 插屏 > 信息流 ,Banner > 悬浮红包 > Push。尤其是激励视频的CPM能达到数百元,单次点击收益几块钱。每天看的激励视频越多,收益越高(每家广告平台每个用户每天播放激励视频不要超过15个,间隔不要太短,否则会触发反作弊)。
  • 你的app权限越多,广告越精准:IMEI(也称电话权限)、位置、本机app列表读取,这些权限都有影响,足够的数据可以推送更精准的广告。
  • 媒体质量分:uni-ad后台会显示媒体质量分,如果分数太低,也就是你的用户的广告转换效果不好。就会影响cpm。注意维护好自己的用户质量,广告的点击不要太频繁。通过实名认证和活体检测来防止机器流量刷广告,插件市场有这方面的插件
  • 持续的新用户:一般情况下,App刚开通广告时,App的用户出于新鲜感,广告效果会好一些。时间变长后,老用户点击广告的概率会下降,造成收益减少。如果App有持续的新增用户,则收益可以持续拉高。好的App大多有裂变传播能力,即用户邀请好友有奖励,甚至有下线机制
  • uni-ad广告联盟,App端的收益,一般CPM(千次展示收益)在几元到几百元不等,与上面提到的开通方式、匹配度、权限有关。
  • 一般iOS广告的CPM高于Android。

最后,重要的事情要强调三遍:“不会玩激励视频,就别指望用广告赚钱”、“不会玩激励视频,就别指望用广告赚钱”、“不会玩激励视频,就别指望用广告赚钱”!
会玩激励视频的开发者,几个人的团队,月收入几十万,这样的案例比比皆是。详见激励视频文档

2、广告收益和日活大约什么关系,1万日活的app一个月大约能赚多少钱?

我们把应用分2类来看,一类是普通App,加些广告变现;一类是围绕广告设计的App,尤其是充分运用激励视频的网赚类App。

  • 先看普通App,以DCloud自己的hello uni-app应用为例
    hello uni-app每个日活用户,对应2.5次开屏曝光,最近一周(2019年1月1日-7日)的开屏cpm日均值为40元。也就是每个日活用户,每天产生1×2.5×40/1000=0.1元的开屏广告收入。
    hello uni-app还开通了信息流广告,每日活用户对应1.8次曝光,最近一周(2019年1月1日-7日)的开屏cpm日均值为24元。也就是每个日活用户,每天产生1×1.8×24/1000=0.0432元的开屏广告收入。
    合计开屏和信息流,1个日活用户日广告收益为0.1432元。
    如果以hello uni-app为例,日活1万的App,每月广告收益可以达到0.1432×30×10000=42960元。

注意必须开渠道SDK广告,DCloud快捷广告的收益达不到上述数字。

  • 再看围绕广告设计的App,尤其是充分运用激励视频的网赚类App
    如果能引导用户大量点击激励视频,比如每天点击30条激励视频,再配合开屏,基本上每日活用户每天可以赚到1.8元的广告费。
    如果有1万日活用户,每天就是1.8万,一个月就是54万。

如果App的次留在30%以上,可以考虑买量。联系uniad@dcloud.io可以进行流量采购,成为uni-ad的广告主。

<a id="bijiao"/>

3、广告收入和谁结算,账期是多久

uni-ad是DCloud的业务,

  • App端服务开通、审核、运营、结算均是DCloud负责。开发者可以申请配置自己的穿山甲账户,由穿山甲直接付款给开发者,具体发邮件到uniad@dcloud.io申请。
  • H5已经支持,请去先发邮件申请uniad@dcloud.io。

App端每月结算上月收益,并且每月有2个结算日分别是4号和19号,我们收到开发者提现后的发票在最近的结算日进行付款。具体说明见uni-ad后台财务结算页面。
开发者可以放心使用DCloud的服务,DCloud是平台月活10亿的大体量公司,可以保证开发者的合理收益和及时结算。对于日活体量较大的App,还可以申请和DCloud签署纸质协议。
uni-ad是DCloud的业务,里面有聚合算法、直营广告,并不是某个三方广告sdk的代理商。开发者使用uni-ad这个服务,综合收益不会低于自己直接接某个广告sdk。
同时DCloud也是各家广告平台的vip客户,拥有设低价等各种普通开发者无法获得的权限。如有这方面需求请联系uniad@dcloud.io。

4、接入uni-ad后,是否还可以接入其他三方广告sdk?
可以。只要这些三方广告sdk不与uni-ad冲突,比如它们提供了独立于uni-ad的其他广告源,开发者可以接入。

5、广告的计费模式是什么样的,cpm、cpc、cpd、cpa、cps?

由于是广告平台,广告主投放什么样的模式都是有的。但App的广告,使用cpc点击计费的不多,大部分是cpm。
但即便是cpm,它的单价不是恒定的,最终是看广告的效果。
开发者切不可自行刷曝光、刷点击,刷广告会被直接停用账户,收益不会结算。
尤其是使用渠道SDK广告的应用,腾讯、字节跳动、360的反作弊能力非常强大,由于原生sdk直接进入手机,甄别作弊能力远超过h5网页,开发者切不可拿着网页里刷流量那套玩法在app里搞。
给广告主提供实打实的广告效果,才是共赢的良好模型。

6、我的App是有属性的,是否可只投放匹配该属性的广告者。

广告平台是根据广告主的意向分配广告的,在筛选数据时载体App的属性只是一个数据项,主要还是看这个设备的imei在广告平台本身的画像。
比如你的app是教育类app,但某个手机设备使用你的app时,广告平台可能发现这个设备是一个年轻女性用户,就可能匹配时尚电商的广告。
单一匹配教育类相关的广告主,很可能会轮空广告位,无法保障变现效果最大化。
uni-ad后台也提供了一定的广告源自助控制界面,比如可以过滤掉成人保健、美容医疗等广告。

7、iOS平台提交App Store审核时,能否暂时屏蔽广告显示?

其实不影响审核,带着广告上线App Store是合规的。当然也可以登录uni-ad广告联盟后台去关闭或停用广告位,这是实时的,不需要审核的。只有停止广告合作协议,才需要审核。

8、广告位的启用停用,是否需要审核

不需要。只有终止广告联盟进行清算,才需要人工审核,其他操作均可在uni-ad后台自助完成。
部分开发者疑惑为什么开通广告不审核,关闭广告审核。这是误解,实际情况是,开通和终止广告联盟,都需要审核。但开通联盟后,开关广告是不需要审核的。另外,大部分抱怨此问题的开发者其实根本没开通广告联盟,此时根本不需要申请终止广告联盟。

9、广告铺量速度问题

使用DCloud快捷广告,是即开即赚钱的。但渠道SDK广告不是这样。
使用渠道SDK广告后,需要打包时带上优量汇、穿山甲、快手、360、Sigmob的原生sdk,否则渠道SDK广告不生效。也就是开发者开通渠道SDK广告,需要把带着sdk的新包,通过整包更新方式铺给用户。在用户没有全面升级到新包前,只有部分用户能为你赚钱。
推荐的方式是,尽早把渠道SDK广告所需的sdk打包进去,先把新包铺量铺下去,可以先不展示任何广告位。然后再开通和调优广告位。这样可以更早赚到更多钱。

10、激励视频的曝光和点击具体是什么意思

激励视频曝光即该广告视频开始播放,但不是播放完毕,播放完毕是客户端提供了回调事件给开发者的代码,同时穿山甲服务器也提供了服务端的回调地址。
一般建议开发者在收到播放完毕的回调事件后再给予用户激励。
激励视频的点击,是指该视频广告里宣传的内容,被点击了,一般会打开一个网页或下载一个应用。

11、广告误开原因汇总及解决办法:

uni-ad的渠道SDK广告,必须在打包时打上对应的sdk才能使用,不会误开。DCloud快捷广告如果误开,参考这篇文章解决 http://ask.dcloud.net.cn/article/13324
遇到appid管理失误又无法联系到appid的所有者进行变更时,请向service@dcloud.io求助。

12、开通渠道SDK广告后,上架华为应用市场提示“您的应用点闪屏广告或者弹窗广告立即下载,请修复”的问题:

这个需要向三方广告平台提出修改应用下载提示权限。请用开发者帐号的邮箱将应用名称和APP ID邮件发送到uniad@dcloud.io,我们会协助开发者进行处理。1-3个工作日。开发者也可选择上架前在uni-ad后台临时关闭广告,审核通过后再启用。

13、开通渠道SDK广告-激励视频后,想要在播放开始后提供跳过关闭问题:

这个需要向三方广告平台提出修改,增加6秒关闭。请注意:这个修改会对CPM有负向影响。请用开发者帐号的邮箱,将应用名称和APP ID邮件发送到uniad@dcloud.io,我们会协助开发者进行处理。

14、媒体分主要从广告效果角度评估,效果维度包括:下载,安装,激活,注册/报名,下单,成交,付费等。媒体分是对媒体应用的整体情况客观展示,不是媒体分低就影响收入。新开通渠道SDK广告的应用媒体分为0,一个月后会更新媒体分。

15、应用在oppo应用市场上架如何获取应用详情页地址用于渠道SDK广告开通审核提交:

在oppo应用市场上架的应用,https://app.cdo.oppomobile.com/home/detail?app_id=30334505 链接的等号后面加上应用在OPPO应用市场上架时获取的APPid即可。

<a id="more"/>

第三章 影响广告收益的技术问题

如果App无法获取imei(电话权限)、idfa(iOS专用)、定位、本机app列表读取等权限,会导致广告sdk无法有效识别终端设备,进行导致广告重复。开通App的imei和定位权限的方法如下:

Android平台引导用户授权获取设备信息(IMEI、IMSI)权限

设备信息对于广告投放平台非常重要,可以通过设备标识信息对用户及设备进行画像,分析用户的属性、行为等,从而大幅提升广告投放的精准度。
默认情况下,开通广告后应用首次启动会自动申请获取设备信息权限,用户可以拒绝授权,应用也可以继续运行,但广告平台也无法获取设备信息导致下发的广告跟用户匹配度不够高,甚至影响广告填充率。因此如果应用能够拥有获取设备信息权限,将会有助于提升广告收益。

在应用中可以强制设置必须授权获取设备信息权限才能运行,用户拒绝授权将会弹出提示框,配置方法:
打开manifest.json文件,切换到“源码视图”项

  • uni-app项目
    在 "app-plus" -> "distribute" -> "android" 节点下添加 permissionPhoneState 节点
  • 5+ App项目
    在 "plus" -> "distribute" -> "google" 节点下添加 permissionPhoneState 节点

permissionPhoneState节点数据格式如下:

    "permissionPhoneState": {  
        "request": "always",  
        "prompt": "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。"  
     }

request字段需设置为"always",表示强制设置应用必须授权获取设备信息权限
prompt字段为用户拒绝获取设备信息权限时弹出提示框上的内容,建议根据应用功能修改为更为友好的提示信息

需提交云端打包才能生效,更多详情及离线打包配置请参考:https://ask.dcloud.net.cn/article/36549

iOS平台使用广告标识IDFA

IDFA是苹果官方提供用于追踪用户的广告标识符,与Android平台的设备信息类似,广告平台可以通过IDFA来分析用户的属性、行为来提升广告投放的精准度。
应用如果使用广告标识,将会有助于提升广告收益。

使用IDFA的配置方法参考:https://ask.dcloud.net.cn/article/36107

引导用户授权定位(位置信息)权限

同样位置信息对于广告平台的用户的属性、行为分析也很重要,如果能够获取位置信息,也可以大幅提升广告投放的精准度,从而提升广告收益。
如果应用中已经使用了定位或地图功能,manifest.json中配置添加百度或高德地图模块则会自动添加定位权限,调用相关功能会自动弹出授权提示框。
如果应用中没有使用定位或地图功能,可以在manifest.json的“App模块权限配置”中配置定位权限:

  • Android平台
    在“Android权限配置”项下勾选android.permission.ACCESS_COARSE_LOCATION、android.permission.ACCESS_FINE_LOCATION权限:
  • iOS平台
    在“iOS隐私信息访问的许可描述”项下输入访问位置信息的描述:

在应用添加业务场景使用定位功能,并引导用户授权定位权限,可以调用以下5+ API进行定位

plus.geolocation.getCurrentPosition(function(p){//成功回调  
  console.log('Geolocation\nLatitude:' + p.coords.latitude + '\nLongitude:' + p.coords.longitude + '\nAltitude:' + p.coords.altitude);  
}, function(e){//失败回调  
  console.log('Geolocation error: ' + e.message);  
});

调用定位API时会弹出系统位置授权框,如果用户拒绝权限将会触发失败回调,可以弹出警告提示某些业务功能无法使用来引导用户授权定位权限。

防刷

为了提升安全性,建议所有使用激励视频的开发者都要做激励视频服务器回调功能,除此之外还可用如下办法来加强安全保护(防止刷量):

  1. 前端代码加密。涉及激励相关的,在manifest中配置好要加密的代码文件,打包后会自动加密相应文件。详见
  2. apk加固。即便前端代码加密,原生层引擎的java代码仍然可能被反编译,需要对apk加固(https://uniapp.dcloud.net.cn/tutorial/app-security.html#%E4%BA%A7%E5%93%81%E7%AE%80%E4%BB%8B)。
  3. 使用如下安全类API,防止客户端被篡改
    • plus.navigator.getSignature 获取应用签名标识。结合在服务器端存放证书信息,可比对判断App的证书是否被重签 规范
    • plus.navigator.isSimulator 判断App是否运行在模拟器环境 规范
    • plus.navigator.isRoot 判断设备是否被root或越狱 规范
    • plus.networkinfo.isSetProxy 判断设备的网络是否设置了代理 规范
  4. 避免使用短信验证码来识别身份,推荐使用微信登录手机号一键登陆
  5. 必要时可使用生物认证(指纹和faceid)活体检测的sdk
  6. 插件市场还有很多插件,比如识别设备质量,防止羊毛党,详见:https://ext.dcloud.net.cn/search?q=%E7%BE%8A%E6%AF%9B&orderBy=UpdatedDate
收起阅读 »

文档api的平台差异说明能否改进一下?

文档上的属性平台差异说明真的看的是模棱两可。
比如某个api属性,平台差异只写上H5+,那么是支持还是不支持?我和同事两脸懵逼啊!只能去测试,然后其他人估计也是差不多这样,阅读和开发起来效率就不是很好了。希望官方能改进,写好文档的东西也不是很难,强烈建议写明白清楚!
如下图,我一开始以为是支持除了h5不支持,结果测试了半天才发现根本不支持!
而且这样的情况已经不是一次两次了,有的就还好,有的就需要自己看着办?文档本来就应该清晰明了啊

继续阅读 »

文档上的属性平台差异说明真的看的是模棱两可。
比如某个api属性,平台差异只写上H5+,那么是支持还是不支持?我和同事两脸懵逼啊!只能去测试,然后其他人估计也是差不多这样,阅读和开发起来效率就不是很好了。希望官方能改进,写好文档的东西也不是很难,强烈建议写明白清楚!
如下图,我一开始以为是支持除了h5不支持,结果测试了半天才发现根本不支持!
而且这样的情况已经不是一次两次了,有的就还好,有的就需要自己看着办?文档本来就应该清晰明了啊

收起阅读 »

Hippy

Hippy腾讯?

Hippy腾讯?

WebStorm 开发 UNI-APP 配置

推送插件配置指南

=======================================================================================
知识点:
=======================================================================================
引自 W3School 教程:
=======================================================================================
XSD
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
=======================================================================================
DTD
文档类型定义(Document Type Definition)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
<!DOCTYPE 根元素 [元素声明]>
=======================================================================================
安装保存 uni-app d.ts 声明文件

npm install --save @types/uni-app

源 https://www.npmjs.com/package/@types/uni-app
=======================================================================================
配置WebStorm (xsd文件 在附件里), (命令行运行与编译 npm run dev: ,npm run build:,这个不详写:官方-看这里)过桥不能拆板 推荐配合 使用HBuilerX IDE 打包与调试


=======================================================================================
<<xsd文件 在这里 >>

继续阅读 »

=======================================================================================
知识点:
=======================================================================================
引自 W3School 教程:
=======================================================================================
XSD
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
=======================================================================================
DTD
文档类型定义(Document Type Definition)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
<!DOCTYPE 根元素 [元素声明]>
=======================================================================================
安装保存 uni-app d.ts 声明文件

npm install --save @types/uni-app

源 https://www.npmjs.com/package/@types/uni-app
=======================================================================================
配置WebStorm (xsd文件 在附件里), (命令行运行与编译 npm run dev: ,npm run build:,这个不详写:官方-看这里)过桥不能拆板 推荐配合 使用HBuilerX IDE 打包与调试


=======================================================================================
<<xsd文件 在这里 >>

收起阅读 »

uniapp兼容electron踩坑

uniapp

1、环境
electron 7.1.7
electron-package 14.1.1

2、修改
①package.json:
electron打包命令修改
"electron":"electron main.js"

②mainfest.json:
index.html页面里静态资源路径
"h5": {
"template": "index.html",
"publicPath":"./"
}

③uniapp源码修改
1)底部tabbar路径修改
node_modules/@dcloudio/uni-h5/dist/index.umd.min.js
_getRealPath方法修改:

_getRealPath: function (t) {  
                            return 0 !== t.indexOf("/") && (t = "/" + t), Object(i["a"])(t)  
                        }

修改成

_getRealPath: function (t) {  
                            return 0 !== t.indexOf("/") && (t = t), Object(i["a"])(t)  
                        }

2)静态资源路径修改
在vue.config.js里修改
(尝试了方案,没有起作用,和官网说的不一样啊)

④关于electron配置
1)出现不可引用本地资源错误:
在main.js添加配置
webPreferences: {
webSecurity: false
}
同时静态资源不要放在dist目录;

2)出现打包错误
package.json里添加入口配置
"main": "main.js",

3) 打包完成后,应用打开乱码,或者js报错
是electron-pakcage问题,尝试多打包几次就好

4)应用静态资源要加http(s)头,否则是按本地资源加载,会把错
5)使用electron-package打包,使用命令行不够灵活
可以使用js脚本,引入electron-package进行打包,更加灵活

6)关于electron API
①document.location.protocol 结果是 file:

继续阅读 »

1、环境
electron 7.1.7
electron-package 14.1.1

2、修改
①package.json:
electron打包命令修改
"electron":"electron main.js"

②mainfest.json:
index.html页面里静态资源路径
"h5": {
"template": "index.html",
"publicPath":"./"
}

③uniapp源码修改
1)底部tabbar路径修改
node_modules/@dcloudio/uni-h5/dist/index.umd.min.js
_getRealPath方法修改:

_getRealPath: function (t) {  
                            return 0 !== t.indexOf("/") && (t = "/" + t), Object(i["a"])(t)  
                        }

修改成

_getRealPath: function (t) {  
                            return 0 !== t.indexOf("/") && (t = t), Object(i["a"])(t)  
                        }

2)静态资源路径修改
在vue.config.js里修改
(尝试了方案,没有起作用,和官网说的不一样啊)

④关于electron配置
1)出现不可引用本地资源错误:
在main.js添加配置
webPreferences: {
webSecurity: false
}
同时静态资源不要放在dist目录;

2)出现打包错误
package.json里添加入口配置
"main": "main.js",

3) 打包完成后,应用打开乱码,或者js报错
是electron-pakcage问题,尝试多打包几次就好

4)应用静态资源要加http(s)头,否则是按本地资源加载,会把错
5)使用electron-package打包,使用命令行不够灵活
可以使用js脚本,引入electron-package进行打包,更加灵活

6)关于electron API
①document.location.protocol 结果是 file:

收起阅读 »

uniapp 采用按照官网文档集成离线打包,出现点击图标无法打开应用情况,后台报找不到类io.dcloud.PandoraEntryActivity,另外uniapp离线打包不显示上部导航栏问题

问题:1.uniapp 采用按照官网文档文档教程集成离线打包,出现点击图标无法打开应用情况,后台报找不到类io.dcloud.PandoraEntryActivity,

解决:在AndroidManifest.xml文件添加这部分代码,这个官网文档教程并未指出。

 <activity   

     android:name="io.dcloud.PandoraEntryActivity"  

     android:launchMode="singleTask"  

     android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|fontScale|keyboard"  

     android:hardwareAccelerated="true"  

     android:permission="com.miui.securitycenter.permission.AppPermissionsEditor"  

     android:screenOrientation="user"  

     android:theme="@style/DCloudTheme"  

     android:windowSoftInputMode="adjustResize">  

        <intent-filter>  

            <category   android:name="android.intent.category.DEFAULT" />  

            <category   android:name="android.intent.category.BROWSABLE" />  

            <action  android:name="android.intent.action.VIEW" />  

            <data  android:scheme="h56131bcf" />  

        </intent-filter>  

</activity>  

问题 2:. uniapp离线打包不显示上部导航栏,
解决:是需要加入android-gif-drawable-release@1.2.17.aar插件 ;这个是参考zyfking@hotmail.com 提供的方案的解决的,链接:https://ask.dcloud.net.cn/question/77861

继续阅读 »

问题:1.uniapp 采用按照官网文档文档教程集成离线打包,出现点击图标无法打开应用情况,后台报找不到类io.dcloud.PandoraEntryActivity,

解决:在AndroidManifest.xml文件添加这部分代码,这个官网文档教程并未指出。

 <activity   

     android:name="io.dcloud.PandoraEntryActivity"  

     android:launchMode="singleTask"  

     android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|fontScale|keyboard"  

     android:hardwareAccelerated="true"  

     android:permission="com.miui.securitycenter.permission.AppPermissionsEditor"  

     android:screenOrientation="user"  

     android:theme="@style/DCloudTheme"  

     android:windowSoftInputMode="adjustResize">  

        <intent-filter>  

            <category   android:name="android.intent.category.DEFAULT" />  

            <category   android:name="android.intent.category.BROWSABLE" />  

            <action  android:name="android.intent.action.VIEW" />  

            <data  android:scheme="h56131bcf" />  

        </intent-filter>  

</activity>  

问题 2:. uniapp离线打包不显示上部导航栏,
解决:是需要加入android-gif-drawable-release@1.2.17.aar插件 ;这个是参考zyfking@hotmail.com 提供的方案的解决的,链接:https://ask.dcloud.net.cn/question/77861

收起阅读 »

IOS上下拖动背景色(白色),修改方法

解决代码如下:
VUE-页面:

<template>  
  <view :class="'content ' + Skin">  
    <image class="img_background"></image>

CSS-样式:

.img_background{  
  z-index: -1;  
  width: 100%;  
  height: 100%;  
  position: fixed;  
  top: 0;  
  background-color: #1e2c35; // 其它颜色  
// 背景图片  
  /* background: url('http://m.360buyimg.com/marketingminiapp/jfs/t23068/25/834363295/3013355/77286696/5b459faaN3f3bc27f.png') no-repeat; */  
  /* background-size: cover; */  
}

修改前后对照(看附件):

继续阅读 »

解决代码如下:
VUE-页面:

<template>  
  <view :class="'content ' + Skin">  
    <image class="img_background"></image>

CSS-样式:

.img_background{  
  z-index: -1;  
  width: 100%;  
  height: 100%;  
  position: fixed;  
  top: 0;  
  background-color: #1e2c35; // 其它颜色  
// 背景图片  
  /* background: url('http://m.360buyimg.com/marketingminiapp/jfs/t23068/25/834363295/3013355/77286696/5b459faaN3f3bc27f.png') no-repeat; */  
  /* background-size: cover; */  
}

修改前后对照(看附件):

收起阅读 »

自定义tabbar,支持H5,app,微信小程序中间凸起,支持uni.switchTab()跳转

tabbar

浏览了很多关于uniapp的自定义tabbar的文章,很多感觉都写的不详细,而且跨端能力都不怎么样,我自己研究整理了一下:

跨端支持:H5、app、微信小程序,

H5效果图如下:



微信小程序效果图如下:

app的效果图没有截取到,但应该是可行的。

目录结构如下:

page.json的配置如下:

{  
    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages  
        {  
            "path": "pages/index/index",  
            "style": {  
                "navigationBarTitleText": "首页"  
            }  
        },{  
            "path": "pages/dynamic/dynamic",  
            "style": {  
                "navigationBarTitleText": "发现"  
            }  
        },{  
            "path": "pages/release/release",  
            "style": {  
                "navigationBarTitleText": "发布"  
            }  
        },{  
            "path": "pages/friend/friend",  
            "style": {  
                "navigationBarTitleText": "朋友"  
            }  
        },{  
            "path": "pages/mine/mine",  
            "style": {  
                "navigationBarTitleText": "我的"  
            }  
        }  
    ],  
    "globalStyle": {  
        "navigationBarTextStyle": "black",  
        "navigationBarTitleText": "uni-app",  
        "navigationBarBackgroundColor": "#F8F8F8",  
        "backgroundColor": "#F8F8F8"  
    },  
    "tabBar": {  
        "color": "#999999",  
        "selectedColor": "#66CCFF",  
        "borderStyle": "black",  
        "backgroundColor": "#ffffff",  
        "midButton": {  
            "text": "发布",  
            "pagePath": "pages/release/release",  
            "iconPath": "static/images/tabbar/release.png",  
            "selectedIconPath": "static/images/tabbar/release-select.png"  
        },  
        "list": [{  
            "pagePath": "pages/index/index",  
            "iconPath": "static/images/tabbar/index.png",  
            "selectedIconPath": "static/images/tabbar/index-select.png",  
            "text": "首页"  
        },{  
            "pagePath": "pages/dynamic/dynamic",  
            "iconPath": "static/images/tabbar/dynamic.png",  
            "selectedIconPath": "static/images/tabbar/dynamic-select.png",  
            "text": "发现"  
        },  
        // #ifndef APP-PLUS  
        {  
            "pagePath": "pages/release/release",  
            "iconPath": "static/images/tabbar/release.png",  
            "selectedIconPath": "static/images/tabbar/release-select.png",  
            "text": "发布"  
        },  
        // #endif  
        {  
            "pagePath": "pages/friend/friend",  
            "iconPath": "static/images/tabbar/friend.png",  
            "selectedIconPath": "static/images/tabbar/friend-select.png",  
            "text": "朋友"  
        },{  
            "pagePath": "pages/mine/mine",  
            "iconPath": "static/images/tabbar/mine.png",  
            "selectedIconPath": "static/images/tabbar/mine-select.png",  
            "text": "我的"  
        }]  
    }  
}  

注册全局组件tabbar在main.js文件中,配置如下:

import Vue from 'vue'  
import App from './App'  
import rwjTabbar from './components/rwj-tabbar.vue'  

Vue.config.productionTip = false  

//注册全局组件  
Vue.component('rwj-tabbar', rwjTabbar);  
App.mpType = 'app'  

const app = new Vue({  
    ...App  
})  
app.$mount()  


rwj-tabbar.vue文件编写:

<template>  
    <view class="tabbar-container">  
        <block>  
            <view class="tabbar-item" v-for="(item,index) in tabbarList" :class="[item.centerItem ? ' center-item' : '']" @click="changeItem(item)">  
                <view class="item-top">  
                    <image :src="currentItem==item.id?item.selectIcon:item.icon"></image>  
                </view>  
                <view class="item-bottom" :class="[currentItem==item.id ? 'item-active' : '']">  
                    <text>{{item.text}}</text>  
                </view>  
            </view>  
        </block>  

    </view>  
</template>  

<script>  
    export default {  
        props:{  
            currentPage: {  
                type: Number,  
                default: 0  
            }  
        },  
        data() {  
            return {  
                currentItem: 0,  
                tabbarList: [  
                    {  
                        id: 0,  
                        path: "/pages/index/index",  
                        icon: "/static/images/tabbar/index.png",  
                        selectIcon: "/static/images/tabbar/index-select.png",  
                        text: "首页",  
                        centerItem: false  
                    },{  
                        id: 1,  
                        path: "/pages/dynamic/dynamic",  
                        icon: "/static/images/tabbar/dynamic.png",  
                        selectIcon: "/static/images/tabbar/dynamic-select.png",  
                        text: "动态",  
                        centerItem: false  
                    },{  
                        id: 2,  
                        path: "/pages/release/release",  
                        icon: "/static/images/tabbar/release.png",  
                        selectIcon: "/static/images/tabbar/release-select.png",  
                        text: "发布",  
                        centerItem: true  
                    },{  
                        id: 3,  
                        path: "/pages/friend/friend",  
                        icon: "/static/images/tabbar/friend.png",  
                        selectIcon: "/static/images/tabbar/friend-select.png",  
                        text: "朋友",  
                        centerItem: false  
                    },{  
                        id: 4,  
                        path: "/pages/mine/mine",  
                        icon: "/static/images/tabbar/mine.png",  
                        selectIcon: "/static/images/tabbar/mine-select.png",  
                        text: "我的",  
                        centerItem: false  
                    }  
                ]  

            };  
        },  
        mounted(){  
            this.currentItem = this.currentPage;  
            uni.hideTabBar();  
        },  
        methods: {  
            changeItem(item){  
                let _this = this;  
                //_this.currentItem = item.id;  
                uni.switchTab({  
                    url: item.path  
                });  
            }  
        }  
    }  
</script>  
<style>  
        view{  
               padding: 0;  
               margin: 0;  
               box-sizing: border-box;  
        }  
    .tabbar-container{  
        position: fixed;  
        bottom: 0;  
        left: 0;  
        width: 100%;  
        height: 110rpx;  
        box-shadow: 0 0 5px #999;  
        display: flex;  
        align-items: center;  
        padding: 5rpx 0;  
        color: #999999;  
    }  
    .tabbar-container .tabbar-item{  
        width: 20%;  
        height: 100rpx;  
        display: flex;  
        flex-direction: column;  
        justify-content: center;  
        align-items: center;  
        text-align: center;  
    }  
    .tabbar-container .item-active{  
        color: #66CCFF;  
    }  
    .tabbar-container .center-item{  
        display: block;  
        position: relative;  
    }  
    .tabbar-container .tabbar-item .item-top{  
        width: 70rpx;  
        height: 70rpx;  
        padding: 10rpx;  
    }  
    .tabbar-container .center-item .item-top{  
        flex-shrink: 0;  
        width: 100rpx;  
        height: 100rpx;  
        position: absolute;  
        top: -50rpx;  
        left: calc(50% - 50rpx);  
        border-radius: 50%;  
        box-shadow: 0 0 5px #999;  
        background-color: #ffffff;  
    }  
    .tabbar-container .tabbar-item .item-top image{  
        width: 100%;  
        height: 100%;  
    }  
    .tabbar-container .tabbar-item .item-bottom{  
        font-size: 28rpx;  
        width: 100%;  
    }  
    .tabbar-container .center-item .item-bottom{  
        position: absolute;  
        bottom: 5rpx;  
    }  
</style>  

index.vue文件中引入tabbar:

<!-- #ifndef APP-PLUS -->  
        <rwj-tabbar :current-page="0"></rwj-tabbar>  
<!-- #endif -->

补充说明:
由于app端不支持uni.hideTabBar();,所以在app端不需要使用自定义组件,而且app端uniapp原生的就支持中间凸起,所以app是使用的原生的tabbar

继续阅读 »

浏览了很多关于uniapp的自定义tabbar的文章,很多感觉都写的不详细,而且跨端能力都不怎么样,我自己研究整理了一下:

跨端支持:H5、app、微信小程序,

H5效果图如下:



微信小程序效果图如下:

app的效果图没有截取到,但应该是可行的。

目录结构如下:

page.json的配置如下:

{  
    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages  
        {  
            "path": "pages/index/index",  
            "style": {  
                "navigationBarTitleText": "首页"  
            }  
        },{  
            "path": "pages/dynamic/dynamic",  
            "style": {  
                "navigationBarTitleText": "发现"  
            }  
        },{  
            "path": "pages/release/release",  
            "style": {  
                "navigationBarTitleText": "发布"  
            }  
        },{  
            "path": "pages/friend/friend",  
            "style": {  
                "navigationBarTitleText": "朋友"  
            }  
        },{  
            "path": "pages/mine/mine",  
            "style": {  
                "navigationBarTitleText": "我的"  
            }  
        }  
    ],  
    "globalStyle": {  
        "navigationBarTextStyle": "black",  
        "navigationBarTitleText": "uni-app",  
        "navigationBarBackgroundColor": "#F8F8F8",  
        "backgroundColor": "#F8F8F8"  
    },  
    "tabBar": {  
        "color": "#999999",  
        "selectedColor": "#66CCFF",  
        "borderStyle": "black",  
        "backgroundColor": "#ffffff",  
        "midButton": {  
            "text": "发布",  
            "pagePath": "pages/release/release",  
            "iconPath": "static/images/tabbar/release.png",  
            "selectedIconPath": "static/images/tabbar/release-select.png"  
        },  
        "list": [{  
            "pagePath": "pages/index/index",  
            "iconPath": "static/images/tabbar/index.png",  
            "selectedIconPath": "static/images/tabbar/index-select.png",  
            "text": "首页"  
        },{  
            "pagePath": "pages/dynamic/dynamic",  
            "iconPath": "static/images/tabbar/dynamic.png",  
            "selectedIconPath": "static/images/tabbar/dynamic-select.png",  
            "text": "发现"  
        },  
        // #ifndef APP-PLUS  
        {  
            "pagePath": "pages/release/release",  
            "iconPath": "static/images/tabbar/release.png",  
            "selectedIconPath": "static/images/tabbar/release-select.png",  
            "text": "发布"  
        },  
        // #endif  
        {  
            "pagePath": "pages/friend/friend",  
            "iconPath": "static/images/tabbar/friend.png",  
            "selectedIconPath": "static/images/tabbar/friend-select.png",  
            "text": "朋友"  
        },{  
            "pagePath": "pages/mine/mine",  
            "iconPath": "static/images/tabbar/mine.png",  
            "selectedIconPath": "static/images/tabbar/mine-select.png",  
            "text": "我的"  
        }]  
    }  
}  

注册全局组件tabbar在main.js文件中,配置如下:

import Vue from 'vue'  
import App from './App'  
import rwjTabbar from './components/rwj-tabbar.vue'  

Vue.config.productionTip = false  

//注册全局组件  
Vue.component('rwj-tabbar', rwjTabbar);  
App.mpType = 'app'  

const app = new Vue({  
    ...App  
})  
app.$mount()  


rwj-tabbar.vue文件编写:

<template>  
    <view class="tabbar-container">  
        <block>  
            <view class="tabbar-item" v-for="(item,index) in tabbarList" :class="[item.centerItem ? ' center-item' : '']" @click="changeItem(item)">  
                <view class="item-top">  
                    <image :src="currentItem==item.id?item.selectIcon:item.icon"></image>  
                </view>  
                <view class="item-bottom" :class="[currentItem==item.id ? 'item-active' : '']">  
                    <text>{{item.text}}</text>  
                </view>  
            </view>  
        </block>  

    </view>  
</template>  

<script>  
    export default {  
        props:{  
            currentPage: {  
                type: Number,  
                default: 0  
            }  
        },  
        data() {  
            return {  
                currentItem: 0,  
                tabbarList: [  
                    {  
                        id: 0,  
                        path: "/pages/index/index",  
                        icon: "/static/images/tabbar/index.png",  
                        selectIcon: "/static/images/tabbar/index-select.png",  
                        text: "首页",  
                        centerItem: false  
                    },{  
                        id: 1,  
                        path: "/pages/dynamic/dynamic",  
                        icon: "/static/images/tabbar/dynamic.png",  
                        selectIcon: "/static/images/tabbar/dynamic-select.png",  
                        text: "动态",  
                        centerItem: false  
                    },{  
                        id: 2,  
                        path: "/pages/release/release",  
                        icon: "/static/images/tabbar/release.png",  
                        selectIcon: "/static/images/tabbar/release-select.png",  
                        text: "发布",  
                        centerItem: true  
                    },{  
                        id: 3,  
                        path: "/pages/friend/friend",  
                        icon: "/static/images/tabbar/friend.png",  
                        selectIcon: "/static/images/tabbar/friend-select.png",  
                        text: "朋友",  
                        centerItem: false  
                    },{  
                        id: 4,  
                        path: "/pages/mine/mine",  
                        icon: "/static/images/tabbar/mine.png",  
                        selectIcon: "/static/images/tabbar/mine-select.png",  
                        text: "我的",  
                        centerItem: false  
                    }  
                ]  

            };  
        },  
        mounted(){  
            this.currentItem = this.currentPage;  
            uni.hideTabBar();  
        },  
        methods: {  
            changeItem(item){  
                let _this = this;  
                //_this.currentItem = item.id;  
                uni.switchTab({  
                    url: item.path  
                });  
            }  
        }  
    }  
</script>  
<style>  
        view{  
               padding: 0;  
               margin: 0;  
               box-sizing: border-box;  
        }  
    .tabbar-container{  
        position: fixed;  
        bottom: 0;  
        left: 0;  
        width: 100%;  
        height: 110rpx;  
        box-shadow: 0 0 5px #999;  
        display: flex;  
        align-items: center;  
        padding: 5rpx 0;  
        color: #999999;  
    }  
    .tabbar-container .tabbar-item{  
        width: 20%;  
        height: 100rpx;  
        display: flex;  
        flex-direction: column;  
        justify-content: center;  
        align-items: center;  
        text-align: center;  
    }  
    .tabbar-container .item-active{  
        color: #66CCFF;  
    }  
    .tabbar-container .center-item{  
        display: block;  
        position: relative;  
    }  
    .tabbar-container .tabbar-item .item-top{  
        width: 70rpx;  
        height: 70rpx;  
        padding: 10rpx;  
    }  
    .tabbar-container .center-item .item-top{  
        flex-shrink: 0;  
        width: 100rpx;  
        height: 100rpx;  
        position: absolute;  
        top: -50rpx;  
        left: calc(50% - 50rpx);  
        border-radius: 50%;  
        box-shadow: 0 0 5px #999;  
        background-color: #ffffff;  
    }  
    .tabbar-container .tabbar-item .item-top image{  
        width: 100%;  
        height: 100%;  
    }  
    .tabbar-container .tabbar-item .item-bottom{  
        font-size: 28rpx;  
        width: 100%;  
    }  
    .tabbar-container .center-item .item-bottom{  
        position: absolute;  
        bottom: 5rpx;  
    }  
</style>  

index.vue文件中引入tabbar:

<!-- #ifndef APP-PLUS -->  
        <rwj-tabbar :current-page="0"></rwj-tabbar>  
<!-- #endif -->

补充说明:
由于app端不支持uni.hideTabBar();,所以在app端不需要使用自定义组件,而且app端uniapp原生的就支持中间凸起,所以app是使用的原生的tabbar

收起阅读 »

ios审核一周搞定,分享下过程

正好遇到国外圣诞节,中间有一周的空档,所以这里说的一周是扣除圣诞节放假的,我的app提交赶在他们的节前。累计被驳回5回,每次一天(23号他们给我驳回了2次)。

这里就说下需要注意的地方:
1、必须要隐私条款连接;
2、6.5英寸的预览和截屏得有留海(这个是看到别人说的,就我们修改了下,所以没因为截屏被驳回);
3、标题和副标题这个要特别注意。看appstore中很多标题都是带附加说明的,但是现在应该是不允许的。我们提交的app被驳回3次都是因为标题和副标题的原因:
a、第一次提交时,副标题添加了 一段说明他们认为是有关键词堆砌嫌疑,所以驳回了;
b、第二次我们将副标题的说明修改了,然后在增加了app名称的附加说明 “ app名称 - abc”,在appstore上可以看见很多类似的写法,不过那是以前现在貌似不行(反正被驳回了2次就不想再试了);
c、第三次我们去除了app名称上的附加说明“ - 附加说明”只留下单纯的app名称,然后附加标题采用“「app名称」期货交易数据分析与排名”,并说明为啥要用这个,接着跟他们商量我是否可以保留这个;
d、又一次被驳回,不过这次他们让我保留副标题说明了,驳回的原因是因为用户上传头像要权限,这个权限我没说明。在manifest.json中的“APP模块权限配置”中的“ios隐私信息访问的许可描述”添加说明后重新编译一个版本提交了上去。
e、最后一次被驳回,说我的副标题“「app名称」期货交易数据分析与排名”不符合政策。我在回复中把上次说明的情况再跟他说了一遍,并询问是否是同一个人审核的。最后问他,如果这个说明不符合政策,能否给个建议。这次提交上去后他们给通过了。

我感觉最主要的还是要尊重他们,我每次回复总是心平气和,因为这个其实是他们的工作,没必要耍小脾气。但是并不是说要低三下气,只是陈述事实即可。其实看下我们的副标题“期货交易数据分析与排名”,这个本身确实很难说没关键词堆砌嫌疑,因为含有“期货交易”,但是跟他们说明情况后他们放行了。

继续阅读 »

正好遇到国外圣诞节,中间有一周的空档,所以这里说的一周是扣除圣诞节放假的,我的app提交赶在他们的节前。累计被驳回5回,每次一天(23号他们给我驳回了2次)。

这里就说下需要注意的地方:
1、必须要隐私条款连接;
2、6.5英寸的预览和截屏得有留海(这个是看到别人说的,就我们修改了下,所以没因为截屏被驳回);
3、标题和副标题这个要特别注意。看appstore中很多标题都是带附加说明的,但是现在应该是不允许的。我们提交的app被驳回3次都是因为标题和副标题的原因:
a、第一次提交时,副标题添加了 一段说明他们认为是有关键词堆砌嫌疑,所以驳回了;
b、第二次我们将副标题的说明修改了,然后在增加了app名称的附加说明 “ app名称 - abc”,在appstore上可以看见很多类似的写法,不过那是以前现在貌似不行(反正被驳回了2次就不想再试了);
c、第三次我们去除了app名称上的附加说明“ - 附加说明”只留下单纯的app名称,然后附加标题采用“「app名称」期货交易数据分析与排名”,并说明为啥要用这个,接着跟他们商量我是否可以保留这个;
d、又一次被驳回,不过这次他们让我保留副标题说明了,驳回的原因是因为用户上传头像要权限,这个权限我没说明。在manifest.json中的“APP模块权限配置”中的“ios隐私信息访问的许可描述”添加说明后重新编译一个版本提交了上去。
e、最后一次被驳回,说我的副标题“「app名称」期货交易数据分析与排名”不符合政策。我在回复中把上次说明的情况再跟他说了一遍,并询问是否是同一个人审核的。最后问他,如果这个说明不符合政策,能否给个建议。这次提交上去后他们给通过了。

我感觉最主要的还是要尊重他们,我每次回复总是心平气和,因为这个其实是他们的工作,没必要耍小脾气。但是并不是说要低三下气,只是陈述事实即可。其实看下我们的副标题“期货交易数据分析与排名”,这个本身确实很难说没关键词堆砌嫌疑,因为含有“期货交易”,但是跟他们说明情况后他们放行了。

收起阅读 »

【数位云】开放平台上线,共建位置服务生态~欢迎体验

开发者中心

12月13日,数位宣布即将上线位置服务开发者平台,面向行业开发者赋能采集、定位等基础能力,支持安卓、iOS、小程序等不同平台,帮助行业缩短开发周期,节省开发成本,以更高效的方式获取领先的精准室内位置识别能力。

定 位

基于数位自主研发的核心专利技术,赋能开发者店铺级精准室内位置识别能力,可以在不依赖硬件铺设的前提下,精准区分楼层、店铺、店内及店外。目前,这一定位能力已覆盖全国209座城市超4000万高价值室内场景并不断扩张,为开发者搭建精准室内定位能力通用平台。

采 集

针对不同行业面向的场景差异,数位开发者平台为开发者提供目标场景自采集功能,将原本专业采集团队才能完成的系统性采集工作,面向行业零门槛开放。开发者只需到达符合采集标准的目标采集地点,通过APP进行2步操作,10秒即可获取目标场景的精准定位能力。

目前,数位定位+采集能力已经为本地生活、新闻资讯、视频娱乐、电商母婴、考勤办公等诸多领域的服务类、工具类、娱乐类APP提供服务,赋能人员管理、定位打卡、用户画像、场景服务、数据分析、精细化运营等多种能力,打造从采集到定位,从定位到场景服务,从服务到数据分析的一整套位置服务系统。

即日起,开发者可联系数位工作人员获取免费体验工具。

未来,数位还将陆续开放地图导航、近场服务、数据分析等能力,丰富位置服务形态,构建位置服务生态,与行业共建全域感知的智能世界。

开发者平台链接地址:https://cloud.papakaka.com/flash/#/dashboard

体验中如有疑问
扫描或识别下方二维码
添加数位小助手
随时在线解答您的问题

继续阅读 »

12月13日,数位宣布即将上线位置服务开发者平台,面向行业开发者赋能采集、定位等基础能力,支持安卓、iOS、小程序等不同平台,帮助行业缩短开发周期,节省开发成本,以更高效的方式获取领先的精准室内位置识别能力。

定 位

基于数位自主研发的核心专利技术,赋能开发者店铺级精准室内位置识别能力,可以在不依赖硬件铺设的前提下,精准区分楼层、店铺、店内及店外。目前,这一定位能力已覆盖全国209座城市超4000万高价值室内场景并不断扩张,为开发者搭建精准室内定位能力通用平台。

采 集

针对不同行业面向的场景差异,数位开发者平台为开发者提供目标场景自采集功能,将原本专业采集团队才能完成的系统性采集工作,面向行业零门槛开放。开发者只需到达符合采集标准的目标采集地点,通过APP进行2步操作,10秒即可获取目标场景的精准定位能力。

目前,数位定位+采集能力已经为本地生活、新闻资讯、视频娱乐、电商母婴、考勤办公等诸多领域的服务类、工具类、娱乐类APP提供服务,赋能人员管理、定位打卡、用户画像、场景服务、数据分析、精细化运营等多种能力,打造从采集到定位,从定位到场景服务,从服务到数据分析的一整套位置服务系统。

即日起,开发者可联系数位工作人员获取免费体验工具。

未来,数位还将陆续开放地图导航、近场服务、数据分析等能力,丰富位置服务形态,构建位置服务生态,与行业共建全域感知的智能世界。

开发者平台链接地址:https://cloud.papakaka.com/flash/#/dashboard

体验中如有疑问
扫描或识别下方二维码
添加数位小助手
随时在线解答您的问题

收起阅读 »

【建议】ctrl+f搜索结果总是在画面最下面或最上面,很不明显不便于查看代码上下文。

搜索

ctrl+f搜索结果总是在画面最下面或最上面,很不明显不便于查看代码上下文。
能否将结果高亮显示在中间,这样比较明显,且方便用户查看关键词的上下文,以便用户分别是否是想要的结果。
感谢!

ctrl+f搜索结果总是在画面最下面或最上面,很不明显不便于查看代码上下文。
能否将结果高亮显示在中间,这样比较明显,且方便用户查看关键词的上下文,以便用户分别是否是想要的结果。
感谢!