HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

企业账号 iOS证书(.p12)和描述文件(.mobileprovision)申请

云打包、自定义基座时,因没有个人开发者账号,使用的是企业版账号,按照https://ask.dcloud.net.cn/article/152的教程生成证书没问题,但是添加设备、Identifiers、profiles的时候没有自动添加选项,给我造成了一定的困扰,现分享下经验。

Identifiers
在xcode——target——Signing&Capabilities中志杰创建后,会自动创建到企业账号的Identifiers中

设备
插入真机调试时,会自动创建到企业账号的Devices中

Profiles
这个耗费了半天时间,百度、Google也没找到指导教程,直到在官方文档中看到一句话

原来已经由Xcode自动接管了。百度下:provisioning profile 本地路径,找到了~/Library/MobileDevice/Provisioning Profiles,在这个目录下找到项目的.mobileprovision文件即为描述文件。

另一个问题

需要企业账号的管理员权限去创建profiles(未验证,因为没有管理员权限);

继续阅读 »

云打包、自定义基座时,因没有个人开发者账号,使用的是企业版账号,按照https://ask.dcloud.net.cn/article/152的教程生成证书没问题,但是添加设备、Identifiers、profiles的时候没有自动添加选项,给我造成了一定的困扰,现分享下经验。

Identifiers
在xcode——target——Signing&Capabilities中志杰创建后,会自动创建到企业账号的Identifiers中

设备
插入真机调试时,会自动创建到企业账号的Devices中

Profiles
这个耗费了半天时间,百度、Google也没找到指导教程,直到在官方文档中看到一句话

原来已经由Xcode自动接管了。百度下:provisioning profile 本地路径,找到了~/Library/MobileDevice/Provisioning Profiles,在这个目录下找到项目的.mobileprovision文件即为描述文件。

另一个问题

需要企业账号的管理员权限去创建profiles(未验证,因为没有管理员权限);

收起阅读 »

直播预告 | 个推分享从治数到用数的企业数据智能实践

如今,数智化转型成为企业的必选战略。作为一家数据智能上市企业,每日互动(个推)面向行业客户以及政府单位提供专业的数据智能产品和解决方案,用“数据让产业更智能”。结合自身数据智能实践,每日互动(个推)重磅打造“行业数智化实战”系列直播,旨在与行业伙伴们交流企业数智化升级过程中的创新方案和宝贵经验,助力产业进入创新增长的快车道。

12月16日(周四)19:30-20:30,“行业数智化实战”系列直播第一期火热来袭!我们邀请到了个推数据中台“每日治数平台”产品负责人袁凯,为大家带来个推在品牌营销、智慧高速等垂直行业的生动实践。

直播亮点:

解读每日互动治理和挖掘万亿级数据的“高能公式”
分享每日互动在不同垂直行业的数智化“成果样板”
总结企业落地数字化升级战略过程中的“避坑经验”

继续阅读 »

如今,数智化转型成为企业的必选战略。作为一家数据智能上市企业,每日互动(个推)面向行业客户以及政府单位提供专业的数据智能产品和解决方案,用“数据让产业更智能”。结合自身数据智能实践,每日互动(个推)重磅打造“行业数智化实战”系列直播,旨在与行业伙伴们交流企业数智化升级过程中的创新方案和宝贵经验,助力产业进入创新增长的快车道。

12月16日(周四)19:30-20:30,“行业数智化实战”系列直播第一期火热来袭!我们邀请到了个推数据中台“每日治数平台”产品负责人袁凯,为大家带来个推在品牌营销、智慧高速等垂直行业的生动实践。

直播亮点:

解读每日互动治理和挖掘万亿级数据的“高能公式”
分享每日互动在不同垂直行业的数智化“成果样板”
总结企业落地数字化升级战略过程中的“避坑经验”

收起阅读 »

系统分享显示本App、获取分享的文件、选择文件以其它应用打开列表(ios)

系统分享显示本App、获取分享的文件、选择文件以其它应用打开列表(ios):https://ext.dcloud.net.cn/plugin?id=6901

系统分享显示本App、获取分享的文件、选择文件以其它应用打开列表(ios):https://ext.dcloud.net.cn/plugin?id=6901

热更新 WGT安装包中manifest.json文件的version版本不匹配

热更新

app 热更新后 小米手机清除全部数据,然后重启app ,app 重新执行热更新 这是后就会提示 WGT安装包中manifest.json文件的version版本不匹配,查看plus.runtime.version 果然变成了 基座包版本号,然后就会一直包错 Cannot read property 'screen' of undefined

解决:热更新参数WidgetOptions改为force: true(Boolean 类型 )是否强制安装 就好了。原因暂时未知
true表示强制安装,不进行版本号的校验;false则需要版本号校验,如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败。 仅安装wgt和wgtu时生效,默认值 false。
plus.runtime.install(res.tempFilePath, {
force: true
}

继续阅读 »

app 热更新后 小米手机清除全部数据,然后重启app ,app 重新执行热更新 这是后就会提示 WGT安装包中manifest.json文件的version版本不匹配,查看plus.runtime.version 果然变成了 基座包版本号,然后就会一直包错 Cannot read property 'screen' of undefined

解决:热更新参数WidgetOptions改为force: true(Boolean 类型 )是否强制安装 就好了。原因暂时未知
true表示强制安装,不进行版本号的校验;false则需要版本号校验,如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败。 仅安装wgt和wgtu时生效,默认值 false。
plus.runtime.install(res.tempFilePath, {
force: true
}

收起阅读 »

安卓原生插件Component中申请权限

原生view控件

安卓中如果需要申请权限可以调用ActivityCompat.requestPermissions方法来进行申请,第一个参数需要一个Activity。
在Component中没有直接对Activity的引用,但在initComponentHostView时,有传递Context。
所以可以通过Context来获取Activity
参考链接:https://stackoverflow.com/questions/9891360/getting-activity-from-context-in-android

    fun getActivity(ctx: Context?): Activity? {  
        if (ctx == null) return null  
        ctx.let {  
            return when (ctx) {  
                is Activity -> ctx  
                else -> getActivity((ctx as? ContextWrapper)?.baseContext)  
            }  
        }  
    }
继续阅读 »

安卓中如果需要申请权限可以调用ActivityCompat.requestPermissions方法来进行申请,第一个参数需要一个Activity。
在Component中没有直接对Activity的引用,但在initComponentHostView时,有传递Context。
所以可以通过Context来获取Activity
参考链接:https://stackoverflow.com/questions/9891360/getting-activity-from-context-in-android

    fun getActivity(ctx: Context?): Activity? {  
        if (ctx == null) return null  
        ctx.let {  
            return when (ctx) {  
                is Activity -> ctx  
                else -> getActivity((ctx as? ContextWrapper)?.baseContext)  
            }  
        }  
    }
收起阅读 »

uniapp闭坑指南

uniapp闭坑指南,之前用的react+umi+ant 开发I电脑端,所有遇到问题文档都能找到答案。手机端用了umi各种问题在文档中找不到答案。总结了很多问题,闭坑指南“别听忽悠,看着生态大,实则……”
问题1:打包之后 加载首页没有加载uni官方样式
问题2:scroll-view 不支持相对定位
问题3:不支持打包配置 Hbuilder配置极简
问题4:hbuilder 浏览器运行配置代理不生效
问题5:页面写rpx 不能被编译
问题6:后退监听不支持H5原生返回
问题7:生态强大,插件600+ 实际精华插件寥寥无几
问题8:Hbuilder js里面写变量不能自动提示
问题9:代码格式化不如vscode
问题10:框架文档不详细,提问还需要付费
问题11:提供的附件上传组件,直接上传到云上
问题12:路由不如vue路由好用

继续阅读 »

uniapp闭坑指南,之前用的react+umi+ant 开发I电脑端,所有遇到问题文档都能找到答案。手机端用了umi各种问题在文档中找不到答案。总结了很多问题,闭坑指南“别听忽悠,看着生态大,实则……”
问题1:打包之后 加载首页没有加载uni官方样式
问题2:scroll-view 不支持相对定位
问题3:不支持打包配置 Hbuilder配置极简
问题4:hbuilder 浏览器运行配置代理不生效
问题5:页面写rpx 不能被编译
问题6:后退监听不支持H5原生返回
问题7:生态强大,插件600+ 实际精华插件寥寥无几
问题8:Hbuilder js里面写变量不能自动提示
问题9:代码格式化不如vscode
问题10:框架文档不详细,提问还需要付费
问题11:提供的附件上传组件,直接上传到云上
问题12:路由不如vue路由好用

收起阅读 »

uniapp实现非连接蓝牙的广播功能

广播 蓝牙

目前官方提供的蓝牙是不支持非连接蓝牙的广播功能的,需要用native.js调用原生模块或者使用原生插件来实现

目前官方提供的蓝牙是不支持非连接蓝牙的广播功能的,需要用native.js调用原生模块或者使用原生插件来实现

uniapp 安卓设置虚拟按钮(底部虚拟按钮)(底部导航栏)为透明、半透明、背景色

uniapp 虚拟物理键
 var Color = plus.android.importClass("android.graphics.Color");  
 plus.android.importClass("android.view.Window");    
 var mainActivity = plus.android.runtimeMainActivity();    
 var window_android = mainActivity.getWindow();    
 var WindowManager=plus.android.importClass("android.view.WindowManager");    
 var View=plus.android.importClass("android.view.View");    
     //设置为全透明  
     window_android.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);  
     window_android.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN  | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);  
window_android.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);   
window_android.setNavigationBarColor(Color.TRANSPARENT);  
    //设置为全透明结束  

    //window_android.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);  //设置为半透明   

  // plus.android.invoke(window_android,"setNavigationBarColor",Color.parseColor("#000")); //为虚拟按钮添加背景色
继续阅读 »
 var Color = plus.android.importClass("android.graphics.Color");  
 plus.android.importClass("android.view.Window");    
 var mainActivity = plus.android.runtimeMainActivity();    
 var window_android = mainActivity.getWindow();    
 var WindowManager=plus.android.importClass("android.view.WindowManager");    
 var View=plus.android.importClass("android.view.View");    
     //设置为全透明  
     window_android.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);  
     window_android.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN  | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);  
window_android.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);   
window_android.setNavigationBarColor(Color.TRANSPARENT);  
    //设置为全透明结束  

    //window_android.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);  //设置为半透明   

  // plus.android.invoke(window_android,"setNavigationBarColor",Color.parseColor("#000")); //为虚拟按钮添加背景色
收起阅读 »

uniapp 打开某个应用详情页面,通过应用包名打开。

html5plus 安卓

使用plus引入类,然后使用安卓原生语言调用。需要使用应用包名。
有两种打开方式:
第一种:在应用的内部打开应用详情页(下列代码注释位置)
第二种:调用设置打开应用详情页
根据项目的应用场景来选择:
var Intent = plus.android.importClass("android.content.Intent");
var Settings = plus.android.importClass("android.provider.Settings");
var Uri = plus.android.importClass("android.net.Uri");
var mainActivity = plus.android.runtimeMainActivity();
var intent = new Intent();
var intentGoApp = new Intent(mainActivity.getIntent());
var uri = Uri.fromParts("package", "应用包名", null);

                            //内部打开  
            // intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  
            // intent.setData(uri);  
                            //内部打开结束    

                            //调用设置打开  
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
            intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");  
            intent.setData(Uri.fromParts("package",  "应用包名", null));  
                            //调用设置打开结束                                  

            mainActivity.startActivity(intent);
继续阅读 »

使用plus引入类,然后使用安卓原生语言调用。需要使用应用包名。
有两种打开方式:
第一种:在应用的内部打开应用详情页(下列代码注释位置)
第二种:调用设置打开应用详情页
根据项目的应用场景来选择:
var Intent = plus.android.importClass("android.content.Intent");
var Settings = plus.android.importClass("android.provider.Settings");
var Uri = plus.android.importClass("android.net.Uri");
var mainActivity = plus.android.runtimeMainActivity();
var intent = new Intent();
var intentGoApp = new Intent(mainActivity.getIntent());
var uri = Uri.fromParts("package", "应用包名", null);

                            //内部打开  
            // intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  
            // intent.setData(uri);  
                            //内部打开结束    

                            //调用设置打开  
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
            intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");  
            intent.setData(Uri.fromParts("package",  "应用包名", null));  
                            //调用设置打开结束                                  

            mainActivity.startActivity(intent);
收起阅读 »

uniapp 获取已安装的应用,以及图标转换

html5plus 安卓 base64 bitmap

主要使用Native.js引用安卓的一些类,然后根据安卓原生来获取。

包名、版本、应用名都能正常获取,但是图标获取出来的并不是base64,所以我们要转为base64的路径,这里有一个坑(使用image标签引用转换出来的base64是不行的,要使用img标签), 转换的时间可能较慢,多等待一下。

plus.android.importClass('android.graphics.drawable.BitmapDrawable');
var BitmapFactory = plus.android.importClass("android.graphics.BitmapFactory");
var Base64 = plus.android.importClass("android.util.Base64");
var Bitmap = plus.android.importClass('android.graphics.Bitmap');
var ByteArrayOutputStream = plus.android.importClass("java.io.ByteArrayOutputStream");
var Canvas = plus.android.importClass('android.graphics.Canvas');
plus.android.importClass('java.util.ArrayList');
plus.android.importClass('android.content.pm.PackageInfo');
plus.android.importClass('android.content.pm.PackageManager');
var ApplicationInfo = plus.android.importClass('android.content.pm.ApplicationInfo');
var MainActivity = plus.android.runtimeMainActivity();
var PackageManager = MainActivity.getPackageManager();
if (pinfo != null) {
for (var i = 0; i < pinfo.size(); i++) {
//PackageInfo{4b45699f9d com.tencent.mobileqq}
var pkginfo = pinfo.get(i);
var issysapk = ((pkginfo.plusGetAttribute("applicationInfo").plusGetAttribute("flags") & ApplicationInfo.FLAG_SYSTEM) != 0) ? true : false
if (issysapk == false) {
const apkinfo = {
appName: pkginfo.plusGetAttribute("applicationInfo").loadLabel(PackageManager).toString(),
packageName: pkginfo.plusGetAttribute("packageName"),
versionName: pkginfo.plusGetAttribute("versionName"),
versionCode: pkginfo.plusGetAttribute("versionCode"),
appIco:pkginfo.plusGetAttribute("applicationInfo").loadIcon(PackageManager)
};
var bimp=null;
try{
bimp=apkinfo.appIco.getBitmap();
}catch(e){
bimp = Bitmap.createBitmap(apkinfo.appIco.getIntrinsicWidth(), apkinfo.appIco.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
var canvas = new Canvas(bimp);
apkinfo.appIco.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
apkinfo.appIco.draw(canvas);
}
var baos = new ByteArrayOutputStream();
bimp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
baos.flush();
baos.close();
var bitmapBytes = baos.toByteArray();
var result = "data:image/jpeg;base64,"+Base64.encodeToString(bitmapBytes, Base64.DEFAULT);
apkinfo.appIcon=result;
apkKist.push(apkinfo);
};
};
};

继续阅读 »

主要使用Native.js引用安卓的一些类,然后根据安卓原生来获取。

包名、版本、应用名都能正常获取,但是图标获取出来的并不是base64,所以我们要转为base64的路径,这里有一个坑(使用image标签引用转换出来的base64是不行的,要使用img标签), 转换的时间可能较慢,多等待一下。

plus.android.importClass('android.graphics.drawable.BitmapDrawable');
var BitmapFactory = plus.android.importClass("android.graphics.BitmapFactory");
var Base64 = plus.android.importClass("android.util.Base64");
var Bitmap = plus.android.importClass('android.graphics.Bitmap');
var ByteArrayOutputStream = plus.android.importClass("java.io.ByteArrayOutputStream");
var Canvas = plus.android.importClass('android.graphics.Canvas');
plus.android.importClass('java.util.ArrayList');
plus.android.importClass('android.content.pm.PackageInfo');
plus.android.importClass('android.content.pm.PackageManager');
var ApplicationInfo = plus.android.importClass('android.content.pm.ApplicationInfo');
var MainActivity = plus.android.runtimeMainActivity();
var PackageManager = MainActivity.getPackageManager();
if (pinfo != null) {
for (var i = 0; i < pinfo.size(); i++) {
//PackageInfo{4b45699f9d com.tencent.mobileqq}
var pkginfo = pinfo.get(i);
var issysapk = ((pkginfo.plusGetAttribute("applicationInfo").plusGetAttribute("flags") & ApplicationInfo.FLAG_SYSTEM) != 0) ? true : false
if (issysapk == false) {
const apkinfo = {
appName: pkginfo.plusGetAttribute("applicationInfo").loadLabel(PackageManager).toString(),
packageName: pkginfo.plusGetAttribute("packageName"),
versionName: pkginfo.plusGetAttribute("versionName"),
versionCode: pkginfo.plusGetAttribute("versionCode"),
appIco:pkginfo.plusGetAttribute("applicationInfo").loadIcon(PackageManager)
};
var bimp=null;
try{
bimp=apkinfo.appIco.getBitmap();
}catch(e){
bimp = Bitmap.createBitmap(apkinfo.appIco.getIntrinsicWidth(), apkinfo.appIco.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
var canvas = new Canvas(bimp);
apkinfo.appIco.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
apkinfo.appIco.draw(canvas);
}
var baos = new ByteArrayOutputStream();
bimp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
baos.flush();
baos.close();
var bitmapBytes = baos.toByteArray();
var result = "data:image/jpeg;base64,"+Base64.encodeToString(bitmapBytes, Base64.DEFAULT);
apkinfo.appIcon=result;
apkKist.push(apkinfo);
};
};
};

收起阅读 »

Nvue webview 错误页面自定义

Webview nvue

nvue web-view组件引入网络页面时,如果网络页面发生错误,会出现比较难看的样式
但是官方文档中页面没有web-view错误的回调
但是其实weex中的web组件的回调,在uniapp的web-view也是可以绑定着用的

nvue web-view组件引入网络页面时,如果网络页面发生错误,会出现比较难看的样式
但是官方文档中页面没有web-view错误的回调
但是其实weex中的web组件的回调,在uniapp的web-view也是可以绑定着用的