HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

ios 获取idfa idfv 具体代码教程(亲测可用)

iOS IDFA

原文链接:ios 获取idfa idfv
第一步:编写manifest.json配置文件
在 manifest.json 配置文件 "ios" 下加入frameworks,以及idfa设置为真

"ios" : {
"frameworks" : [ "AdSupport.framework" ],
"idfa" : "true"
},
第二步:编辑业务代码,以下是获取idfa,idfv的函数,返回数据为json对象
getIdfa_idfv:function(){
var NSUUID = plus.ios.importClass('NSUUID');
var UIDevice = plus.ios.importClass("UIDevice");
var currentDevice = UIDevice.currentDevice()
var identifierForVendor = currentDevice.identifierForVendor().UUIDString();

var ASIdentifierManager = plus.ios.importClass("ASIdentifierManager");  
var sharedManager = ASIdentifierManager.sharedManager();  
if(sharedManager.isAdvertisingTrackingEnabled()){  
    var advertisingIdentifier = sharedManager.advertisingIdentifier();  
    var idfa = plus.ios.invoke(advertisingIdentifier,"UUIDString");   
}  
 var result = {'idfa':idfa,'idfv':identifierForVendor}  
 return result;  

}
第三步:提交打包测试
注意:不能直接使用Hbuilderx的包测试,需要使用自定义基座,或者打包测试

结果:{"idfa":"7DFFEF3C-FB3A-4121-B0D8-08F7BB0718DF","idfv":"C0EDCF46-7B3F-4AB2-BBAD-95A2FE82982E"}

继续阅读 »

原文链接:ios 获取idfa idfv
第一步:编写manifest.json配置文件
在 manifest.json 配置文件 "ios" 下加入frameworks,以及idfa设置为真

"ios" : {
"frameworks" : [ "AdSupport.framework" ],
"idfa" : "true"
},
第二步:编辑业务代码,以下是获取idfa,idfv的函数,返回数据为json对象
getIdfa_idfv:function(){
var NSUUID = plus.ios.importClass('NSUUID');
var UIDevice = plus.ios.importClass("UIDevice");
var currentDevice = UIDevice.currentDevice()
var identifierForVendor = currentDevice.identifierForVendor().UUIDString();

var ASIdentifierManager = plus.ios.importClass("ASIdentifierManager");  
var sharedManager = ASIdentifierManager.sharedManager();  
if(sharedManager.isAdvertisingTrackingEnabled()){  
    var advertisingIdentifier = sharedManager.advertisingIdentifier();  
    var idfa = plus.ios.invoke(advertisingIdentifier,"UUIDString");   
}  
 var result = {'idfa':idfa,'idfv':identifierForVendor}  
 return result;  

}
第三步:提交打包测试
注意:不能直接使用Hbuilderx的包测试,需要使用自定义基座,或者打包测试

结果:{"idfa":"7DFFEF3C-FB3A-4121-B0D8-08F7BB0718DF","idfv":"C0EDCF46-7B3F-4AB2-BBAD-95A2FE82982E"}

收起阅读 »

制作一个手机APP软件需要办理的资质证明

5+App开发

移动互联网+商业时代的井喷期已至。在你的事业蓝图中,是否早已打算好开发制作一个属于自己的APP应用平台呢?那么,在制作APP前应该有哪些准备工作,今天,力谱云就带您了解一番,制作一个手机APP软件都需要拥有哪些资质证明!

在一般情况下,如果您所开发的App,在运营过程中需要收取费用,那么您就需要为App办理网站平台经营许可证,方可进行运营。目前,主要会涉及到两种证件,ICP许可证,以及SP许可证。

1 短信服务类App
拥有经营短信、彩信、彩铃等业务的企业App;或者在新用户注册时,需要对注册用户发送验证码信息的App平台,都需要进行SP许可证的办理。

2 商城购物类App
发布商品信息,并进行交易的商城购物类App,必须拥有ICP许可证。一般可在省级通信管理局进行办理。

3 资讯/视频/图书类App
如果您所开发的App平台,在发布信息资讯、视频等信息时,需要收费,那么就需要进行ICP许可证的办理,涉及网络试听许可证、广播电视节目制作经营许可证。前者需国有控股过半,后者办理相对简单。

4 医疗资讯类App
制作移动资讯类手机App软件,目前需要互联网医疗信息服务许可证。在苹果上架时,审核过程中,有时会需要医院资质的证明文件。

5 其他类别App
一旦平台所发布的信息是有偿的,那么招聘类App、搜索类App、社交类App都会涉及到ICP许可证的办理。

总而言之,想要制作好一个付费类手机App软件,首先得知道自己的平台属于哪种范畴,需要哪些专门的资质证明。目前,力谱云团队在您开发之前,会有专人、及团队顾问,帮助您在开发前就规避一切风险,并且从研发到运营、营销,由力谱云全程保驾护航。

APP开发|APP制作|电商APP开发|APP代理加盟-力谱云-移动电商云平台

继续阅读 »

移动互联网+商业时代的井喷期已至。在你的事业蓝图中,是否早已打算好开发制作一个属于自己的APP应用平台呢?那么,在制作APP前应该有哪些准备工作,今天,力谱云就带您了解一番,制作一个手机APP软件都需要拥有哪些资质证明!

在一般情况下,如果您所开发的App,在运营过程中需要收取费用,那么您就需要为App办理网站平台经营许可证,方可进行运营。目前,主要会涉及到两种证件,ICP许可证,以及SP许可证。

1 短信服务类App
拥有经营短信、彩信、彩铃等业务的企业App;或者在新用户注册时,需要对注册用户发送验证码信息的App平台,都需要进行SP许可证的办理。

2 商城购物类App
发布商品信息,并进行交易的商城购物类App,必须拥有ICP许可证。一般可在省级通信管理局进行办理。

3 资讯/视频/图书类App
如果您所开发的App平台,在发布信息资讯、视频等信息时,需要收费,那么就需要进行ICP许可证的办理,涉及网络试听许可证、广播电视节目制作经营许可证。前者需国有控股过半,后者办理相对简单。

4 医疗资讯类App
制作移动资讯类手机App软件,目前需要互联网医疗信息服务许可证。在苹果上架时,审核过程中,有时会需要医院资质的证明文件。

5 其他类别App
一旦平台所发布的信息是有偿的,那么招聘类App、搜索类App、社交类App都会涉及到ICP许可证的办理。

总而言之,想要制作好一个付费类手机App软件,首先得知道自己的平台属于哪种范畴,需要哪些专门的资质证明。目前,力谱云团队在您开发之前,会有专人、及团队顾问,帮助您在开发前就规避一切风险,并且从研发到运营、营销,由力谱云全程保驾护航。

APP开发|APP制作|电商APP开发|APP代理加盟-力谱云-移动电商云平台

收起阅读 »

HBuilderX 重构/重命名变量/选择相同语法词/refactor/查找引用/find useage

选择相同语法词 重构 查看引用 refactor

本功能自HBuilderX 1.7.2起支持。在1.9.7中增加到了编辑器的右键菜单中。

背景

大型IDE,一般会提供重构功能,就是把一个变量/方法,重命名,这个变量的定义处和引用处都自动修改。

强类型语言都有这个功能,由于js的弱类型,这个判断很难精准。

不过HBuilderX提供了另一种安全且方便的方式,即 选择相同语法词 。

操作方法

选中一个变量(或不选,只是光标放在那里),点菜单-选择-选择相同语法词或右键菜单,win快捷键:ctrl+shift+e;mac快捷键:command+shift+e

  • 比如如下代码,光标放到变量a旁边,按下 选择相同语法词 ,效果如下:

可以看到,文档中其他的a虽然套了外框,代表有相同字符,但只有变量a的定义处和引用处,才被真正选中。

同时在状态栏可以看到,有2个选区被选中。

然后利用多光标特性,你可以自由修改a。

当然除了js变量/方法,你也可以对html的tagname、css的class执行同样的操作。

  • 比如同时选中首尾标签:

  • 比如同时选中css和html相同的id或class名称:

  • 选择相同语法词 还有一个特性,如果你选中的是一个括号,它会帮你选中另一对括号。方便同时删除一对括号。

查看引用

很多时候,我们并不是真的需要重构变量名称,只是需要查看某个变量在哪里被引用,并且在这些地方互相跳转。

方便的操作是先选中相同语法词,然后按Ctrl+F2,给这些词全部打上书签。

然后按F2可以在书签之间跳转。

不需要这些书签时,ctrl+shift+f2是清空所有书签。

局限性和使用注意

  • 由于js的弱类型,有些复杂的嵌套写法无法识别,比如eval这类方法里通过字符串表示的变量
  • css的选择器只能选中原始定义处,伪类、合并选择器的css命名,无法选中
  • 选择相同语法词 只能处理当前文档,对于跨文档的引用不处理
  • 此功能依赖语法提示插件,有些语法比如ts需要安装相应插件才可提示。对于还不能进行语法提示的语言无法使用此功能
  • 对于非常大的文档,分析时可能会有点耗时,需要耐心等待。但肯定比人工选择相同语法词快:)

如果自动选择的词不全,可以按下ctrl+鼠标双击,添加新的词到选区中。

继续阅读 »

本功能自HBuilderX 1.7.2起支持。在1.9.7中增加到了编辑器的右键菜单中。

背景

大型IDE,一般会提供重构功能,就是把一个变量/方法,重命名,这个变量的定义处和引用处都自动修改。

强类型语言都有这个功能,由于js的弱类型,这个判断很难精准。

不过HBuilderX提供了另一种安全且方便的方式,即 选择相同语法词 。

操作方法

选中一个变量(或不选,只是光标放在那里),点菜单-选择-选择相同语法词或右键菜单,win快捷键:ctrl+shift+e;mac快捷键:command+shift+e

  • 比如如下代码,光标放到变量a旁边,按下 选择相同语法词 ,效果如下:

可以看到,文档中其他的a虽然套了外框,代表有相同字符,但只有变量a的定义处和引用处,才被真正选中。

同时在状态栏可以看到,有2个选区被选中。

然后利用多光标特性,你可以自由修改a。

当然除了js变量/方法,你也可以对html的tagname、css的class执行同样的操作。

  • 比如同时选中首尾标签:

  • 比如同时选中css和html相同的id或class名称:

  • 选择相同语法词 还有一个特性,如果你选中的是一个括号,它会帮你选中另一对括号。方便同时删除一对括号。

查看引用

很多时候,我们并不是真的需要重构变量名称,只是需要查看某个变量在哪里被引用,并且在这些地方互相跳转。

方便的操作是先选中相同语法词,然后按Ctrl+F2,给这些词全部打上书签。

然后按F2可以在书签之间跳转。

不需要这些书签时,ctrl+shift+f2是清空所有书签。

局限性和使用注意

  • 由于js的弱类型,有些复杂的嵌套写法无法识别,比如eval这类方法里通过字符串表示的变量
  • css的选择器只能选中原始定义处,伪类、合并选择器的css命名,无法选中
  • 选择相同语法词 只能处理当前文档,对于跨文档的引用不处理
  • 此功能依赖语法提示插件,有些语法比如ts需要安装相应插件才可提示。对于还不能进行语法提示的语言无法使用此功能
  • 对于非常大的文档,分析时可能会有点耗时,需要耐心等待。但肯定比人工选择相同语法词快:)

如果自动选择的词不全,可以按下ctrl+鼠标双击,添加新的词到选区中。

收起阅读 »

登入模板的内部没有办法使用<map>标签

在其他的模板使用<map>没有问题,但是在新建项目的登入模板内使用map,会出现白屏的问题

在其他的模板使用<map>没有问题,但是在新建项目的登入模板内使用map,会出现白屏的问题

基于thinkCMF5.1和uni-app开发的uniCMF,帮助开发者快速构建WEB,APP和小程序应用。

源码地址:https://www.thinkcmf.com/appstore/theme/45.html
课程地址:http://www.3mooc.com/front/couinfo/527

uniapp免费课程(1块钱是平台推广费用)已经发布,源码价格5月10日开始提升到50元(现在20元),买了源码的同学提供后续的更新和指导!
前台演示地址:http://hrai.online (PC端自行切换手机模式)

后台演示地址:http://hrai.online/admin。

目前正在考虑是否需要录制教程,或者直接用文档模式。

现已完成的功能有:

**轮播图,文章搜索

上拉加载,下拉刷新

获取文章列表,分类列表

用户登录,注册,找回密码,微信小程序登录

绑定手机,邮箱,短信验证码,邮箱验证码

文章收藏,点赞,评论,分享(小程序)

修改个人信息,用户发布文章**

持续更新中。。。

uniCMF完全遵循cmfapi手册规范,开发者可以直接复制手册上的api或代码使用。

api手册地址:

https://www.thinkcmf.com/cmf5api.html

uni-app文档地址:

https://uniapp.dcloud.io/

继续阅读 »

源码地址:https://www.thinkcmf.com/appstore/theme/45.html
课程地址:http://www.3mooc.com/front/couinfo/527

uniapp免费课程(1块钱是平台推广费用)已经发布,源码价格5月10日开始提升到50元(现在20元),买了源码的同学提供后续的更新和指导!
前台演示地址:http://hrai.online (PC端自行切换手机模式)

后台演示地址:http://hrai.online/admin。

目前正在考虑是否需要录制教程,或者直接用文档模式。

现已完成的功能有:

**轮播图,文章搜索

上拉加载,下拉刷新

获取文章列表,分类列表

用户登录,注册,找回密码,微信小程序登录

绑定手机,邮箱,短信验证码,邮箱验证码

文章收藏,点赞,评论,分享(小程序)

修改个人信息,用户发布文章**

持续更新中。。。

uniCMF完全遵循cmfapi手册规范,开发者可以直接复制手册上的api或代码使用。

api手册地址:

https://www.thinkcmf.com/cmf5api.html

uni-app文档地址:

https://uniapp.dcloud.io/

收起阅读 »

SQLite云端打包配置说明

SQLite

HBuilderX 1.7.2及以上版本支持SQLite操作db文件。

概述

SQLite是一种嵌入式数据库,本质上就是一个数据库文件(.db)。是无服务器的、零配置的、事务性的简单轻量级SQL数据库引擎。
通常在移动设备上适合不需要高并发量的本地数据存储。

SQLite API使用

plus.sqlite已经封装好操作db数据库文件接口,按以下方法调用即可。
在uni-app中可使用条件编译直接调用5+ Push接口

打开数据库

使用前需调用plus.sqlite.openDatabase打开数据库,必须指定数据库文件路径(.db)和数据库名称。
数据库文件路径使用需注意以下问题:

应用资源目录中的文件只可读,在使用相对路径(如"./x.db")或5+API路径RelativeURL的应用资源目录(如"_www/x.db")时不能写入保存数据。通常可以将一些应用的初始数据作为资源内置到应用中,在业务逻辑中进行读取操作。
如果需要在应用的业务逻辑产生的数据保存,应该将数据库文件保存在可写目录中,推荐使用5+API路径的应用私有文档目录(如"_doc/x.db"),此目录中的文件是可读可写,并且应用热更新时不会影响此目录中的文件。
数据库文件路径只可读时,如果文件不存在打开数据库则会失败;数据库文件路径可读可写时,如果文件不存在则自动创建数据库文件。

注意:Android平台目前已知数据库文件不存在时不会自动创建(此问题会在HBuilderX1.8.1版本修复),临时解决方法是先创建不存在的文件,示例如下:

document.addEventListener('plusready', function(e){  
    // 确保_doc/test.db文件存在  
    plus.io.requestFileSystem( plus.io.PRIVATE_DOC, function(fs){  
        fs.root.getFile('test.db', {create:true}, function(fileEntry){  
            console.log('ensure test.db file!');  
        });  
    });  
}, false);  

// 打开数据库  
function openDB(){  
    outSet('打开数据库: ');  
    plus.sqlite.openDatabase({  
        name: 'first',  
        path: '_doc/test.db',  
        success: function(e){  
            console.log(JSON.stringify(e));  
        },  
        fail: function(e){  
            console.log(JSON.stringify(e));  
        }  
    });  
}

操作数据库

  • 执行SQL语句(plus.sqlite.executeSql),对数据进行增、删、改操作。数据库文件路径必须可读可写,否则会操作失败。
  • 执行事务(plus.sqlite.transaction),对数据库执行事务操作。数据库文件路径必须可读可写,否则会操作失败。
  • 执行查询SQL语句(plus.sqlite.selectSql),对数据库执行查询操作。数据库文件路径可读即可。

关闭数据库

数据库操作完成后,必须调用plus.sqlite.closeDatabase关闭,否则一直占用系统资源。推荐操作前打开数据库,完成操作后及时关闭数据库,避免引起占用系统资源而无法执行其它操作。

完整5+ API接口参考SQLite规范文档

云端打包配置

使用SQLite功能,提交云端打包时需在manifest.json中配置使用“SQLite(数据库)”。

  • HBuilderX1.8.0及以后版本通过可视化界面配置
    打开应用的manifest.json文件,选择“模块权限配置”项,勾选“SQLite数据库”,如下图所示:
    配置SQLite

  • HBuilderX1.7.2&1.7.3版本通过源码视图配置
    打开应用manifest.json文件,点击“源码视图”,在"permissions"节点下添加"SQLite"节点:

    //...  
    "permissions" : {  
        //...  
        "SQLite" : {}  
    },  
    //...

    uni-app应用在"app-plus"->"modules"节点下添加"SQLite"数据

继续阅读 »

HBuilderX 1.7.2及以上版本支持SQLite操作db文件。

概述

SQLite是一种嵌入式数据库,本质上就是一个数据库文件(.db)。是无服务器的、零配置的、事务性的简单轻量级SQL数据库引擎。
通常在移动设备上适合不需要高并发量的本地数据存储。

SQLite API使用

plus.sqlite已经封装好操作db数据库文件接口,按以下方法调用即可。
在uni-app中可使用条件编译直接调用5+ Push接口

打开数据库

使用前需调用plus.sqlite.openDatabase打开数据库,必须指定数据库文件路径(.db)和数据库名称。
数据库文件路径使用需注意以下问题:

应用资源目录中的文件只可读,在使用相对路径(如"./x.db")或5+API路径RelativeURL的应用资源目录(如"_www/x.db")时不能写入保存数据。通常可以将一些应用的初始数据作为资源内置到应用中,在业务逻辑中进行读取操作。
如果需要在应用的业务逻辑产生的数据保存,应该将数据库文件保存在可写目录中,推荐使用5+API路径的应用私有文档目录(如"_doc/x.db"),此目录中的文件是可读可写,并且应用热更新时不会影响此目录中的文件。
数据库文件路径只可读时,如果文件不存在打开数据库则会失败;数据库文件路径可读可写时,如果文件不存在则自动创建数据库文件。

注意:Android平台目前已知数据库文件不存在时不会自动创建(此问题会在HBuilderX1.8.1版本修复),临时解决方法是先创建不存在的文件,示例如下:

document.addEventListener('plusready', function(e){  
    // 确保_doc/test.db文件存在  
    plus.io.requestFileSystem( plus.io.PRIVATE_DOC, function(fs){  
        fs.root.getFile('test.db', {create:true}, function(fileEntry){  
            console.log('ensure test.db file!');  
        });  
    });  
}, false);  

// 打开数据库  
function openDB(){  
    outSet('打开数据库: ');  
    plus.sqlite.openDatabase({  
        name: 'first',  
        path: '_doc/test.db',  
        success: function(e){  
            console.log(JSON.stringify(e));  
        },  
        fail: function(e){  
            console.log(JSON.stringify(e));  
        }  
    });  
}

操作数据库

  • 执行SQL语句(plus.sqlite.executeSql),对数据进行增、删、改操作。数据库文件路径必须可读可写,否则会操作失败。
  • 执行事务(plus.sqlite.transaction),对数据库执行事务操作。数据库文件路径必须可读可写,否则会操作失败。
  • 执行查询SQL语句(plus.sqlite.selectSql),对数据库执行查询操作。数据库文件路径可读即可。

关闭数据库

数据库操作完成后,必须调用plus.sqlite.closeDatabase关闭,否则一直占用系统资源。推荐操作前打开数据库,完成操作后及时关闭数据库,避免引起占用系统资源而无法执行其它操作。

完整5+ API接口参考SQLite规范文档

云端打包配置

使用SQLite功能,提交云端打包时需在manifest.json中配置使用“SQLite(数据库)”。

  • HBuilderX1.8.0及以后版本通过可视化界面配置
    打开应用的manifest.json文件,选择“模块权限配置”项,勾选“SQLite数据库”,如下图所示:
    配置SQLite

  • HBuilderX1.7.2&1.7.3版本通过源码视图配置
    打开应用manifest.json文件,点击“源码视图”,在"permissions"节点下添加"SQLite"节点:

    //...  
    "permissions" : {  
        //...  
        "SQLite" : {}  
    },  
    //...

    uni-app应用在"app-plus"->"modules"节点下添加"SQLite"数据

收起阅读 »

感谢hbuilder,美文苑文学第一个app终于出来了!

分享

首先感谢hbuilder,美文苑文学第一个app完善版本终于出来了!用uniapp做的!
这uniapp确实好用!多看看手册确实容易上手!会网站制作的上手都相对容易的!
本站下载地址:https://www.meiweny.cn/app/1.2.8.apk 安卓版

继续阅读 »

首先感谢hbuilder,美文苑文学第一个app完善版本终于出来了!用uniapp做的!
这uniapp确实好用!多看看手册确实容易上手!会网站制作的上手都相对容易的!
本站下载地址:https://www.meiweny.cn/app/1.2.8.apk 安卓版

收起阅读 »

判断iOS系统推送功能是否开启,并可提醒去设置页打开设置推送

判断iOS系统推送功能是否开启

如果需要判断ios系统推送功能是否开启,并提醒去设置页打开设置推送,可以用以下nativeJS 代码:

function isOpenPush() {  
                var UIApplication = plus.ios.import("UIApplication");  
                var app = UIApplication.sharedApplication();  
                var enabledTypes = 0;  
                if (app.currentUserNotificationSettings) {  
                    var settings = app.currentUserNotificationSettings();  
                    enabledTypes = settings.plusGetAttribute("types");  
                    console.log("enabledTypes1:" + enabledTypes);  
                    if (enabledTypes == 0) {  
                        plus.nativeUI.confirm("推送设置没有开启,是否去开启?", function(e) {  
                            if (e.index == 0) {  
                                var NSURL2 = plus.ios.import("NSURL");  
                                var setting2 = NSURL2.URLWithString("app-settings:");  
                                var application2 = UIApplication.sharedApplication();  
                                application2.openURL(setting2);  
                                plus.ios.deleteObject(setting2);  
                                plus.ios.deleteObject(NSURL2);  
                                plus.ios.deleteObject(application2);  
                            }  
                        }, {  
                            "buttons": ["Yes", "No"],  
                            "verticalAlign": "center"  
                        });  
                    }  
                    plus.ios.deleteObject(settings);  
                } else {  
                    enabledTypes = app.enabledRemoteNotificationTypes();  
                    if(enabledTypes == 0){  
                        console.log("推送未开启!");  
                    }else{  
                        console.log("已经开启推送功能!")  
                    }  
                    console.log("enabledTypes2:" + enabledTypes);  
                }  
                plus.ios.deleteObject(app);  
            }

此功能在uniapp项目且配置为自定义模式的时候,会报:“plus.ios.import is not a function”错误。
该问题已经在HBuilderX1.9.4.20190426 之后版本已经解决

继续阅读 »

如果需要判断ios系统推送功能是否开启,并提醒去设置页打开设置推送,可以用以下nativeJS 代码:

function isOpenPush() {  
                var UIApplication = plus.ios.import("UIApplication");  
                var app = UIApplication.sharedApplication();  
                var enabledTypes = 0;  
                if (app.currentUserNotificationSettings) {  
                    var settings = app.currentUserNotificationSettings();  
                    enabledTypes = settings.plusGetAttribute("types");  
                    console.log("enabledTypes1:" + enabledTypes);  
                    if (enabledTypes == 0) {  
                        plus.nativeUI.confirm("推送设置没有开启,是否去开启?", function(e) {  
                            if (e.index == 0) {  
                                var NSURL2 = plus.ios.import("NSURL");  
                                var setting2 = NSURL2.URLWithString("app-settings:");  
                                var application2 = UIApplication.sharedApplication();  
                                application2.openURL(setting2);  
                                plus.ios.deleteObject(setting2);  
                                plus.ios.deleteObject(NSURL2);  
                                plus.ios.deleteObject(application2);  
                            }  
                        }, {  
                            "buttons": ["Yes", "No"],  
                            "verticalAlign": "center"  
                        });  
                    }  
                    plus.ios.deleteObject(settings);  
                } else {  
                    enabledTypes = app.enabledRemoteNotificationTypes();  
                    if(enabledTypes == 0){  
                        console.log("推送未开启!");  
                    }else{  
                        console.log("已经开启推送功能!")  
                    }  
                    console.log("enabledTypes2:" + enabledTypes);  
                }  
                plus.ios.deleteObject(app);  
            }

此功能在uniapp项目且配置为自定义模式的时候,会报:“plus.ios.import is not a function”错误。
该问题已经在HBuilderX1.9.4.20190426 之后版本已经解决

收起阅读 »

在 uni-app 中使用 uni-push

Push uniapp

> 文档已迁移至新链接:https://uniapp.dcloud.net.cn/uni-push/v1/how-to-use-in-uniapp.html
> 如有疑问,可以单独发贴咨询。

继续阅读 »

> 文档已迁移至新链接:https://uniapp.dcloud.net.cn/uni-push/v1/how-to-use-in-uniapp.html
> 如有疑问,可以单独发贴咨询。

收起阅读 »

关于HbuderX配置外部web服务器问题,我看到还有很多不会,我分享一下怎么弄

web服务器

1,首先你需要知道自己的ip地址,运行cmd ipconfig

2,打开工具看图片运行到外部浏览器


查看浏览器的地址,记住这个端口号

3,打开配置服务器


找到这一块

4,把你们本机的ip地址填写进去还有端口号看图

5,完美运行,如果手机wifi跟电脑在同一个网关上,可以实现扫码直接预览

继续阅读 »

1,首先你需要知道自己的ip地址,运行cmd ipconfig

2,打开工具看图片运行到外部浏览器


查看浏览器的地址,记住这个端口号

3,打开配置服务器


找到这一块

4,把你们本机的ip地址填写进去还有端口号看图

5,完美运行,如果手机wifi跟电脑在同一个网关上,可以实现扫码直接预览

收起阅读 »

plus removeRecursively 删除指定目录下的所有文件(有可能包含目录?)

h5+ plus

直接上代码:

var dirPath = '_doc/tempImage/';  
plus.io.resolveLocalFileSystemURL(dirPath, function(entry) {    
    //读取这个目录对象    
    var directoryReader = entry.createReader();    
    // console.log(dirPath)    
    //读取这个目录下的所有文件    
    directoryReader.readEntries(function(entries) {    
        // console.log(entries.length)    
        //如果有才操作    
        if (entries.length > 0) {    
            //删除目录将会删除其下的所有文件及子目录 不能删除根目录,如果操作删除根目录  
            //将会删除目录下的文件及子目录,不会删除根目录自身。 删除目录成功通过succesCB  
            //回调返回,失败则通过errorCB返回。  
            entry.removeRecursively(function(entry) {    
                // console.log('删除成功回调')    
                //删除成功回调    
            }, function(e) {    
                // console.log('!!')    
                //错误信息    
                $.toast(e.message + ' ?!');    
            })    
        }    
    }, function(e) {    
        $.toast('读取文件失败:' + e.message)    
    })    
}, function(e) {    
    $.toast('读取目录失败:' + e.message)    
})  

以前 readEntries 成功回调的返回参数对象也有 removeRecursively 方法来着,现在没有了,郁闷,害得我找了半天毛病,手册上还是错误的,给我整得蒙蔽的。
注意上面的两个回调对象变量名称是不一样的。

继续阅读 »

直接上代码:

var dirPath = '_doc/tempImage/';  
plus.io.resolveLocalFileSystemURL(dirPath, function(entry) {    
    //读取这个目录对象    
    var directoryReader = entry.createReader();    
    // console.log(dirPath)    
    //读取这个目录下的所有文件    
    directoryReader.readEntries(function(entries) {    
        // console.log(entries.length)    
        //如果有才操作    
        if (entries.length > 0) {    
            //删除目录将会删除其下的所有文件及子目录 不能删除根目录,如果操作删除根目录  
            //将会删除目录下的文件及子目录,不会删除根目录自身。 删除目录成功通过succesCB  
            //回调返回,失败则通过errorCB返回。  
            entry.removeRecursively(function(entry) {    
                // console.log('删除成功回调')    
                //删除成功回调    
            }, function(e) {    
                // console.log('!!')    
                //错误信息    
                $.toast(e.message + ' ?!');    
            })    
        }    
    }, function(e) {    
        $.toast('读取文件失败:' + e.message)    
    })    
}, function(e) {    
    $.toast('读取目录失败:' + e.message)    
})  

以前 readEntries 成功回调的返回参数对象也有 removeRecursively 方法来着,现在没有了,郁闷,害得我找了半天毛病,手册上还是错误的,给我整得蒙蔽的。
注意上面的两个回调对象变量名称是不一样的。

收起阅读 »

对于uniapp瀑布流怎么做,几行代码教你

uniapp

对于新鲜的uniapp别人问我瀑布流怎么做,现在我几行代码教你,本人就根据官网的看图demo来弄吧。思路就是把图标以纵向左右分开,设置宽度各自占一半,然后就是图片宽度一定(占一半),高度根据图片自己高度设置,假如高度太高了,可以自行限制一半自由发挥,看不到明显效果的话,就是图片高度都是等高的

<template>  
    <view class="index">  
        <view class="left">  
            <block v-for="(item, index) in list" :key="index" class="itemlist">  
                <view class="card" @click="goDetail(item)" v-if="index%2==0">  
                    <image class="card-img" :src="item.img_src" mode="widthFix"></image>  
                    <text class="card-num-view">{{item.img_num}}P</text>  
                    <view class="card-bottm row">  
                        <view class="car-title-view row">  
                            <text class="card-title">{{item.title}}</text>  
                        </view>  
                        <view @click.stop="share(item)" class="card-share-view"></view>  
                    </view>  
                </view>  
            </block>  
        </view>  

        <view class="right">  
            <block v-for="(item, index) in list" :key="index" class="itemlist">  
                <view class="card" @click="goDetail(item)" v-if="index%2==1">  
                    <image class="card-img" :src="item.img_src" mode="widthFix"></image>  
                    <text class="card-num-view">{{item.img_num}}P</text>  
                    <view class="card-bottm row">  
                        <view class="car-title-view row">  
                            <text class="card-title">{{item.title}}</text>  
                        </view>  
                        <view @click.stop="share(item)" class="card-share-view"></view>  
                    </view>  
                </view>  
            </block>  
        </view>  
    </view>  
</template>  
.left,.right{  
  display: inline-block;  
  vertical-align: top;  
  width: 49%;  
}  

.itemlist{  
      background-color: #fff;  
      margin: 1%;   
      margin-bottom: 20rpx;  
      display: inline-block;  

    }  
继续阅读 »

对于新鲜的uniapp别人问我瀑布流怎么做,现在我几行代码教你,本人就根据官网的看图demo来弄吧。思路就是把图标以纵向左右分开,设置宽度各自占一半,然后就是图片宽度一定(占一半),高度根据图片自己高度设置,假如高度太高了,可以自行限制一半自由发挥,看不到明显效果的话,就是图片高度都是等高的

<template>  
    <view class="index">  
        <view class="left">  
            <block v-for="(item, index) in list" :key="index" class="itemlist">  
                <view class="card" @click="goDetail(item)" v-if="index%2==0">  
                    <image class="card-img" :src="item.img_src" mode="widthFix"></image>  
                    <text class="card-num-view">{{item.img_num}}P</text>  
                    <view class="card-bottm row">  
                        <view class="car-title-view row">  
                            <text class="card-title">{{item.title}}</text>  
                        </view>  
                        <view @click.stop="share(item)" class="card-share-view"></view>  
                    </view>  
                </view>  
            </block>  
        </view>  

        <view class="right">  
            <block v-for="(item, index) in list" :key="index" class="itemlist">  
                <view class="card" @click="goDetail(item)" v-if="index%2==1">  
                    <image class="card-img" :src="item.img_src" mode="widthFix"></image>  
                    <text class="card-num-view">{{item.img_num}}P</text>  
                    <view class="card-bottm row">  
                        <view class="car-title-view row">  
                            <text class="card-title">{{item.title}}</text>  
                        </view>  
                        <view @click.stop="share(item)" class="card-share-view"></view>  
                    </view>  
                </view>  
            </block>  
        </view>  
    </view>  
</template>  
.left,.right{  
  display: inline-block;  
  vertical-align: top;  
  width: 49%;  
}  

.itemlist{  
      background-color: #fff;  
      margin: 1%;   
      margin-bottom: 20rpx;  
      display: inline-block;  

    }  
收起阅读 »