HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

ios ajax的http请求无法响应

ATS

最新版本的hbuildx推送ios真机调试无法HTTP通信。没有响应。应该是又被启用了ats验证了吧。

最新版本的hbuildx推送ios真机调试无法HTTP通信。没有响应。应该是又被启用了ats验证了吧。

uni.request传递复杂对象

移动APP request

js版serialize 实现

function serialize (obj, prefix) {  
  const str = []  
  let p  
  if (obj.length === 0) {  
    //  str.push(encodeURIComponent(prefix) + '=1')  
  } else {  
    for (p in obj) {  
      if (obj.hasOwnProperty(p)) {  
        const k = prefix ? prefix + '[' + p + ']' : p  
        let v = obj[p]  
        if (v instanceof Date) {  
          v = parseTime(v)  
        }  
        str.push((v !== null && typeof v === 'object') ? serialize(v, k) : encodeURIComponent(k) + '=' + encodeURIComponent(  
          v))  
      }  
    }  
  }  

  return str.join('&')  
}

uni.request.data改造

options.data = serialize(options.data)

这样就可以了

继续阅读 »

js版serialize 实现

function serialize (obj, prefix) {  
  const str = []  
  let p  
  if (obj.length === 0) {  
    //  str.push(encodeURIComponent(prefix) + '=1')  
  } else {  
    for (p in obj) {  
      if (obj.hasOwnProperty(p)) {  
        const k = prefix ? prefix + '[' + p + ']' : p  
        let v = obj[p]  
        if (v instanceof Date) {  
          v = parseTime(v)  
        }  
        str.push((v !== null && typeof v === 'object') ? serialize(v, k) : encodeURIComponent(k) + '=' + encodeURIComponent(  
          v))  
      }  
    }  
  }  

  return str.join('&')  
}

uni.request.data改造

options.data = serialize(options.data)

这样就可以了

收起阅读 »

iOS 云打包后台权限配置教程

iOS后台权限

iOS App 在使用一些功能时需要申请后台权限,比如后台音频播放、后台定位等,在提交云打包时,需要在 manifest.json 的 "app-plus" -> "distribute" -> "ios" -> "UIBackgroundModes" 节点添加对应权限的 描述key 即可;

注意:后台权限用不到千万不要填写,以免审核被拒

{  
"app-plus" : {  
        /* 应用发布信息 */  
        "distribute" : {  
            /* ios打包配置 */  
            "ios" : {  
                "UIBackgroundModes" : [ "audio"] // 数组,支持多个  
            },  
         ...  
        }  
    }  
}

权限描述key获取方式

在 xcode 中勾选权限

然后查看 info.plist 右键勾选 Raw Keys & Values UIBackgroundModes 对应的就是需要填写在 manifest.json 中的 值

所有 key

audio  // Audio, AirPlay, and Picture in Picture  
bluetooth-central // Uses Bluetooth LE accessories  
bluetooth-peripheral // Acts as a Bluetooth LE accessory  
external-accessory // External accessory communication  
fetch // Background fetch  
location // Location updates  
processing // Background processing  
remote-notification // Remote notifications  
voip   // Voice over IP
继续阅读 »

iOS App 在使用一些功能时需要申请后台权限,比如后台音频播放、后台定位等,在提交云打包时,需要在 manifest.json 的 "app-plus" -> "distribute" -> "ios" -> "UIBackgroundModes" 节点添加对应权限的 描述key 即可;

注意:后台权限用不到千万不要填写,以免审核被拒

{  
"app-plus" : {  
        /* 应用发布信息 */  
        "distribute" : {  
            /* ios打包配置 */  
            "ios" : {  
                "UIBackgroundModes" : [ "audio"] // 数组,支持多个  
            },  
         ...  
        }  
    }  
}

权限描述key获取方式

在 xcode 中勾选权限

然后查看 info.plist 右键勾选 Raw Keys & Values UIBackgroundModes 对应的就是需要填写在 manifest.json 中的 值

所有 key

audio  // Audio, AirPlay, and Picture in Picture  
bluetooth-central // Uses Bluetooth LE accessories  
bluetooth-peripheral // Acts as a Bluetooth LE accessory  
external-accessory // External accessory communication  
fetch // Background fetch  
location // Location updates  
processing // Background processing  
remote-notification // Remote notifications  
voip   // Voice over IP
收起阅读 »

vue(uni-app)中对数值进行保留小数点后两位的处理(两种情况)

uni_app Vue

View部分代码:
<view class="com_middle1 com_middle_bg">
<view>投资金额</view>
<view>{{ numFilter(object.InvestmentAmount) + object.MoneyUnit }}</view>
</view>

JS部分:(注意toFixed()只能用在数值部分)
第一保留小数点数值后两位,尾数四舍五入
numFilter (value) {
// 截取当前数据到小数点后两位
let realVal = parseFloat(value).toFixed(2)
return realVal
}
第二保留小数点后两位的过滤器,不会四舍五入
numFilter (value) {
// 截取当前数据到小数点后三位
let tempVal = parseFloat(value).toFixed(3)
let realVal = tempVal.substring(0, tempVal.length - 1)
return realVal
}

继续阅读 »

View部分代码:
<view class="com_middle1 com_middle_bg">
<view>投资金额</view>
<view>{{ numFilter(object.InvestmentAmount) + object.MoneyUnit }}</view>
</view>

JS部分:(注意toFixed()只能用在数值部分)
第一保留小数点数值后两位,尾数四舍五入
numFilter (value) {
// 截取当前数据到小数点后两位
let realVal = parseFloat(value).toFixed(2)
return realVal
}
第二保留小数点后两位的过滤器,不会四舍五入
numFilter (value) {
// 截取当前数据到小数点后三位
let tempVal = parseFloat(value).toFixed(3)
let realVal = tempVal.substring(0, tempVal.length - 1)
return realVal
}

收起阅读 »

HBuilderX官方QQ交流群

HBuilderX

为了方便大家技术交流,因此建立了QQ群

HX官方群15:793046085
HX官方群14:750929504 (2000人群)
HX官方群13:1029243934 (2000人群,已满)
HX官方群12: 1051711389 (1000人群,已满)
HX官方群11: 1051710376 (2000人群,已满)
HX官方群9:824581834 (500人群)
HX官方群8:759481147(2000人群)
HX官方群7:768137673 (500人群,已满)
HX官方群6:843092525 (500人群,已满)
HX官方群5:178140648 (1000人群,还有几十个空名额)
HX官方群4:905643840(500人群,已满)
HX官方群3:335122268(500人群,已满)
HX官方群2:363040810(500人群,已满)

Mac交流群

仅限mac用户加入

  • Mac群1: 148229211
  • Mac群2: 339884851
继续阅读 »

为了方便大家技术交流,因此建立了QQ群

HX官方群15:793046085
HX官方群14:750929504 (2000人群)
HX官方群13:1029243934 (2000人群,已满)
HX官方群12: 1051711389 (1000人群,已满)
HX官方群11: 1051710376 (2000人群,已满)
HX官方群9:824581834 (500人群)
HX官方群8:759481147(2000人群)
HX官方群7:768137673 (500人群,已满)
HX官方群6:843092525 (500人群,已满)
HX官方群5:178140648 (1000人群,还有几十个空名额)
HX官方群4:905643840(500人群,已满)
HX官方群3:335122268(500人群,已满)
HX官方群2:363040810(500人群,已满)

Mac交流群

仅限mac用户加入

  • Mac群1: 148229211
  • Mac群2: 339884851
收起阅读 »

消息推送一个好功能,90%的开发者都不知道

消息推送

1.个推报表简介

推送数据报表主要用于统计某一条消息的具体下发情况。单条推送消息下发用户总量有多少,其中成功推送到手机的数量有多少,又有多少用户看到了弹窗通知、点击了弹窗通知并打开了应用。通过消息推送报表可以很直观地看到推送消息流转情况、消息下发到达成功率、用户对消息的点击情况等。

当然推送报表不单单只有上述这一种维度,个推的推送统计主要分了三个维度:消息推送维度、APP推送维度、APP用户维度。

  • 消息推送维度:针对单个消息推送,提供单条消息推送的下发成功数,手机到达数,弹窗展示数等
  • APP推送维度:针对应用单日所有消息推送,单日所有任务的下发成功数,手机到达数,弹窗展示数等
  • APP用户维度:针对应用单日用户数据,应用单日新增用户数、在线用户数等

上述三个维度的推送数据统计则是通过个推开发者中心服务端SDK集成接口来进行输出。个推开发者中心提供详细的可视化图表,服务端SDK集成接口则提供服务端的数据记录和统计。两者的数据都是一致的,但功能和数据类型上有些许不同,使用者可以根据自己需求选用不同的方式。下面将分别从个推开发者中心服务端SDK集成接口两方面对个推报表进行阐述。

2.开发者中心

登录个推开发者中心,在产品与服务界面选择个推消息推送消息推送后进入了应用列表页面,选择相应的应用,点击数据报表即可在数据统计栏目中看到各个维度的推送统计数据。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190920160039840.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FuZHJvaWxseQ==,size_16,color_FFFFFF,t_70 =200x300)

2.1 推送记录

推送记录中保存了所有的历史推送,通过点击 "推送数据" 可以查询该推送的任务报表情况。
在这里插入图片描述

2.2 推送数据(消息推送维度)

针对单个消息推送,提供报表数据。

  • 百日联网用户数:最近百日所有打开过APP的用户,可以理解为预计可以下发的用户总量。
  • 成功下发数:消息下发的实际用户量。APP在手机后台中存活才会进行下发,否则不会进行消息下发。
  • 到达数:成功下发到手机的消息数。到达手机后因为网络等原因,无法回执到服务端,所以成功下发数会略大于到达数。
  • 展示数:手机弹窗展示消息的数量。部分用户可能对应用设置了禁止弹窗,所以到达数会大于展示数。
  • 点击数:手机用户点击弹窗通知的数量
    在这里插入图片描述
    上图中展示的报表数据是个推+其他渠道的累加数据,点击详情即可看到各个渠道下发统计。其中的 "-" 表示不支持该字段报表
    在这里插入图片描述

2.3 推送统计(APP推送维度)

推送统计从APP推送维度出发,对APP当天所有任务的下发数据进行统计。举个例子,APP开发者15号下发的消息,可能用户16号打开手机才会收到,但是此次数据仍会统计到15号的推送统计中。针对这种情况,个推会对APP统计数据在三天内予以持续更新。所以APP推送统计数据会在之后的三天持续更新。日联网用户数:当天打开应用的用户数

  • 成功下发数、到达数、展示数、点击数:和上述一致

点击展开也能看到各个渠道的App维度统计。
在这里插入图片描述

2.5 实时性和准确性

创建一个新的推送任务,能够实时地看到推送的总体趋势,趋势数据会进行实时更新。
在这里插入图片描述

已完成推送的任务报表数据,为什么到了第二天数据会发生变化?
个推内部推送数据报表分成两种:实时报表和统计报表。第二天统计报表会对前一天的实时报表进行修正。

实时报表以实时性为主,具有实时更新的功能。APP开发者如果想查看当天下发的任务数据,可以选择实时报表。。相比起实时报表,统计报表更加注重准确性,旨在通过统计分析,对数据进行筛选、去重,得到最终的准确报表。APP开发者一般隔天就能查询到准确的报表数据。

3.服务端SDK集成接口

在官网提供的SDK Demo中就有示例程序,做了很好的封装,返回结果也做了预处理。。APP开发者只需要传入简单的参数即可完成报表查询, SDK接口提供了一些开发者平台中没有的数据统计服务,如用户数据中的最近24小时在线趋势统计、根据用户条件查询用户数等。
详细可参考 文档中心Java服务端集成文档

/**  
 * 推送结果相关demo  
 */  
public class PushResultDemo {  

    public static IGtPush gtPush = new IGtPush(APPKEY, MASTERSECRET);  

    /**  
     * 获取推送结果,可查询消息有效可下发总数,消息回执总数,用户点击数等结果。  
     * @param taskId  
     */  
    private static void getPushResultByTaskId(String taskId) {  
        Map<String, Object> ret = gtPush.getPushResult(taskId).getResponse();  
        System.out.println(JSON.toJSONString(ret));  
    }  

    /**  
     * 获取应用单日的推送数据(推送数据包括:发送总数,在线发送数,接收数,展示数,点击数)(目前只支持查询1天前的数据)  
     */  
    private static void queryAppPushDataByDate(String date) {  
        IQueryResult ret = gtPush.queryAppPushDataByDate(APPID, date);  
        Map<String, Object> res = ret.getResponse();  
        System.out.println(JSON.toJSONString(ret));  
        for(Map.Entry<String,Object> entry: res.entrySet()){  
            System.out.println(entry.getKey()+" "+entry.getValue());  
        }  
    }  

     /**  
     * 通过接口查询当前时间一天内的在线数(十分钟一个点,一小时六个点)  
     */  
    private static void getLast24HoursOnlineUserStatistics () {  
        IQueryResult queryResult = push.getLast24HoursOnlineUserStatistics(APPID);  
        System.out.println(queryResult.getResponse().get("onlineStatics"));  
    }  

    /**  
     * 获取某个应用单日的用户数据(用户数据包括:新增用户数,累计注册用户总数,在线峰值,日联网用户数)  
注:目前可查询1天前的数据  
     */  
    private static void queryAppUserDataByDate(String date) {  
        IQueryResult ret = push.queryAppUserDataByDate(APPID, date);  
        System.out.println(ret.getResponse().toString());  

        Map<String, Object> data = (Map<String, Object>) ret.getResponse().get("data");  
        System.out.println("新用户注册总数:"+data.get("newRegistCount"));  
        System.out.println("用户注册总数:"+data.get("registTotalCount"));  
        System.out.println("活跃用户数:"+data.get("activeCount"));  
        System.out.println("在线用户数:"+data.get("onlineCount"));  
    }  

}

小结

推送数据报表是个推消息推送服务中的重要组成成分,通过推送报表可以直观、准确地了解消息触达用户的详细情况,对推送数据一目了然。个推将针对报表服务不断优化,为APP开发者们提供更加完善的推送数据统计支持。

继续阅读 »

1.个推报表简介

推送数据报表主要用于统计某一条消息的具体下发情况。单条推送消息下发用户总量有多少,其中成功推送到手机的数量有多少,又有多少用户看到了弹窗通知、点击了弹窗通知并打开了应用。通过消息推送报表可以很直观地看到推送消息流转情况、消息下发到达成功率、用户对消息的点击情况等。

当然推送报表不单单只有上述这一种维度,个推的推送统计主要分了三个维度:消息推送维度、APP推送维度、APP用户维度。

  • 消息推送维度:针对单个消息推送,提供单条消息推送的下发成功数,手机到达数,弹窗展示数等
  • APP推送维度:针对应用单日所有消息推送,单日所有任务的下发成功数,手机到达数,弹窗展示数等
  • APP用户维度:针对应用单日用户数据,应用单日新增用户数、在线用户数等

上述三个维度的推送数据统计则是通过个推开发者中心服务端SDK集成接口来进行输出。个推开发者中心提供详细的可视化图表,服务端SDK集成接口则提供服务端的数据记录和统计。两者的数据都是一致的,但功能和数据类型上有些许不同,使用者可以根据自己需求选用不同的方式。下面将分别从个推开发者中心服务端SDK集成接口两方面对个推报表进行阐述。

2.开发者中心

登录个推开发者中心,在产品与服务界面选择个推消息推送消息推送后进入了应用列表页面,选择相应的应用,点击数据报表即可在数据统计栏目中看到各个维度的推送统计数据。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190920160039840.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FuZHJvaWxseQ==,size_16,color_FFFFFF,t_70 =200x300)

2.1 推送记录

推送记录中保存了所有的历史推送,通过点击 "推送数据" 可以查询该推送的任务报表情况。
在这里插入图片描述

2.2 推送数据(消息推送维度)

针对单个消息推送,提供报表数据。

  • 百日联网用户数:最近百日所有打开过APP的用户,可以理解为预计可以下发的用户总量。
  • 成功下发数:消息下发的实际用户量。APP在手机后台中存活才会进行下发,否则不会进行消息下发。
  • 到达数:成功下发到手机的消息数。到达手机后因为网络等原因,无法回执到服务端,所以成功下发数会略大于到达数。
  • 展示数:手机弹窗展示消息的数量。部分用户可能对应用设置了禁止弹窗,所以到达数会大于展示数。
  • 点击数:手机用户点击弹窗通知的数量
    在这里插入图片描述
    上图中展示的报表数据是个推+其他渠道的累加数据,点击详情即可看到各个渠道下发统计。其中的 "-" 表示不支持该字段报表
    在这里插入图片描述

2.3 推送统计(APP推送维度)

推送统计从APP推送维度出发,对APP当天所有任务的下发数据进行统计。举个例子,APP开发者15号下发的消息,可能用户16号打开手机才会收到,但是此次数据仍会统计到15号的推送统计中。针对这种情况,个推会对APP统计数据在三天内予以持续更新。所以APP推送统计数据会在之后的三天持续更新。日联网用户数:当天打开应用的用户数

  • 成功下发数、到达数、展示数、点击数:和上述一致

点击展开也能看到各个渠道的App维度统计。
在这里插入图片描述

2.5 实时性和准确性

创建一个新的推送任务,能够实时地看到推送的总体趋势,趋势数据会进行实时更新。
在这里插入图片描述

已完成推送的任务报表数据,为什么到了第二天数据会发生变化?
个推内部推送数据报表分成两种:实时报表和统计报表。第二天统计报表会对前一天的实时报表进行修正。

实时报表以实时性为主,具有实时更新的功能。APP开发者如果想查看当天下发的任务数据,可以选择实时报表。。相比起实时报表,统计报表更加注重准确性,旨在通过统计分析,对数据进行筛选、去重,得到最终的准确报表。APP开发者一般隔天就能查询到准确的报表数据。

3.服务端SDK集成接口

在官网提供的SDK Demo中就有示例程序,做了很好的封装,返回结果也做了预处理。。APP开发者只需要传入简单的参数即可完成报表查询, SDK接口提供了一些开发者平台中没有的数据统计服务,如用户数据中的最近24小时在线趋势统计、根据用户条件查询用户数等。
详细可参考 文档中心Java服务端集成文档

/**  
 * 推送结果相关demo  
 */  
public class PushResultDemo {  

    public static IGtPush gtPush = new IGtPush(APPKEY, MASTERSECRET);  

    /**  
     * 获取推送结果,可查询消息有效可下发总数,消息回执总数,用户点击数等结果。  
     * @param taskId  
     */  
    private static void getPushResultByTaskId(String taskId) {  
        Map<String, Object> ret = gtPush.getPushResult(taskId).getResponse();  
        System.out.println(JSON.toJSONString(ret));  
    }  

    /**  
     * 获取应用单日的推送数据(推送数据包括:发送总数,在线发送数,接收数,展示数,点击数)(目前只支持查询1天前的数据)  
     */  
    private static void queryAppPushDataByDate(String date) {  
        IQueryResult ret = gtPush.queryAppPushDataByDate(APPID, date);  
        Map<String, Object> res = ret.getResponse();  
        System.out.println(JSON.toJSONString(ret));  
        for(Map.Entry<String,Object> entry: res.entrySet()){  
            System.out.println(entry.getKey()+" "+entry.getValue());  
        }  
    }  

     /**  
     * 通过接口查询当前时间一天内的在线数(十分钟一个点,一小时六个点)  
     */  
    private static void getLast24HoursOnlineUserStatistics () {  
        IQueryResult queryResult = push.getLast24HoursOnlineUserStatistics(APPID);  
        System.out.println(queryResult.getResponse().get("onlineStatics"));  
    }  

    /**  
     * 获取某个应用单日的用户数据(用户数据包括:新增用户数,累计注册用户总数,在线峰值,日联网用户数)  
注:目前可查询1天前的数据  
     */  
    private static void queryAppUserDataByDate(String date) {  
        IQueryResult ret = push.queryAppUserDataByDate(APPID, date);  
        System.out.println(ret.getResponse().toString());  

        Map<String, Object> data = (Map<String, Object>) ret.getResponse().get("data");  
        System.out.println("新用户注册总数:"+data.get("newRegistCount"));  
        System.out.println("用户注册总数:"+data.get("registTotalCount"));  
        System.out.println("活跃用户数:"+data.get("activeCount"));  
        System.out.println("在线用户数:"+data.get("onlineCount"));  
    }  

}

小结

推送数据报表是个推消息推送服务中的重要组成成分,通过推送报表可以直观、准确地了解消息触达用户的详细情况,对推送数据一目了然。个推将针对报表服务不断优化,为APP开发者们提供更加完善的推送数据统计支持。

收起阅读 »

uni-app展示富文本内容,图片的宽度溢出屏幕,解决方案!

这个问题虽然已经过去有一段时间了,但是我还是要写出来和大家分享!毕竟一个人或者是两个人写的也不一定会符合自己想要的结果,我也不知道会帮到多少人,还是要写一下,供大家参考。。。
现在的项目已经进入尾声,之前遇到这个问题解决了一段时间,在网上找了各种各种,说的不符合我。刚开始我是使用v-html这个api是可以加载富文本的(开始不了解rich-text),加载的富文本因为有图片,图片一直就是溢出屏幕的状态,在网上看了别人说的html.replace()做替换,根据标签替换的html.p.img{width:100% }试过了一遍都不好使,最后一个朋友说是用这个方法比较靠谱。确实很实用的一种方案,下边我写出来供参考:
html: <rich-text :nodes="content"></rich-text>
js: var richtext = res.data.list.Content;
const regex = new RegExp('<img', 'gi');
this.content = richtext.replace(regex, <img style="max-width: 100%;");

但是也有弊端:

继续阅读 »

这个问题虽然已经过去有一段时间了,但是我还是要写出来和大家分享!毕竟一个人或者是两个人写的也不一定会符合自己想要的结果,我也不知道会帮到多少人,还是要写一下,供大家参考。。。
现在的项目已经进入尾声,之前遇到这个问题解决了一段时间,在网上找了各种各种,说的不符合我。刚开始我是使用v-html这个api是可以加载富文本的(开始不了解rich-text),加载的富文本因为有图片,图片一直就是溢出屏幕的状态,在网上看了别人说的html.replace()做替换,根据标签替换的html.p.img{width:100% }试过了一遍都不好使,最后一个朋友说是用这个方法比较靠谱。确实很实用的一种方案,下边我写出来供参考:
html: <rich-text :nodes="content"></rich-text>
js: var richtext = res.data.list.Content;
const regex = new RegExp('<img', 'gi');
this.content = richtext.replace(regex, <img style="max-width: 100%;");

但是也有弊端:

收起阅读 »

注册变量时调用函数,微信小程序端无法在第一次渲染时传值到组件

uniapp

注册变量时调用函数,微信小程序端无法在第一次渲染时传值到组件,需要在onLoad中更新变量重新渲染,希望后期版本能够支持,让源码变得更加简洁

注册变量时调用函数,微信小程序端无法在第一次渲染时传值到组件,需要在onLoad中更新变量重新渲染,希望后期版本能够支持,让源码变得更加简洁

iOS13即将到来,iOS推送DeviceToken适配方案详解

iOS 消息推送

随着苹果iOS13系统即将发布,个推提前推出DeviceToken适配方案,以确保新版本的兼容与APP推送服务的正常使用。iOS13的一个重要变化是"[deviceToken description]" 会受不同运行环境及系统的影响而发生变化,如果未及时做好适配工作,会导致SDK绑定到错误的DeviceToken,从而影响APN推送。请各位开发者根据当前运行环境做出相应的更新与优化,以保障用户在iOS13系统上有更好的使用体验。

在Xcode11、iOS13运行时"[deviceToken description]",情况如下图所示:

在Xcode11、iOS12或Xcode10及以下版本运行时"[deviceToken description]",情况如下图所示:

针对开发者注册DeviceToken的不同场景,个推提出了相应的iOS推送SDK适配方案。

若使用“[GeTuiSdk registerDeviceTokenData:]”方法来注册DeviceToken,如下图所示:

适配方案(推荐):因老版个推推送SDK未适配Xcode11、iOS13变化,可以选择升级个推SDK版本至 “2.4.1.0”(http://docs.getui.com/getui/mobile/ios/xcode/)。此方案的代码处理最为简便。

若使用“[GeTuiSdk registerDeviceToken:]”方法来注册DeviceToken,如下图所示:

适配方案:因获取DeviceToken字符串的过程就是将NSData转换成HexString,在"[deviceToken description]"发出变化后,就需要开发者修改转换方案,参考代码如下图:

DeviceToken的适配对iOS推送SDK的集成至关重要。请大家尽早选择相应的适配方案,以更好地兼容苹果新版本。如有任何问题,请随时与我们联系(QQ:3007288158)。感谢大家对个推的支持与配合。

继续阅读 »

随着苹果iOS13系统即将发布,个推提前推出DeviceToken适配方案,以确保新版本的兼容与APP推送服务的正常使用。iOS13的一个重要变化是"[deviceToken description]" 会受不同运行环境及系统的影响而发生变化,如果未及时做好适配工作,会导致SDK绑定到错误的DeviceToken,从而影响APN推送。请各位开发者根据当前运行环境做出相应的更新与优化,以保障用户在iOS13系统上有更好的使用体验。

在Xcode11、iOS13运行时"[deviceToken description]",情况如下图所示:

在Xcode11、iOS12或Xcode10及以下版本运行时"[deviceToken description]",情况如下图所示:

针对开发者注册DeviceToken的不同场景,个推提出了相应的iOS推送SDK适配方案。

若使用“[GeTuiSdk registerDeviceTokenData:]”方法来注册DeviceToken,如下图所示:

适配方案(推荐):因老版个推推送SDK未适配Xcode11、iOS13变化,可以选择升级个推SDK版本至 “2.4.1.0”(http://docs.getui.com/getui/mobile/ios/xcode/)。此方案的代码处理最为简便。

若使用“[GeTuiSdk registerDeviceToken:]”方法来注册DeviceToken,如下图所示:

适配方案:因获取DeviceToken字符串的过程就是将NSData转换成HexString,在"[deviceToken description]"发出变化后,就需要开发者修改转换方案,参考代码如下图:

DeviceToken的适配对iOS推送SDK的集成至关重要。请大家尽早选择相应的适配方案,以更好地兼容苹果新版本。如有任何问题,请随时与我们联系(QQ:3007288158)。感谢大家对个推的支持与配合。

收起阅读 »

UniPush离线集成指南——Android

uniapp unipush

准备

  1. 通过官方途径申请UniPush账号,参考使用指南
  2. 离线SDK

配置

  • 依赖文件
    将aps-unipush-release.aar、aps-release.aar拷贝到已有项目libs文件夹下。

  • gradle配置
    打开build.gradle,在defaultConfig添加manifestPlaceholders节点,如下图所示,将io.dcloud.HBuilder替换成自己的应用包名,将appid等信息替换成申请之后的appid等。

    android {  
    defaultConfig {  
        manifestPlaceholders = [  
                "plus.unipush.appid" : "pPyZWvH3Fa6PXba19ID0091",  
                "plus.unipush.appkey" : "b7dOGlNPHR7pqwUxcXPVi44",  
                "plus.unipush.appsecret": "IxVYAT9qws8dlNElacmSg12",  
                "apk.applicationId":"io.dcloud.HBuilder"  
        ]  
    }  
    }  
  • 厂商配置
    添加下列内容到androidmanifest.xml中(未申请平台无需添加)

        <meta-data  
            android:name="MIPUSH_APPID"  
            android:value="XM_${XIAOMI_APP_ID}" />  
        <meta-data  
            android:name="MIPUSH_APPKEY"  
            android:value="XM_${XIAOMI_APP_KEY}" />  
        <meta-data  
            android:name="MEIZUPUSH_APPID"  
            android:value="MZ_${MEIZU_APP_ID}" />  
        <meta-data  
            android:name="MEIZUPUSH_APPKEY"  
            android:value="MZ_${MEIZU_APP_KEY}" />  
        <meta-data  
            android:name="com.huawei.hms.client.appid"  
            android:value="${HUAWEI_APP_ID}" />  
        <meta-data  
            android:name="OPPOPUSH_APPKEY"  
            android:value="OP_${OPPO_APP_KEY}" />  
        <meta-data  
            android:name="OPPOPUSH_APPSECRET"  
            android:value="OP_${OPPO_APP_SECRET}" />  
        <meta-data  
            android:name="com.vivo.push.app_id"  
            android:value="${VIVO_APP_ID}" />  
        <meta-data  
            android:name="com.vivo.push.api_key"  
            android:value="${VIVO_APP_KEY}" />  

    修改build.gradle,添加对应平台申请的appkey或appid(键名必须统一,如XIAOMI_APP_ID比如同时存在于build.gradle文件和Androidmanifest.xml文件中),如下所示:

    android {  
    defaultConfig {  
        manifestPlaceholders = [  
                "plus.unipush.appid" : "pPyZWvH3Fa6PXba19ID0091",  
                "plus.unipush.appkey" : "b7dOGlNPHR7pqwUxcXPVi45",  
                "plus.unipush.appsecret": "IxVYAT9qws8dlNElacmSg12",  
                "apk.applicationId":"io.dcloud.HBuilder",  
                "XIAOMI_APP_ID":"ccccccccc"  
        ]  
    }  
    }  
  • dcloud_properties.xml配置
    在properties中添加如下配置,features节点与services节点必须同时配置!

    <properties>  
    <features>  
        <feature name="Push" value="io.dcloud.feature.aps.APSFeatureImpl">  
            <module name="unipush" value="io.dcloud.feature.unipush.GTPushService"/>  
        </feature>  
    </features>     
    <services>  
        <service name="push" value="io.dcloud.feature.aps.APSFeatureImpl"/>  
    </services>  
    </properties>  
  • 其余配置
    oppo集成UniPush时需在Androidmanifest.xml的入口activity中添加如下配置:

    <activity  
            android:name="io.dcloud.PandoraEntry">  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
            /*oppo配置开始*/  
            <intent-filter>  
                <action android:name="android.intent.action.oppopush" />  
                <category android:name="android.intent.category.DEFAULT" />  
            </intent-filter>  
            /*oppo配置结束*/  
        </activity>  

注意

  • UniPush与个推及小米推送存在冲突,使用时请确保小米推送及个推相关文件已删除。
  • 上述账号信息仅为展示使用,使用时需替换成自己申请的appkey等信息。
  • 为了最大化的减少配置,权限及其他厂商配置统统放入aar中。
  • 集成UniPush时,原Androidmanifest.xml中对应的小米和个推的配置也需删除。
继续阅读 »

准备

  1. 通过官方途径申请UniPush账号,参考使用指南
  2. 离线SDK

配置

  • 依赖文件
    将aps-unipush-release.aar、aps-release.aar拷贝到已有项目libs文件夹下。

  • gradle配置
    打开build.gradle,在defaultConfig添加manifestPlaceholders节点,如下图所示,将io.dcloud.HBuilder替换成自己的应用包名,将appid等信息替换成申请之后的appid等。

    android {  
    defaultConfig {  
        manifestPlaceholders = [  
                "plus.unipush.appid" : "pPyZWvH3Fa6PXba19ID0091",  
                "plus.unipush.appkey" : "b7dOGlNPHR7pqwUxcXPVi44",  
                "plus.unipush.appsecret": "IxVYAT9qws8dlNElacmSg12",  
                "apk.applicationId":"io.dcloud.HBuilder"  
        ]  
    }  
    }  
  • 厂商配置
    添加下列内容到androidmanifest.xml中(未申请平台无需添加)

        <meta-data  
            android:name="MIPUSH_APPID"  
            android:value="XM_${XIAOMI_APP_ID}" />  
        <meta-data  
            android:name="MIPUSH_APPKEY"  
            android:value="XM_${XIAOMI_APP_KEY}" />  
        <meta-data  
            android:name="MEIZUPUSH_APPID"  
            android:value="MZ_${MEIZU_APP_ID}" />  
        <meta-data  
            android:name="MEIZUPUSH_APPKEY"  
            android:value="MZ_${MEIZU_APP_KEY}" />  
        <meta-data  
            android:name="com.huawei.hms.client.appid"  
            android:value="${HUAWEI_APP_ID}" />  
        <meta-data  
            android:name="OPPOPUSH_APPKEY"  
            android:value="OP_${OPPO_APP_KEY}" />  
        <meta-data  
            android:name="OPPOPUSH_APPSECRET"  
            android:value="OP_${OPPO_APP_SECRET}" />  
        <meta-data  
            android:name="com.vivo.push.app_id"  
            android:value="${VIVO_APP_ID}" />  
        <meta-data  
            android:name="com.vivo.push.api_key"  
            android:value="${VIVO_APP_KEY}" />  

    修改build.gradle,添加对应平台申请的appkey或appid(键名必须统一,如XIAOMI_APP_ID比如同时存在于build.gradle文件和Androidmanifest.xml文件中),如下所示:

    android {  
    defaultConfig {  
        manifestPlaceholders = [  
                "plus.unipush.appid" : "pPyZWvH3Fa6PXba19ID0091",  
                "plus.unipush.appkey" : "b7dOGlNPHR7pqwUxcXPVi45",  
                "plus.unipush.appsecret": "IxVYAT9qws8dlNElacmSg12",  
                "apk.applicationId":"io.dcloud.HBuilder",  
                "XIAOMI_APP_ID":"ccccccccc"  
        ]  
    }  
    }  
  • dcloud_properties.xml配置
    在properties中添加如下配置,features节点与services节点必须同时配置!

    <properties>  
    <features>  
        <feature name="Push" value="io.dcloud.feature.aps.APSFeatureImpl">  
            <module name="unipush" value="io.dcloud.feature.unipush.GTPushService"/>  
        </feature>  
    </features>     
    <services>  
        <service name="push" value="io.dcloud.feature.aps.APSFeatureImpl"/>  
    </services>  
    </properties>  
  • 其余配置
    oppo集成UniPush时需在Androidmanifest.xml的入口activity中添加如下配置:

    <activity  
            android:name="io.dcloud.PandoraEntry">  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
            /*oppo配置开始*/  
            <intent-filter>  
                <action android:name="android.intent.action.oppopush" />  
                <category android:name="android.intent.category.DEFAULT" />  
            </intent-filter>  
            /*oppo配置结束*/  
        </activity>  

注意

  • UniPush与个推及小米推送存在冲突,使用时请确保小米推送及个推相关文件已删除。
  • 上述账号信息仅为展示使用,使用时需替换成自己申请的appkey等信息。
  • 为了最大化的减少配置,权限及其他厂商配置统统放入aar中。
  • 集成UniPush时,原Androidmanifest.xml中对应的小米和个推的配置也需删除。
收起阅读 »

HBuilder eslint 代码格式化 自动保存格式化

HBuilder
  1. 安装eslint插件
    工具 -> 插件安装 -> eslint-plugin-vue -> 安装
  2. 修改eslint配置,支持保存时eslint自动格式化
    打开package.json插件配置文件: 工具 -> 插件配置 -> eslint-vue -> package.json
    {  
    // 忽略其它属性  
    "external": {  
    "commands": [{  
        // 默认使用编辑器级eslint插件  
        "id": "default-eslint-vue",  
        "command": [  
          "${programPath}",  
          "--no-eslintrc",  
          "-c",  
          "${pluginPath}/.eslintrc.js",  
          // 添加根据校验规则修复文件选项  
          "${file}",  
          "--fix"  
        ],  
        // 保存时执行该命令  
        "onDidSaveExecution": true  
      }  
    ]  
    }  
    }
  3. 修改完成后 重启生效
  4. 通过.eslintrc.js进行格式规则的控制
继续阅读 »
  1. 安装eslint插件
    工具 -> 插件安装 -> eslint-plugin-vue -> 安装
  2. 修改eslint配置,支持保存时eslint自动格式化
    打开package.json插件配置文件: 工具 -> 插件配置 -> eslint-vue -> package.json
    {  
    // 忽略其它属性  
    "external": {  
    "commands": [{  
        // 默认使用编辑器级eslint插件  
        "id": "default-eslint-vue",  
        "command": [  
          "${programPath}",  
          "--no-eslintrc",  
          "-c",  
          "${pluginPath}/.eslintrc.js",  
          // 添加根据校验规则修复文件选项  
          "${file}",  
          "--fix"  
        ],  
        // 保存时执行该命令  
        "onDidSaveExecution": true  
      }  
    ]  
    }  
    }
  3. 修改完成后 重启生效
  4. 通过.eslintrc.js进行格式规则的控制
收起阅读 »

HBuilder X 任务栏正常显示,窗口无法显示的解决方案

HBuilderX

某些极端情况下,启动HBuilderX后,发现HBuilder X 任务栏正常显示,窗口无法显示

解决方案:

  1. 问题根源:配置文件的问题
  2. 进入C:\Users\Administrator\AppData\Roaming\HBuilder X目录,Administrator换成你自己的电脑用户
  3. 打开编辑HBuilder X.ini文件
  4. 找到window\xwindow\y,设置值为整数,比如400
继续阅读 »

某些极端情况下,启动HBuilderX后,发现HBuilder X 任务栏正常显示,窗口无法显示

解决方案:

  1. 问题根源:配置文件的问题
  2. 进入C:\Users\Administrator\AppData\Roaming\HBuilder X目录,Administrator换成你自己的电脑用户
  3. 打开编辑HBuilder X.ini文件
  4. 找到window\xwindow\y,设置值为整数,比如400
收起阅读 »