
上海90后用优惠券薅羊毛45万被捕,薅羊毛也犯法吗?
电商平台为了抢占市场,纷纷让利促销,这也滋生了很多“羊毛党”,我们普通人平时只是薅薅羊毛,省点钱,但没有想过,这也能是一个“生财之道”。

利用平台漏洞薅羊毛,非法获利 45 万
近日,上海浦东张江警方接到辖区一电商平台报警,自3月中旬起,有大量低价商品被人以低于市场价的价格转卖至批发市场。调查后发现,有人利用该平台开展的优惠活动,非法牟利,警方很快锁定了两位嫌疑人,原来这两个人都是该电商平台的前员工,对平台的优惠规则非常熟悉,于是就利用平台漏洞,注册了大量账号,骗取新用户福利,再将低价购买来的商品转手到二手市场,赚取差价,每单至少可以获利30元。
不过“君子爱财取之有道”,这种不法的牟利手段,让平台损失至少45万元,这两位年轻的90后,也受到了应有的惩罚,目前二位已被警方逮捕。
我们都觉得这二位的行为不够地道,但薅羊毛这件事,已经深入我们的生活中,相信大家都加入过不同的“薅羊毛福利群”吧,在社交平台上,教网友们薅羊毛的帖子,热度永远居高不下,所以,肯定有不少读者心中产生了疑问:“现在连薅羊毛都犯法吗?”
对于这件事,网友们也有不同意见,即这难道不是平台的漏洞?
合理地薅羊毛当然不犯法,这是商家给予大家的福利,一些“薅羊毛福利群”只是将一些平台的福利政策公告,我们需要注意的是,在这个案件中,有一个关键因素,就是,是不是用了欺骗的手法。这两个人大量注册了新账户,而且是虚拟的账户,这可能就是涉嫌用虚构事实或隐瞒办法骗取公私财物的行为,所以才被捕((,此种行为的非法性和欺骗性非常明显,并非“羊毛党”那么简单。根据刑法规定及法理,诈骗罪主要指行为人虚构事实或隐瞒真相诱骗被害人,使被害人基于错误认识处分自己的财产,行为人获取不法利益。
经检索, “薅羊毛”涉嫌犯罪并非第一起,法律专家此前解读认为,优惠券BUG案件法律实践中,通常涉及不当得利、破坏计算机信息系统罪、盗窃罪、侵害知识产权罪等,应具体情况具体分析。
专家们指出,通常来看,少量“薅羊毛”行为一般不构成犯罪,所得属于不当得利,应及时予以返还。若是在事实公布后还继续“薅”的,就可能会有盗窃罪等罪名之嫌,且“薅羊毛”并非法不责众。
特别提醒,“薅羊毛”亦需要遵守规则,逾越规则获取非法利益,必然会承担法律责任。还是要谨记,万事不可贪心。
【转自:见度知法】,声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。 邮箱地址:pufa@dcloud.io 。
电商平台为了抢占市场,纷纷让利促销,这也滋生了很多“羊毛党”,我们普通人平时只是薅薅羊毛,省点钱,但没有想过,这也能是一个“生财之道”。
利用平台漏洞薅羊毛,非法获利 45 万
近日,上海浦东张江警方接到辖区一电商平台报警,自3月中旬起,有大量低价商品被人以低于市场价的价格转卖至批发市场。调查后发现,有人利用该平台开展的优惠活动,非法牟利,警方很快锁定了两位嫌疑人,原来这两个人都是该电商平台的前员工,对平台的优惠规则非常熟悉,于是就利用平台漏洞,注册了大量账号,骗取新用户福利,再将低价购买来的商品转手到二手市场,赚取差价,每单至少可以获利30元。
不过“君子爱财取之有道”,这种不法的牟利手段,让平台损失至少45万元,这两位年轻的90后,也受到了应有的惩罚,目前二位已被警方逮捕。
我们都觉得这二位的行为不够地道,但薅羊毛这件事,已经深入我们的生活中,相信大家都加入过不同的“薅羊毛福利群”吧,在社交平台上,教网友们薅羊毛的帖子,热度永远居高不下,所以,肯定有不少读者心中产生了疑问:“现在连薅羊毛都犯法吗?”
对于这件事,网友们也有不同意见,即这难道不是平台的漏洞?
合理地薅羊毛当然不犯法,这是商家给予大家的福利,一些“薅羊毛福利群”只是将一些平台的福利政策公告,我们需要注意的是,在这个案件中,有一个关键因素,就是,是不是用了欺骗的手法。这两个人大量注册了新账户,而且是虚拟的账户,这可能就是涉嫌用虚构事实或隐瞒办法骗取公私财物的行为,所以才被捕((,此种行为的非法性和欺骗性非常明显,并非“羊毛党”那么简单。根据刑法规定及法理,诈骗罪主要指行为人虚构事实或隐瞒真相诱骗被害人,使被害人基于错误认识处分自己的财产,行为人获取不法利益。
经检索, “薅羊毛”涉嫌犯罪并非第一起,法律专家此前解读认为,优惠券BUG案件法律实践中,通常涉及不当得利、破坏计算机信息系统罪、盗窃罪、侵害知识产权罪等,应具体情况具体分析。
专家们指出,通常来看,少量“薅羊毛”行为一般不构成犯罪,所得属于不当得利,应及时予以返还。若是在事实公布后还继续“薅”的,就可能会有盗窃罪等罪名之嫌,且“薅羊毛”并非法不责众。
特别提醒,“薅羊毛”亦需要遵守规则,逾越规则获取非法利益,必然会承担法律责任。还是要谨记,万事不可贪心。
【转自:见度知法】,声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。 邮箱地址:pufa@dcloud.io 。
原文链接
https://tech.ifeng.com/c/87q3yCkk2PP

多语言跑腿外卖APP软件开发
某音近日成立了一个针对外卖业务的团队,并于近期在其APP内开展测试。并起名“心动外卖”,其slogan为“心动外卖,吃你所爱”。
大家都知道,市场上目前是蓝箱子和王两家独大,在这块市场,心动外卖能否顺利分一杯羹?他有什么能力可以在这块市场占领自己的地盘?
某音为什么敢加入外卖市场?原因是某音今年年初正式开通某音支付,并且随着滴滴下架为市场敲响的警钟,某音这次大概率是要做一个聚合式外卖平台。
整合平台有什么优势及好处?
流量!在当下时代,消费者们已经不满足于图片以及评论带给自己的消费刺激,消费者需要更加直观的体验,那么应该怎样做?
商家会怎样?商家开店之后肯定不会只是入驻一些外卖平台,他们也需要推广,那么普通商家能做到的推广是什么?没错,短视频。打开手机,想要做的事情就是刷短视频,无论男女老少,无人不知,造就某音目前拥有峰值7亿,平均峰值6亿的日活跃度,是仅次于wx日活跃度第二大流量头部玩家。也是直播带货的主战场,直播总时长高直逼近3000万小时,可以说其他头部玩家都无法超越的数据,同时,这个数据意味着在这个流量成本越来越高的时代,某音直播免费流量成为香饽饽,也是作为心动外卖一个强的流量依靠。
打造这样一个平台有什么好处?
现在很多上班族几乎离不开外卖了,但外卖费用越来越贵,以几块钱吃的很好,现在三十块钱吃不饱,而心动外卖的加入初期势必会让价格有所下降,并且这样一个外卖整合平台无疑是给了小外卖公司发展的机会,让更多小的外卖公司迅速崛起,让消费者也有更多的选择,可能会出现以城市为单位的小外卖公司独占城市外卖份额。
某音近日成立了一个针对外卖业务的团队,并于近期在其APP内开展测试。并起名“心动外卖”,其slogan为“心动外卖,吃你所爱”。
大家都知道,市场上目前是蓝箱子和王两家独大,在这块市场,心动外卖能否顺利分一杯羹?他有什么能力可以在这块市场占领自己的地盘?
某音为什么敢加入外卖市场?原因是某音今年年初正式开通某音支付,并且随着滴滴下架为市场敲响的警钟,某音这次大概率是要做一个聚合式外卖平台。
整合平台有什么优势及好处?
流量!在当下时代,消费者们已经不满足于图片以及评论带给自己的消费刺激,消费者需要更加直观的体验,那么应该怎样做?
商家会怎样?商家开店之后肯定不会只是入驻一些外卖平台,他们也需要推广,那么普通商家能做到的推广是什么?没错,短视频。打开手机,想要做的事情就是刷短视频,无论男女老少,无人不知,造就某音目前拥有峰值7亿,平均峰值6亿的日活跃度,是仅次于wx日活跃度第二大流量头部玩家。也是直播带货的主战场,直播总时长高直逼近3000万小时,可以说其他头部玩家都无法超越的数据,同时,这个数据意味着在这个流量成本越来越高的时代,某音直播免费流量成为香饽饽,也是作为心动外卖一个强的流量依靠。
打造这样一个平台有什么好处?
现在很多上班族几乎离不开外卖了,但外卖费用越来越贵,以几块钱吃的很好,现在三十块钱吃不饱,而心动外卖的加入初期势必会让价格有所下降,并且这样一个外卖整合平台无疑是给了小外卖公司发展的机会,让更多小的外卖公司迅速崛起,让消费者也有更多的选择,可能会出现以城市为单位的小外卖公司独占城市外卖份额。

2021 Datathon数智马拉松大赛开启报名!数十万奖金等你拿!
2021 Datathon数智马拉松大赛,来了!
带着数十万现金奖励,面向全球发出“最IN挑战”,寻找“最强数智大脑”
2021 Datathon数智马拉松大赛正式开赛,
报名通道全面开启!
点击登录大赛官网注册报名 >> https://www.getui.com/event/2021-datathon
为加快大数据科技创新,推动数字经济发展和人才培育,杭州市委人才办、杭州市经济和信息化局、杭州市科学技术局、杭州市淳安县人民政府、每日互动股份有限公司(个推)以“数造潜能·智创未来”为主题,联合举办2021 Datathon数智马拉松大赛。
本次大赛放眼全球,面向海内外顶尖院校学生和广大程序员开放报名通道,提供-¬数十万元人民币的现金奖励,旨在鼓励大数据和人工智能领域的应用创新,为高素质科技人才施展才华、成就自我提供广阔舞台。
在赛题设置方面,2021 Datathon数智马拉松大赛聚焦科技前沿,打破了大数据、AI与交通、医学、艺术等的“次元壁”。大赛将依托公共数据平台及开放数据,围绕智慧交通、智慧医学、智能音乐、步态识别等方向,开展数据应用创新,探索AI核心技术突破。
作为一场融合了数据、代码、算法和创意等多重元素的大型科技赛事,2021 Datathon数智马拉松大赛不仅赛题新颖、奖金丰富,更配置了超豪华的专家评审团。大赛邀请到了浙江大学计算机学院、软件学院前副院长陈越和曾担任ACM区域赛以及Topcoder公开赛裁判长及主评审的业内资深算法专家吴嘉之,以及来自微博、网易、快手、科大讯飞、每日互动、树兰医疗等行业知名企业和各大顶级技术社区的专家,组成超级评审团,共同寻找“最强数智大脑”!
从7月份到10月份,2021 Datathon数智马拉松大赛将经历报名、海选、初赛和决赛共四个阶段。
• 即日起至7月31日为线上报名阶段,参赛选手登录比赛官网,完成个人信息注册,即可报名组队参赛。
• 8月1日至8月14日为线上海选阶段,参赛队伍在规定时间内完成线上答题即可。
• 8月22日至8月29日为初赛阶段,期间大赛特别设置了“数智夏令营”环节,邀请来自顶级高校、知名企业的专家和数据智能领域的资深人士开展系统的大数据和人工智能专业授课。
• 最终的巅峰对决及颁奖典礼将于10月24日“程序员节”当天举行。
值得一提的是,颁奖典礼现场将融合AI音乐节等创意项目,开启代码和音符的奇妙碰撞,演绎智能与科技的独特魅力,为最终获胜的“数智大脑”们奉上一场奇妙的音乐盛宴。
数十万现金奖励
名企Offer直通卡
专家大咖1v1帮带
丰富创业资金及资源扶持
“数智夏令营”“AI音乐节”
……
2021 Datathon数智马拉松大赛已经全面启动。还等什么?!现在就报名,迎接这场代码和创意的PK,赢取“数智夏令营”入营资格和数十万奖金吧!
立即登录大赛官网注册报名 >> https://www.getui.com/event/2021-datathon
2021 Datathon数智马拉松大赛,来了!
带着数十万现金奖励,面向全球发出“最IN挑战”,寻找“最强数智大脑”
2021 Datathon数智马拉松大赛正式开赛,
报名通道全面开启!
点击登录大赛官网注册报名 >> https://www.getui.com/event/2021-datathon
为加快大数据科技创新,推动数字经济发展和人才培育,杭州市委人才办、杭州市经济和信息化局、杭州市科学技术局、杭州市淳安县人民政府、每日互动股份有限公司(个推)以“数造潜能·智创未来”为主题,联合举办2021 Datathon数智马拉松大赛。
本次大赛放眼全球,面向海内外顶尖院校学生和广大程序员开放报名通道,提供-¬数十万元人民币的现金奖励,旨在鼓励大数据和人工智能领域的应用创新,为高素质科技人才施展才华、成就自我提供广阔舞台。
在赛题设置方面,2021 Datathon数智马拉松大赛聚焦科技前沿,打破了大数据、AI与交通、医学、艺术等的“次元壁”。大赛将依托公共数据平台及开放数据,围绕智慧交通、智慧医学、智能音乐、步态识别等方向,开展数据应用创新,探索AI核心技术突破。
作为一场融合了数据、代码、算法和创意等多重元素的大型科技赛事,2021 Datathon数智马拉松大赛不仅赛题新颖、奖金丰富,更配置了超豪华的专家评审团。大赛邀请到了浙江大学计算机学院、软件学院前副院长陈越和曾担任ACM区域赛以及Topcoder公开赛裁判长及主评审的业内资深算法专家吴嘉之,以及来自微博、网易、快手、科大讯飞、每日互动、树兰医疗等行业知名企业和各大顶级技术社区的专家,组成超级评审团,共同寻找“最强数智大脑”!
从7月份到10月份,2021 Datathon数智马拉松大赛将经历报名、海选、初赛和决赛共四个阶段。
• 即日起至7月31日为线上报名阶段,参赛选手登录比赛官网,完成个人信息注册,即可报名组队参赛。
• 8月1日至8月14日为线上海选阶段,参赛队伍在规定时间内完成线上答题即可。
• 8月22日至8月29日为初赛阶段,期间大赛特别设置了“数智夏令营”环节,邀请来自顶级高校、知名企业的专家和数据智能领域的资深人士开展系统的大数据和人工智能专业授课。
• 最终的巅峰对决及颁奖典礼将于10月24日“程序员节”当天举行。
值得一提的是,颁奖典礼现场将融合AI音乐节等创意项目,开启代码和音符的奇妙碰撞,演绎智能与科技的独特魅力,为最终获胜的“数智大脑”们奉上一场奇妙的音乐盛宴。
数十万现金奖励
名企Offer直通卡
专家大咖1v1帮带
丰富创业资金及资源扶持
“数智夏令营”“AI音乐节”
……
2021 Datathon数智马拉松大赛已经全面启动。还等什么?!现在就报名,迎接这场代码和创意的PK,赢取“数智夏令营”入营资格和数十万奖金吧!
立即登录大赛官网注册报名 >> https://www.getui.com/event/2021-datathon
收起阅读 »
打包手机端 ali-oss 超过500kb 样式错乱
挺常见问题,es6语法没有转换成es5 样式错乱
aliyun-oss-sdk dist完成520kb。。。
解决方案 ali-oss换成4.11
挺常见问题,es6语法没有转换成es5 样式错乱
aliyun-oss-sdk dist完成520kb。。。
解决方案 ali-oss换成4.11

mui升级到uniapp框架旧版本缓存处理兼容新版本
遇到的问题
旧版(mui开发) ID:H53FGS6A
新版(uniapp开发) ID:UNI7B7890D
注意:(我们的程序ID是有变化的,如无变化应该不用这么麻烦操作)
旧版的用户登录信息数据升级到新版时会没有,也就是说升级后新版拿不到旧版的登录信息 这样就需要用户重新登录一次,影响用户体验和使用,所以需要做一个兼容的处理
思路
旧版使用plus.storage.setItem()方法保存的数据,用户更新到新版时,拿到旧版数据然后缓存到新版本对应的位置中
要实现这个过渡,最最主要的是知道旧版的数据保存在哪里 新版的数据保存在哪里
经过一番查找最终实现了新旧版本的无缝切换
操作
Android端
在Android端旧版的plus.storage.setItem()保存的数据是在SP文件中,这个文件在应用包名目录下 比如我们的叫做H53FGS6A_storages.xml;
在Android端新版的plus.storage.setItem()保存的数据是在sqlite数据库中的
但是转移数据时我们不需要操作数据库 更新到最新版的uniapp时 程序会自动把缓存在SP文件中的数据转移到数据库中
所以在Android中做的操作就是把旧的sp数据保存到新的sp文件中,然后程序会自动把新的SP文件数据转移到sqlite数据库中,这样当新版APP打开时就读取到旧版缓存的数据了
Android中新的SP文件叫UNI7B7890_storages.xml
然后再新版APP打开时使用SP工具类转移数据即可 如下图
Android 工具类代码:
/**
* SP 更新工具类 之前就旧版(3.4.0之前)缓存保存在 HG88226A_storages.xml文件中
* 现在新版(3.5.0之后)改用uniapp
*/
public class SPUpdateUtil {
private static final String TAG = "SPUpdateUtil";
private static final String OLD_SP_FILE_NAME = "HG88226A_storages";
private static final String NEW_SP_FILE_NAME = "__UNI__78988302D_storages";
/**
* 更新SP信息
* @param context
* 1.拿到旧的sp信息
* 2.遍历旧的信息
* 3.缓存到新的sp文件中
*/
public static void updateSPInfo(Context context){
try {
SharedPreferences oldSP = context.getSharedPreferences(OLD_SP_FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences newSP = context.getSharedPreferences(NEW_SP_FILE_NAME,Context.MODE_PRIVATE);
SharedPreferences.Editor oldEditor = oldSP.edit();
SharedPreferences.Editor newEditor = newSP.edit();
HashMap<String,Object> oldMap = (HashMap<String, Object>) oldSP.getAll();
if (!oldMap.isEmpty()){
for (String key : oldMap.keySet()) {
Log.d(TAG,key+": "+oldMap.get(key));
Object object = oldMap.get(key);
if (object instanceof String) {
newEditor.putString(key, (String) object);
} else if (object instanceof Integer) {
newEditor.putInt(key, (Integer) object);
} else if (object instanceof Boolean) {
newEditor.putBoolean(key, (Boolean) object);
} else if (object instanceof Float) {
newEditor.putFloat(key, (Float) object);
} else if (object instanceof Long) {
newEditor.putLong(key, (Long) object);
} else {
newEditor.putString(key, object.toString());
}
}
//提交数据
newEditor.commit();
//删除旧数据
oldEditor.clear();
oldEditor.commit();
}
//检查数据
/* HashMap<String,Object> newMap = (HashMap<String, Object>) newSP.getAll();
for (String key : newMap.keySet()) {
Log.d("__UNI__78988302D",key+": "+newMap.get(key));
}*/
} catch (Exception e) {
e.printStackTrace();
}
}
}
IOS端
IOS端和Android端的思路一样,其中最主要的是找到旧版和新版数据保存的对应位置
在IOS端旧版的plus.storage.setItem()保存的数据是在一个叫做wxstorage.plist文件当中
在IOS端新版的plus.storage.setItem()保存的数据是也是保存在一个叫做wxstorage.plist的文件当中
只是他们所在的文件路径不一样
文件内容如下:
旧版路径:
注意:是在应用沙盒的Documents目录下
新版路径:
注意:是在应用沙盒的Library目录下
然后我们利用工具类把就数据放到新版plist文件中即可 如下图:
IOS 工具类代码
.m文件
/*
*版本更新工具类
* 之前的mui项目 跟新成uniapp项目 缓存数据位置发生了变化 需要这个工具类吧旧版缓存数据转移过来
* 这样旧版更新新版后 不会出现需要用户重新登录等情况
*/
#import "UpdateUtil.h"
@implementation UpdateUtil
/**
转移数据的方法
*/
+(void)updateStorageInfo{
@try {
NSString *oldPlistPath = @"Pandora/apps/H576788FC6A/data/wxstorage/wxstorage.plist";
NSString *newPlistDic = @"Pandora/apps/__UNI__78988302D/data/wxstorage/";
NSString *newPlistPath = @"Pandora/apps/__UNI__78988302D/data/wxstorage/wxstorage.plist";
NSArray *pathDocumentArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *pathDocument = [pathDocumentArray objectAtIndex:0];
// /var/mobile/Containers/Data/Application/5817C54A-8C39-4768-A598-EA1357BD785C/Documents
NSLog(@"数据保存路径:%@",pathDocument);
NSArray *pathLibraryArray = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *pathLibrary = [pathLibraryArray objectAtIndex:0];
// /var/mobile/Containers/Data/Application/8789507C-761F-4705-9057-4BBF3E695D3E/Library
NSLog(@"数据保存路径:%@",pathLibrary);
//旧版数据位置
NSString *storageOldFilePath = [pathDocument stringByAppendingPathComponent:oldPlistPath];
//读取旧版中的数据 因为已经知道数据保存的是dict 所有使用 NSMutableDictionary来读取
NSMutableDictionary *oldDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageOldFilePath];
NSLog(@"旧版数据长度%lu",oldDict.count);
if(!oldDict || [oldDict count] == 0){
//不需要转移旧数据 这种情况是新版直接安装的情况
return;
}
//新版数据位置
NSString *storageNewFilePath = [pathLibrary stringByAppendingPathComponent:newPlistPath];
//判断文件是否存在
BOOL exist = [[NSFileManager defaultManager] fileExistsAtPath:storageNewFilePath];
if (!exist) {
//文件不存在
//先创建目录
NSString *storageNewDirectPath = [pathLibrary stringByAppendingPathComponent:newPlistDic];
BOOL dres = [[NSFileManager defaultManager] createDirectoryAtPath:storageNewDirectPath withIntermediateDirectories:YES attributes:nil error:nil];
//在创建文件
BOOL res = [[NSFileManager defaultManager] createFileAtPath:storageNewFilePath contents:nil attributes:nil];
NSLog(@"文件创建结果%@,....%@",dres?@"YES":@"NO",res?@"YES":@"NO");
}
//读取新版中的数据 如果是首次安装使用 新版中应该还没有数据
NSMutableDictionary *newDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageNewFilePath];
//如果没有 创建一个新字典
if (!newDict) {
newDict = [NSMutableDictionary dictionary];
}
//转移数据 把旧数据放到新的字典中去
for (NSString *key in oldDict) {
NSString *value = [oldDict valueForKey:key];
[newDict setValue:value forKey:key];
}
NSLog(@"新版数据长度%lu",newDict.count);
if([newDict count] > 0){
//把新数据设置到文件中
BOOL result = [newDict writeToFile:storageNewFilePath atomically:YES];
if (result) {
NSLog(@"新版数据写入成功");
}
}
//把数据拿出来看下有变化没
// NSMutableDictionary *newAndOldDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageNewFilePath];
// NSLog(@"新版数据确认长度%lu",newAndOldDict.count);
//清空旧文件中的数据
//[oldDict removeAllObjects];
NSDictionary *clearDic = [NSDictionary dictionary];
BOOL oldResult = [clearDic writeToFile:storageOldFilePath atomically:YES];
if (oldResult) {
NSLog(@"旧版清空成功");
}
//NSMutableDictionary *oldoldDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageOldFilePath];
// NSLog(@"旧版数据确认长度%lu",oldoldDict.count);
} @catch (NSException *exception) {
NSLog(@"程序出错%@",exception);
}
}
@end
.h文件
@interface UpdateUtil : NSObject
+(void)updateStorageInfo;
@end
遇到的问题
旧版(mui开发) ID:H53FGS6A
新版(uniapp开发) ID:UNI7B7890D
注意:(我们的程序ID是有变化的,如无变化应该不用这么麻烦操作)
旧版的用户登录信息数据升级到新版时会没有,也就是说升级后新版拿不到旧版的登录信息 这样就需要用户重新登录一次,影响用户体验和使用,所以需要做一个兼容的处理
思路
旧版使用plus.storage.setItem()方法保存的数据,用户更新到新版时,拿到旧版数据然后缓存到新版本对应的位置中
要实现这个过渡,最最主要的是知道旧版的数据保存在哪里 新版的数据保存在哪里
经过一番查找最终实现了新旧版本的无缝切换
操作
Android端
在Android端旧版的plus.storage.setItem()保存的数据是在SP文件中,这个文件在应用包名目录下 比如我们的叫做H53FGS6A_storages.xml;
在Android端新版的plus.storage.setItem()保存的数据是在sqlite数据库中的
但是转移数据时我们不需要操作数据库 更新到最新版的uniapp时 程序会自动把缓存在SP文件中的数据转移到数据库中
所以在Android中做的操作就是把旧的sp数据保存到新的sp文件中,然后程序会自动把新的SP文件数据转移到sqlite数据库中,这样当新版APP打开时就读取到旧版缓存的数据了
Android中新的SP文件叫UNI7B7890_storages.xml
然后再新版APP打开时使用SP工具类转移数据即可 如下图
Android 工具类代码:
/**
* SP 更新工具类 之前就旧版(3.4.0之前)缓存保存在 HG88226A_storages.xml文件中
* 现在新版(3.5.0之后)改用uniapp
*/
public class SPUpdateUtil {
private static final String TAG = "SPUpdateUtil";
private static final String OLD_SP_FILE_NAME = "HG88226A_storages";
private static final String NEW_SP_FILE_NAME = "__UNI__78988302D_storages";
/**
* 更新SP信息
* @param context
* 1.拿到旧的sp信息
* 2.遍历旧的信息
* 3.缓存到新的sp文件中
*/
public static void updateSPInfo(Context context){
try {
SharedPreferences oldSP = context.getSharedPreferences(OLD_SP_FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences newSP = context.getSharedPreferences(NEW_SP_FILE_NAME,Context.MODE_PRIVATE);
SharedPreferences.Editor oldEditor = oldSP.edit();
SharedPreferences.Editor newEditor = newSP.edit();
HashMap<String,Object> oldMap = (HashMap<String, Object>) oldSP.getAll();
if (!oldMap.isEmpty()){
for (String key : oldMap.keySet()) {
Log.d(TAG,key+": "+oldMap.get(key));
Object object = oldMap.get(key);
if (object instanceof String) {
newEditor.putString(key, (String) object);
} else if (object instanceof Integer) {
newEditor.putInt(key, (Integer) object);
} else if (object instanceof Boolean) {
newEditor.putBoolean(key, (Boolean) object);
} else if (object instanceof Float) {
newEditor.putFloat(key, (Float) object);
} else if (object instanceof Long) {
newEditor.putLong(key, (Long) object);
} else {
newEditor.putString(key, object.toString());
}
}
//提交数据
newEditor.commit();
//删除旧数据
oldEditor.clear();
oldEditor.commit();
}
//检查数据
/* HashMap<String,Object> newMap = (HashMap<String, Object>) newSP.getAll();
for (String key : newMap.keySet()) {
Log.d("__UNI__78988302D",key+": "+newMap.get(key));
}*/
} catch (Exception e) {
e.printStackTrace();
}
}
}
IOS端
IOS端和Android端的思路一样,其中最主要的是找到旧版和新版数据保存的对应位置
在IOS端旧版的plus.storage.setItem()保存的数据是在一个叫做wxstorage.plist文件当中
在IOS端新版的plus.storage.setItem()保存的数据是也是保存在一个叫做wxstorage.plist的文件当中
只是他们所在的文件路径不一样
文件内容如下:
旧版路径:
注意:是在应用沙盒的Documents目录下
新版路径:
注意:是在应用沙盒的Library目录下
然后我们利用工具类把就数据放到新版plist文件中即可 如下图:
IOS 工具类代码
.m文件
/*
*版本更新工具类
* 之前的mui项目 跟新成uniapp项目 缓存数据位置发生了变化 需要这个工具类吧旧版缓存数据转移过来
* 这样旧版更新新版后 不会出现需要用户重新登录等情况
*/
#import "UpdateUtil.h"
@implementation UpdateUtil
/**
转移数据的方法
*/
+(void)updateStorageInfo{
@try {
NSString *oldPlistPath = @"Pandora/apps/H576788FC6A/data/wxstorage/wxstorage.plist";
NSString *newPlistDic = @"Pandora/apps/__UNI__78988302D/data/wxstorage/";
NSString *newPlistPath = @"Pandora/apps/__UNI__78988302D/data/wxstorage/wxstorage.plist";
NSArray *pathDocumentArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *pathDocument = [pathDocumentArray objectAtIndex:0];
// /var/mobile/Containers/Data/Application/5817C54A-8C39-4768-A598-EA1357BD785C/Documents
NSLog(@"数据保存路径:%@",pathDocument);
NSArray *pathLibraryArray = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *pathLibrary = [pathLibraryArray objectAtIndex:0];
// /var/mobile/Containers/Data/Application/8789507C-761F-4705-9057-4BBF3E695D3E/Library
NSLog(@"数据保存路径:%@",pathLibrary);
//旧版数据位置
NSString *storageOldFilePath = [pathDocument stringByAppendingPathComponent:oldPlistPath];
//读取旧版中的数据 因为已经知道数据保存的是dict 所有使用 NSMutableDictionary来读取
NSMutableDictionary *oldDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageOldFilePath];
NSLog(@"旧版数据长度%lu",oldDict.count);
if(!oldDict || [oldDict count] == 0){
//不需要转移旧数据 这种情况是新版直接安装的情况
return;
}
//新版数据位置
NSString *storageNewFilePath = [pathLibrary stringByAppendingPathComponent:newPlistPath];
//判断文件是否存在
BOOL exist = [[NSFileManager defaultManager] fileExistsAtPath:storageNewFilePath];
if (!exist) {
//文件不存在
//先创建目录
NSString *storageNewDirectPath = [pathLibrary stringByAppendingPathComponent:newPlistDic];
BOOL dres = [[NSFileManager defaultManager] createDirectoryAtPath:storageNewDirectPath withIntermediateDirectories:YES attributes:nil error:nil];
//在创建文件
BOOL res = [[NSFileManager defaultManager] createFileAtPath:storageNewFilePath contents:nil attributes:nil];
NSLog(@"文件创建结果%@,....%@",dres?@"YES":@"NO",res?@"YES":@"NO");
}
//读取新版中的数据 如果是首次安装使用 新版中应该还没有数据
NSMutableDictionary *newDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageNewFilePath];
//如果没有 创建一个新字典
if (!newDict) {
newDict = [NSMutableDictionary dictionary];
}
//转移数据 把旧数据放到新的字典中去
for (NSString *key in oldDict) {
NSString *value = [oldDict valueForKey:key];
[newDict setValue:value forKey:key];
}
NSLog(@"新版数据长度%lu",newDict.count);
if([newDict count] > 0){
//把新数据设置到文件中
BOOL result = [newDict writeToFile:storageNewFilePath atomically:YES];
if (result) {
NSLog(@"新版数据写入成功");
}
}
//把数据拿出来看下有变化没
// NSMutableDictionary *newAndOldDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageNewFilePath];
// NSLog(@"新版数据确认长度%lu",newAndOldDict.count);
//清空旧文件中的数据
//[oldDict removeAllObjects];
NSDictionary *clearDic = [NSDictionary dictionary];
BOOL oldResult = [clearDic writeToFile:storageOldFilePath atomically:YES];
if (oldResult) {
NSLog(@"旧版清空成功");
}
//NSMutableDictionary *oldoldDict = [NSMutableDictionary dictionaryWithContentsOfFile:storageOldFilePath];
// NSLog(@"旧版数据确认长度%lu",oldoldDict.count);
} @catch (NSException *exception) {
NSLog(@"程序出错%@",exception);
}
}
@end
.h文件
@interface UpdateUtil : NSObject
+(void)updateStorageInfo;
@end
收起阅读 »

UNI-APP打包及原生交互教程
非广告引流!
UNI-APP打包及原生交互教程
社区的编辑器太难用了,移步链接可以看一下个人见解。
非广告引流!
UNI-APP打包及原生交互教程
社区的编辑器太难用了,移步链接可以看一下个人见解。

解决Mac找不到mumu模拟器的问题
adb kill-server
adb start-server
adb devices
adb kill-server
adb start-server
adb devices

现在做外卖CPS晚吗?应该怎样做效果好一点?
外卖CPS是什么?
外卖CPS简单地说就是外卖平台分销,让用户通过你的链接去领取外卖红包,然后去下单点外卖,但有两个好处,一是用户能够省钱,二是你能够获得佣金,资源主要是饿了么和美团。
相信到现在,经常点外卖的人都会知道有外卖优惠券可以领取,为什么今年几个月时间几乎所有人都了解这个了呢?
那是因为做外卖CPS赚的佣金实际上是外卖公司的广告预算,假设往年广告预算是几个亿,那么今年是三十个亿以上,并且因为比传统广告效果更好,所以外卖公司会持续加大力度推。继而让更多的人了解到这个,一部分人就会去做这个,去用这个。
玩法刚才也讲到了,和淘宝客一样是别人用你的链接买东西你就有产品佣金,不同的是购物必须要买的,但饭是每顿都要吃的,所以这个是一个刚需市场。
那么收益到底好不好呢?
假设用户领取了你25减5的券,但实际付费也在23元左右,外卖平台给你的佣金是6%,那么此单你获得的佣金就是23×6%=1.38元,这么看起来并不是特别多,有的实际支付金额可能更少,那么会赚钱吗?答案是肯定的,有的人可能看不上这一块八毛的,但实际上那些靠这个买房买车的就是这一块八毛的钱累计起来的。
那么在这个行业人数众多的情况下怎样才能让自己的平台脱颖而出呢?
那就是生活IP全面延伸覆盖,增加用户粘性。
在现在,流量就是一切,流量就是现金,只要有了流量有了用户,几乎就是躺着就行。所以前期可以稍微投入一点,将生活方面的优惠都加到自己的平台,个人建议用公众号为载体,这样可以节约成本,并且方便全方面覆盖生活优惠领域。
那么可实施的有哪些呢?
加油站优惠加油,前期如果有成本,那么可以自己做找人做一个h5的加油系统嵌入公众号,如果预算没有那么多,则可以找一些市面上的加油软件,在他们平台上做代理,直接添加到公众号里下载链接,客服负责接待送卡,以及后续的卖卡。
话费优惠,话费充值现在也是比较热的话题,市面上的话费充值接口慢充88折到95折不等,快充差不多97折,这个也是有两种可实施性。一种就是自己申请话费接口,还是一样对接到公众号里就行,还有一种就是做一个简单的页面,后台显示充值者要充值的手机号归属地以及哪家,你只需要记录下来找第三方渠道帮他充值,中间是否赚钱就看你双方设置的了。
淘客,淘客就是上面说的那种,只要用户量上来了,粘性高了,就可以了。
影视会员:影视会员很多人都需要,但是价格却很贵,我们找渠道之后平均每年能省50元,还是相当划算的,
音乐会员,和影视会员一样。
综上所述,只要打造这么一个平台,相对同行只做单品的来说,我们的粘性更高,客户也更愿意使用我们的平台,如果多个平台同时推送信息,客户肯定会选择集优惠为一体的我们,而把另外其他的当做骚扰给排除掉。基本上面的这些优惠我们都是可以获利的,有的虽然是一块八毛的,但是积累起来也是巨大的财富,可以说利润空间巨大!
外卖CPS是什么?
外卖CPS简单地说就是外卖平台分销,让用户通过你的链接去领取外卖红包,然后去下单点外卖,但有两个好处,一是用户能够省钱,二是你能够获得佣金,资源主要是饿了么和美团。
相信到现在,经常点外卖的人都会知道有外卖优惠券可以领取,为什么今年几个月时间几乎所有人都了解这个了呢?
那是因为做外卖CPS赚的佣金实际上是外卖公司的广告预算,假设往年广告预算是几个亿,那么今年是三十个亿以上,并且因为比传统广告效果更好,所以外卖公司会持续加大力度推。继而让更多的人了解到这个,一部分人就会去做这个,去用这个。
玩法刚才也讲到了,和淘宝客一样是别人用你的链接买东西你就有产品佣金,不同的是购物必须要买的,但饭是每顿都要吃的,所以这个是一个刚需市场。
那么收益到底好不好呢?
假设用户领取了你25减5的券,但实际付费也在23元左右,外卖平台给你的佣金是6%,那么此单你获得的佣金就是23×6%=1.38元,这么看起来并不是特别多,有的实际支付金额可能更少,那么会赚钱吗?答案是肯定的,有的人可能看不上这一块八毛的,但实际上那些靠这个买房买车的就是这一块八毛的钱累计起来的。
那么在这个行业人数众多的情况下怎样才能让自己的平台脱颖而出呢?
那就是生活IP全面延伸覆盖,增加用户粘性。
在现在,流量就是一切,流量就是现金,只要有了流量有了用户,几乎就是躺着就行。所以前期可以稍微投入一点,将生活方面的优惠都加到自己的平台,个人建议用公众号为载体,这样可以节约成本,并且方便全方面覆盖生活优惠领域。
那么可实施的有哪些呢?
加油站优惠加油,前期如果有成本,那么可以自己做找人做一个h5的加油系统嵌入公众号,如果预算没有那么多,则可以找一些市面上的加油软件,在他们平台上做代理,直接添加到公众号里下载链接,客服负责接待送卡,以及后续的卖卡。
话费优惠,话费充值现在也是比较热的话题,市面上的话费充值接口慢充88折到95折不等,快充差不多97折,这个也是有两种可实施性。一种就是自己申请话费接口,还是一样对接到公众号里就行,还有一种就是做一个简单的页面,后台显示充值者要充值的手机号归属地以及哪家,你只需要记录下来找第三方渠道帮他充值,中间是否赚钱就看你双方设置的了。
淘客,淘客就是上面说的那种,只要用户量上来了,粘性高了,就可以了。
影视会员:影视会员很多人都需要,但是价格却很贵,我们找渠道之后平均每年能省50元,还是相当划算的,
音乐会员,和影视会员一样。
综上所述,只要打造这么一个平台,相对同行只做单品的来说,我们的粘性更高,客户也更愿意使用我们的平台,如果多个平台同时推送信息,客户肯定会选择集优惠为一体的我们,而把另外其他的当做骚扰给排除掉。基本上面的这些优惠我们都是可以获利的,有的虽然是一块八毛的,但是积累起来也是巨大的财富,可以说利润空间巨大!