作者: xiao, yanzi

导出苹果安装包IPA的几种方法

说明一下,这里针对的是没有源码和非越狱设备的几种方法。下面简单介绍下几款软件的用法。

1. Apple Configurator 2
在App Store搜索“Apple Configurator 2”下载安装(*低适配macOS 10.14)
准备工作: Apple ID账号密码, Apple设备。
步骤:

1.1 连接设备到Mac, 菜单 -> 账户 -> 登录

%title插图%num

1.2 添加 -> 应用, 这里会显示你的已购记录,选中应用后添加。这个过程和网速有关,需要等待应用在手机上安装完成。

%title插图%num

如果你已经安装了应用,不要点击任何操作!

1.3 command+shift+G 进入文件夹~/Library/Group Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps/

%title插图%num

2. 爱思助手(强烈推荐,简直不要太好用了!!!)
准备工作: 无。
不写步骤了,太简单了。连接设备到电脑后下载爱思上的应用到电脑,完成后打开文件夹位置IPA 也就拿到了。

%title插图%num

%title插图%num

3.iMazing
可以把目前手机上自己安装的所有app都导出到电脑上,唯一的缺点就是导出来的格式是imazingapp格式,不是IPA。当然,这种格式也只能用iMazing安装大手机上。
准备工作: Apple设备。
步骤:连接设备后选择应用程序 -> 选中应用 -> 拷贝至MAC -> 保存

%title插图%num

%title插图%num

%title插图%num

4. iTunes
因为iTunes12.6以上版本去掉了应用程序相关功能,所以只能在12.6以下版本的iTunes上进行导出IPA了。具体方法百度一大堆,就不详细说了。如果你很幸运的升级了mac OS ,那么恭喜你中*了,因为想在10.14上装个12.6版本的iTunes我弄了半天都没装好,我太难了,所以有成功的巨佬麻烦告诉一声哈。
下面是iTunes降级安装的相关一些博客帖子,供有兴趣的朋友参考。
https://blog.csdn.net/testcs_dn/article/details/73741822
https://www.jianshu.com/p/225745cae8de
https://blog.csdn.net/SysProgram/article/details/89294694
https://www.v2ex.com/t/393905
https://www.jianshu.com/p/e3457b388829
https://juejin.im/post/5c3c62176fb9a049c965ec01

ps: 以前自己写博客图片都是放在github,今天忽然发现好像不能识别,提示转换失败。这才发现可以直接将本地图片拖拽到编辑器内上传。。。

苹果如何安装ipa(亲测有用,无需越狱)

方法一
懒省事使用爱思助手即可(需要签名)

方法二
1.下载cydiaimpactor(无需签名)
官方地址
百度云下载:https://pan.baidu.com/s/1rYIG4go-fOEHarSjziA1eg
提取码:3b48
2.连上苹果手机,启动cydiaimpactor,导入安装包
%title插图%num

如若导入失败,可以勾起SSL

%title插图%num

3.输入苹果账号密码(密码为App 专用密码)
专用密码生成地址:https://appleid.apple.com/account/manage

%title插图%num

4.等30秒后装好后去
设置-》通用-》描述文件与设备管理-》信任该应用即可打开

%title插图%num

苹果cms采集提示错误后的解决方法

1,新安装的苹果CMS在采集时会遇到采集报错的情况,如下图所示!

%title插图%num

一般报错基本是语言(vod_lang)和地域(vod_area)两个字段采集的数据超过了数据表字段的类型长度限制

2,解决方法:根据保存提示选择执行下面给出的2种对应SQL语句执行。SQL分别在下图所示地方单独执行
alter table {pre}vod modify column vod_lang varchar(255)

alter table {pre}vod modify column vod_area varchar(255)

%title插图%num

苹果cms百度主动URL推送教程

为了提高网站seo优化,网站搭建正常运转后我们需要对网站的视频,资讯,文章等内容数据能够及时的提交给百度搜索,缩短蜘蛛爬取收录时间加快收录。我们需要对苹果cms系统自带的百度主动URL推送进行设置使用。

百度URL推送链接提交工具是网站主动向百度搜索推送数据的快捷工具,本快捷提交工具可缩短爬虫发现网站链接时间,网站时效性内容建议使用链接提交工具,能够及时实时向搜索推送数据。本工具可加快爬虫抓取速度,无法解决网站内容是否收录问题。
下面我们就来说下具体的操作步骤:
1,我们首先访问百度搜索资源平台:

%title插图%num(https://ziyuan.baidu.com/dashboard/index/)点击链接提交

2,点击>>自动提交>>主动推送>>复制 (token= )红框内的内容

%title插图%num
简单说下主动推送和自动推送的区别
①主动推送:*为快速的提交方式,推荐您将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录。(主动推送:推送的是新的文章链接)

②自动推送:*为便捷的提交方式,请将自动推送的JS代码部署在站点的每一个页面源代码中,部署代码的页面在每次被浏览时,链接会被自动推送给百度。可以与主动推送配合使用。(自动推送:推送的是被点击浏览你的文章)

3,复制token后来到苹果cmsv10系统后台>>应用>>URL推送>>把复制的内容粘贴到>>推送tokne的框里保存即可。

%title插图%num
温馨提示
提示:全部数据将以历史数据新增,建议首次使用完整的提交1次。当天数据将以实时数据新增,不包括更新数据,只包含当天新增加的数据。断点会记录在缓存中,更新缓存后断点将消失。
百度搜索资源平台为站长提供链接自动提交通道,您可以利用快捷工具自动提交想被百度收录的链接,百度搜索引擎会按照标准处理,但不保证一定能够收录您提交的链接请知悉。

苹果cms用宝塔定时采集+添加百度推送教程

黑衣人查看:https://www.9499.tv/index.php/voddetail/111.html
准备工作
1,安装的宝塔面板(和苹果cms在不在一个服务器上都可以)
2,安装好的苹果CMS v10
3,采集需要先绑定好分类,生成需要下配置好url模式

用宝塔来触发定时任务,效率高,稳定性好,不受限于页面访问触发,推荐使用~~~ 当然如果没有条件可以使用页面触发

4,添加定时任务,参数可在程序包的说明文档内找到。

有些人还不会获取参数,建议使用谷歌浏览器或 360*速浏览器,在 采集当日或其他链接上 右键, 复制链接。

例如添加一个采集今日的任务,首先获取链接。
https://www.abc.com/admin.php/admin/collect/api.html?ac=cj&cjflag=0cf3a9d9fc61488a2ad80031abd63003&cjurl=http%3A%2F%2Fwww.abc.com%2Finc%2F2088m3u8.php&h=24&t=&ids=&wd=&type=1&mid=1¶m=
把?号前面的都删除掉。
得到的参数就是 ac=cj&cjflag=0cf3a9d9fc61488a2ad80031abd63003&cjurl=http%3A%2F%2Fwww.abc.com%2Finc%2F2088m3u8.php&h=24&t=&ids=&wd=&type=1&mid=1&param=
放到定时任务里就可以了。(注意 一定要点击启用) 执行周期 全选 执行时间 全选

点击测试,获取访问url,复制下来,稍后会改为弹出新窗体,那样比较好复制。

https://www.abc.com/api.php/timming/index.html?name=aa

5,进入宝塔,计划任务,添加一个任务。

选择访问URL
执行周期自己定义根据需要。
url地址填写刚才复制的地址。

点一下执行,看看日志。 看到了吧, 这样不管网站有没有人访问,都可以执行的。

第二个是我以前直接写好的,我看很多人都不会设置,就在此讲解下 无视我刚刚看的那个(第二个)

还有这个生成首页 跟设置定时采集一样,也是这样操作, 大家要学会 举一反三

在有非常笨的人直接私聊我 帮你远程操作吧, 这教程说明的很详细了,你说你在不会真的说不过去了

直接在讲解下 如何在自己电影站上面 添加百度推送代码

https://ziyuan.baidu.com/linksubmit/index

添加自己的网站 个人建议 全站https 模式 这个看个人爱好 自己看着操作就可以了

添加完毕 我们点击 链接提交

找到 自动推送

然后我们登录自己的服务器 找到自己模版目录 然后在找到 你模版的底部文件 底部文件一般都是foot.html

然后我们编辑 foot.html 文件

在回到 百度推送这里 复制代码 粘贴到你 这个文件的*底部 就OK了 不用在手动去推送了, 这样全自动推送

省时省力

有的人说为什么放到 底部文件 或者也可以放到头部文件,但是强力建议放到底部文件 因为不管你打开你网站什么位置都会显示你底部

知道为什么了吧

所以不管你们加不加推送代码 是你们自己的事 我只是友情提示叫你们加上 只有好处没坏处

苹果CMSv10系统标签,仿站必备

模板目录
系统模板系统放在/template/目录下。在后台站点设置中,可以选择当前使用的模板
│─template/1/ 模板1
│ ├─ads 广告文件目录
│ ├─js js文件
│ ├─css css文件
│ ├─images 图片文件
│ └─html 模板文件目录
│ └─art 文章模块模板目录
│ └─comment 评论模块模板目录
│ └─gbook 留言本模块模板目录
│ └─index 首页模块模板目录
│ └─label 自定义页面模块模板目录
│ └─map 地图页模块模板目录
│ └─public 公共页面模板目录
│ └─rss RSS和sitemap模板目录
│ └─topic 专题模块模板目录
│ └─user 用户中心模块模板目录
│ └─vod 视频模块模板目录
│─tempalte/2/ 模板2
│─…
│─template/n/ 模板N

1 模板文件
2 系统规定默认模板文件名, 其中 分类、内容、播放等页面的模板是可以自定义的。
3
4 code
5 全站公共样式文件,建议定义如何名称存放在模板的public目录下:
6 public/include.html 全站公共引入文件 引入js、css样式,还有系统JS变量
7 public/head.html 全站头部
8 public/foot.html 全站尾部
9 public/jump.html 跳转提示页模板
10 public/msg.html 错误提示页模板
11 public/paging.html 分页样式模板
12 public/digg.html 顶踩样式模板
13 public/score.html 普通评分样式模板
14 public/star.html 星星评分样式模板
15
16 comment/index.html 评论页
17 comment/ajax.html 评论页
18 gbook/index.html 留言本
19 gbook/report.html 报错页面
20
21 index/index.html 首页
22
23 map/rss.html rss
24 map/baidu.html 百度sitemap
25 map/google.html 谷歌sitemap
26
27 topic/index.html 专题首页
28 topic/detail.html 专题详情页
29
30 art/detail.html 文章内容页
31 art/rss.html 文章内容rss
32 art/search.html 文章搜索页
33 art/type.html 文章分类页
34 art/show.html 文章分类筛选页
35
36 vod/confirm.html 确认支付积分页面
37 vod/detail.html 视频内容页
38 vod/rss.html 视频内容rss
39 vod/play.html 视频播放页
40 vod/player.html 试看页面播放页
41 vod/down.html 视频下载页
42 vod/search.html 视频搜索页面
43 vod/type.html 视频分类页面
44 vod/show.html 视频分类筛选页
45
46 user/ajax_info.html 用户弹出层登录详情
47 user/ajax_login.html 用户弹出层登录界面
48 user/buy.html 用户中心-在线充值
49 user/cards.html 用户中心-充值卡记录
50 user/downs.html 用户中心-下载记录
51 user/favs.html 用户中心-收藏记录
52 user/findpass.html 用户中心-找回密码
53 user/foot.html 用户中心-公共底部
54 user/head.html 用户中心-公共头部
55 user/include.html 用户中心-公共引入文件
56 user/index.html 用户中心-首页
57 user/info.html 用户中心-个人详情
58 user/login.html 用户中心-登录页
59 user/orders.html 用户中心-在线充值记录
60 user/pay.html 用户中心-支付页
61 user/plays.html 用户中心-点播记录
62 user/popedom.html 用户中心-权限列表
63 user/reg.html 用户中心-注册
64 user/upgrade.html 用户中心-会员升级
65 系统内置JS、CSS说明
66 code
67 文件:home.js
68 MAC.Url当前网页地址
69 MAC.Title当前网页标题
70 MAC.UserAgent获取浏览器类型
71 MAC.Copy(s)复制内容到剪切板
72 MAC.Home(obj,url)设置网址为浏览器主页
73 MAC.Fav(url,name)加入网址到收藏夹
74 MAC.Open(w,h,u)弹出网址
75 MAC.Cookie.Set(name,val,day)设置cookie
76 MAC.Cookie.Get(name)获取cookie
77 MAC.Cookie.Del(name)删除cookie
78 MAC.GoBack()返回上个页面
79 MAC.Qrcode() 重写class=”mac_qrcode” 的图片地址为一个二维码
80 MAC.Image.Lazyload.Show()异步载入图片
81 MAC.Image.Lazyload.Box(id)载入指定id内部的图片
82 MAC.Verify.Init() 把class=”mac_verify” 的input框后边插入图片验证码class=”mac_verify_img”
83 MAC.PageGo()把class=”mac_page_go”的按钮绑定事件切换分页
84 MAC.Hits()把class=”mac_hits”的元素载入点击量
85 MAC.Score().Init()在class=”mac_score”的内部初始化普通评分插件,class=”score_btn”提交评分
86 MAC.Star().Init()在class=”mac_star”的元素初始化星星评分插件
87 MAC.Digg.Init()在class=”digg_link”的元素上绑定 点击事件
88 MAC.Gbook().Init()在class=”gbook_content”,class=”gbook_submit”绑定事件留言本使用
89 MAC.Search().Init()在class=”mac_search”的按钮上绑定事件,跳转到搜索页面
90 MAC.Suggest().Init()在class=”mac_wd”的文本框内部加入搜索联想结果功能
91 MAC.History().Init()在class=”mac_history”的元素上加入鼠标移入移除事件展示浏览日志
92 MAC.Ulog().Init()在class=”mac_ulog”的元素上初始化用户日志相关操作,包含1浏览2收藏3想看4点播5下载
93 MAC.User().Init()在class=”mac_user”的元素上初始化用户无刷新登录、用户详情
94 MAC.Pop().Show()弹出层插件
95 MAC.AdsWrap()输出占位符
96 MAC.Css()加载css文件
97 MAC.Desktop()跳转到保存到桌面
98 MAC.Comment()评论相关功能
99 全局标签
100 code
101 {$maccms.site_name} 网站名称
102 {$maccms.site_url} 网站url
103 {$maccms.site_keywords} 网站关键字
104 {$maccms.site_description} 网站描述
105 {$maccms.site_icp} 备案号
106 {$maccms.site_qq} 站长qq
107 {$maccms.site_email} 站长email
108 {$maccms.site_tj} 统计代码
109 {$maccms.site_status} 网站状态1开启0关闭
110 {$maccms.site_close_tip} 网站关闭提示信息
111 {$maccms.path} 网站目录
112 {$maccms.path_tpl} 当前模板目录
113 {$maccms.search_hot} 热门搜索词
114 {$maccms.mid}模块id,1视频2文章3专题
115 {$maccms.aid}当前系统页面id
116 首页1
117 地图2
118 rss3
119 留言本4
120 评论5
121 用户中心6
122 自定义页面7
123 视频首页10
124 文章首页20
125 专题首页30
126 视频分类页11
127 视频分类筛选12
128 视频搜索13
129 视频详情14
130 视频播放15
131 视频下载16
132 文章分类21
133 文章分类筛选22
134 文章搜索23
135 文章详情24
136 专题详情31
137 引入模板文件
138 code
139 {include file=”public/head”}
140 条件判断if标签
141 code
142 由于if标签的condition属性里面基本上使用的是php语法,尽可能使用判断标签和Switch标签会更加简洁:
143 {if condition=”($name == 1) OR ($name > 100) “} value1
144 {elseif condition=”$name eq 2″/}value2
145 {else /} value3
146 {/if}
147 empty标签用于判断某个变量是否为空,用法:
148 {empty name=”name”}
149 name为空值
150 {/empty}
151 如果判断没有赋值,可以使用:
152 {notempty name=”name”}
153 name不为空
154 {/notempty}
155 友情链接标签
156 code
157 参数:
158 type:友情链接类型 font表示文字,pic表示图片
159 num: 获取数据条数
160 例:
161 {maccms:link num=”2″ type=”pic”}
162 {$key}序号
163 {$vo.link_name}名称
164 {$vo.link_url}地址
165 {$vo.link_pic}图片
166 {/maccms:link}
167 留言本标签
168 code
169 参数:
170 num:数据条数 默认值10
171 paging:是否开启分页yes
172 by:数据排序依据 id,time
173 例:
174 {maccms:gbook num=”10″ paging=”no” order=”desc” by=”time”}
175 {$key}序号
176 {$vo.gbook_id} 编号id
177 {$vo.gbook_name} 留言昵称
178 {$vo.gbook_content} 留言内容
179 {$vo.gbook_reply} 回复内容
180 {$vo.gbook_ip} 留言者IP
181 {$vo.gbook_time} 留言时间
182 {$vo.gbook_replytime} 回复时间
183 {/maccms:gbook}
184 评论标签
185 code
186 参数:
187 num:数据条数 默认值10
188 paging:是否开启分页yes
189 by:数据排序依据 id,time
190 例:
191 {maccms:comment num=”10″ paging=”no” order=”desc” by=”time”}
192 {$key} 排序位
193 {$vo.comment_id} 编号id
194 {$vo.comment_name} 评论昵称
195 {$vo.comment_content} 评论内容
196 {$vo.comment_ip} 评论者IP
197 {$vo.comment_time} 评论时间
198 {$vo.childs} 回复评论项
199 {/maccms:comment}
200 分类标签(视频,文章通用)
201 code
202 参数:
203 order排列顺序desc倒序,asc正序
204 by排序依据
205 start从第几条开始
206 num获取条数
207 ids指定分类parent获取一级分诶;child获取子分类;1,2,3一组指定ID;
208 flag视频=vod文章=art
209 {maccms:type num=”10″ order=”asc” by=”sort” ids=”all”}
210 内部同下方,{$obj.改为{$vo.开头即可
211 {/maccms:type}
212 =======分类页独有标签=======
213 {$obj.parent} 如果当前访问的是二级分类,这个是一级分类对象,也同样包含以下属性,如{$obj.parent.type_id}一级分类id
214 {$obj.type_id}分类id
215 {$obj.type_name}名称
216 {$obj.type_enname}别名
217 {$obj.type_sort}排序号
218 {$obj.type_mid}所属模块
219 {$obj.type_pid}上级id
220 {$obj.type_status}状态1开启0关闭
221 {$obj.type_tpl}分类页模板
222 {$obj.type_tpl_list}筛选页模板
223 {$obj.type_tpl_detail}详情页模板
224 {$obj.type_tpl_play}播放页模板
225 {$obj.type_tpl_down}下载页模板
226 {$obj.type_key}关键字
227 {$obj.type_des}描述信息
228 {$obj.type_title}标题
229 {$obj.type_extend}扩展配置json
230 {:mac_url_type($obj)} 分类链接
231 专题列表标签
232 code
233 参数:
234 order排列顺序desc倒序,asc正序
235 by排序依据
236 start从第几条开始
237 num获取条数
238 ids指定1,2,3一组指定ID;
239 timeadd添加时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour
240 timehits点击时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour
241 time更新时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour
242 hitsmonth月点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000
243 hitsweek周点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000
244 hitsday日点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000
245 hits总点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000
246 paging是否分页yes
247 {maccms:topic num=”10″ paging=”no” order=”asc” by=”sort” ids=”all”}
248 内部同下方,{$obj.改为{$vo.开头即可
249 {/maccms:topic}
250 =======专题页独有标签=======
251 {$obj.topic_id}专题id
252 {$obj.topic_name}名称
253 {$obj.topic_en}别名
254 {$obj.topic_sub}副标
255 {$obj.topic_status}状态
256 {$obj.topic_sort}排序号
257 {$obj.topic_letter}首字母
258 {$obj.topic_color}高亮颜色
259 {$obj.topic_tpl}模板文件
260 {$obj.topic_type}扩展分类
261 {$obj.topic_pic}图片
262 {$obj.topic_pic_thumb}缩略图
263 {$obj.topic_pic_slide}幻灯图
264 {$obj.topic_key}seo关键字
265 {$obj.topic_des}seo描述
266 {$obj.topic_title}seo标题
267 {$obj.topic_blurb}简介
268 {$obj.topic_remarks}备注
269 {$obj.topic_level}推荐值
270 {$obj.topic_up}顶数
271 {$obj.topic_down}踩数
272 {$obj.topic_score}平均分
273 {$obj.topic_score_all}总评分
274 {$obj.topic_score_num}总评次
275 {$obj.topic_hits}总点击
276 {$obj.topic_hits_day}日点击
277 {$obj.topic_hits_week}周点击
278 {$obj.topic_hits_month}月点击
279 {$obj.topic_time}更新时间
280 {$obj.topic_time_add}添加时间
281 {$obj.topic_content}详细介绍
282 {$obj.topic_extend}扩展配置json
283 {:mac_url_topic_detail($obj)} 专题详情页链接
284 {:mac_url_topic_index()} 专题首页链接
285 剧情分类、地区、语言、年代、版本、资源标签
286 code
287 剧情分类标签参数:
288 order: 排序desc倒序,asc正序
289 num:显示条数
290 {maccms:class num=”10″ order=”desc”}
291 {$key} 序号
292 {$vo.class_name} 分类名称
293 {$vo.class_link} 链接
294 {/maccms:class}
295 地区标签参数:
296 order: 排序desc倒序,asc正序
297 num:显示条数
298 {maccms:area num=”5″ order=”desc”}
299 {$key} 排序位
300 {$vo.area_name} 地区名称
301 {$vo.area_link} 链接地址
302 {/maccms:area}
303 语言标签参数:
304 order:排序desc倒序,asc正序
305 num:显示条数
306 {maccms:lang num=”5″ order=”desc”}
307 {$key} 排序位
308 {$vo.lang_name} 语言名称
309 {$vo.lang_link} 链接地址
310 {/maccms:lang}
311 年代标签参数:
312 order:排序desc倒序,asc正序
313 num:显示条数
314 {maccms:year num=”5″ order=”desc”}
315 {$key} 排序位
316 {$vo.year_name} 语言名称
317 {$vo.year_link} 链接地址
318 {/maccms:year}
319 版本标签参数:
320 order:排序desc倒序,asc正序
321 num:显示条数
322 {maccms:version num=”5″ order=”desc”}
323 {$key} 排序位
324 {$vo.version_name} 版本名称,如高清版,剧场版
325 {$vo.version_link} 链接地址
326 {/maccms:version}
327 资源标签参数:
328 order:排序desc倒序,asc正序
329 num:显示条数
330 {maccms:state num=”5″ order=”desc”}
331 {$key} 排序位
332 {$vo.state_name} 状态名称,如正片,预告片
333 {$vo.state_link} 链接地址
334 {/maccms:state}
335 分页标签详解
336 code
337 分页标签可用在,首页、分类页、筛选页、专题首页、搜索页、文章内容页、留言本、评论
338 其中包含隐藏参数pageurl=””,视频默认是vod/type,文章分页默认是art/type,分页时必须加入此参数以免分页出错!!!
339 例如:{maccms:vod num=”10″ paging=”yes” pageurl=”vod/type” half=”3″} {/maccms:vod}
340 视频分类页是pageurl=”vod/type”
341 视频筛选页是pageurl=”vod/show”
342 视频搜索页是pageurl=”vod/search”
343 首页是pageurl=”index/index”
344 文章分类页是pageurl=”art/type”
345 文章筛选页是pageurl=”art/show”
346 文章搜索页是pageurl=”art/search”
347 其中half参数是设置显示分页数字页码的个数,不设置默认为5。
348 参数详解:
349 系统提供了$__PAGING__分页变量,可以来进行diy定制。
350 例子:
351 <div class=”mac_pages”>
352 <div class=”page_tip”>共{$__PAGING__.record_total}条数据,当前{$__PAGING__.page_current}/{$__PAGING__.page_total}页</div>
353 <div class=”page_info”>
354 <a class=”page_link” href=”{$__PAGING__.page_url|str_replace=’%7Bpg%7D’,1,###}” title=”首页”>首页</a>
355 <a class=”page_link” href=”{$__PAGING__.page_url|str_replace=’%7Bpg%7D’,$__PAGING__.page_prev,###}” title=”上一页”>上一页</a>
356 {maccms:foreach name=”$__PAGING__.page_num” id=”num”}
357 {if condition=”$__PAGING__[‘page_current’] eq $num”}
358 <a class=”page_link page_current” href=”javascript:;” title=”第{$num}页”>{$num}</a>
359 {else}
360 <a class=”page_link” href=”{$__PAGING__.page_url|str_replace=’%7Bpg%7D’,$num,###}” title=”第{$num}页”>{$num}</a>
361 {/if}
362 {/maccms:foreach}
363 <a class=”page_link” href=”{$__PAGING__.page_url|str_replace=’%7Bpg%7D’,$__PAGING__.page_next,###}” title=”下一页”>下一页</a>
364 <a class=”page_link” href=”{$__PAGING__.page_url|str_replace=’%7Bpg%7D’,$__PAGING__.page_total,###}” title=”尾页”>尾页</a>
365 <input class=”page_input” type=”text” placeholder=”页码” id=”page” autocomplete=”off” style=”width:40px”>
366 <button class=”page_btn” type=”button” onclick=”pagego(‘{$__PAGING__.page_url}’,'{$__PAGING__.page_total}’)”>GO</button>
367 </div>
368 </div>
369 视频搜索页参数和标签详解
370 code
371 参数详解:
372 wd:名称或主演
373 ids:数据id支持多个逗号分割 1,2,3
374 letter:首字母
375 enname:别名
376 actor:主演
377 director:导演
378 area:地区
379 lang:语言
380 year:上映年代
381 version:版本
382 state:资源类型
383 level:推荐等级
384 tid:分类id
385 order:排序 desc(倒序) asc (正序)
386 by:排序字段
387 独有标签:
388 {$param.page}当前页码
389 {$param.wd}关键字
390 {$param.area}地区
391 {$param.lang}语言
392 {$param.year}年代
393 {$param.actor}演员
394 {$param.director}导演
395 {$param.class}扩展分类
396 视频列表标签
397 code
398 参数
399 order排列顺序desc倒序,asc正序
400 by排序依据
401 start从第几条开始
402 num获取条数
403 ids指定1,2,3一组ID;
404 type指定获取分类数据 all所有;1,2,3指定;
405 class指定某扩展分类 支持多个 动作,喜剧
406 tag指定tag 支持多个 aaa,xxx
407 level指定推荐值 支持多个 1,2
408 area指定地区 支持多个 大陆,香港
409 lang指定语言 支持多个 国语,粤语
410 year指定年代 支持多个 2002,2003
411 state资源类别 支持多个 高清版,剧场版,抢先版
412 version资源版本 支持多个 正片,预告片
413 weekday更新周期 支持多个 一,二,三
414 rel指定关联数据 1,2,3 或 变形金刚
415 timeadd添加时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour
416 timehits点击时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour
417 time更新时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour
418 hitsmonth月点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000
419 hitsweek周点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000
420 hitsday日点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000
421 hits总点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000
422 paging是否分页yes
423 pageurl分页地址
424 {maccms:vod num=”10″ paging=”no” type=”all” order=”asc” by=”sort”}
425 内部同下方,{$obj.改为{$vo.开头即可
426 {/maccms:vod}
427 =======视频内容页独有标签=======
428 {$obj.vod_id} 视频id
429 {$obj.type_id} 分类id
430 {$obj.type_id_1} 一级分类id
431 {$obj.type} 视频分类对象,二级属性可参考分类
432 {$obj.type_1} 一级分类对象,二级属性可参考分类
433 {$obj.group_id} 用户组id
434 {$obj.vod_name} 视频名
435 {$obj.vod_sub} 副标题
436 {$obj.vod_en} 别名
437 {$obj.vod_status} 状态0未审1已审
438 {$obj.vod_letter} 首字母
439 {$obj.vod_color} 颜色
440 {$obj.vod_tag} tags
441 {$obj.vod_class} 扩展分类
442 {$obj.vod_pic} 图片
443 {$obj.vod_pic_thumb} 缩略图
444 {$obj.vod_pic_slide} 幻灯图
445 {$obj.vod_actor} 主演
446 {$obj.vod_director} 导演
447 {$obj.vod_writer}编剧
448 {$obj.vod_blurb} 简介
449 {$obj.vod_remarks} 备注
450 {$obj.vod_pubdate}上映日期
451 {$obj.vod_total} 总集数
452 {$obj.vod_serial} 连载数
453 {$obj.vod_tv} 上映电视台
454 {$obj.vod_weekday} 节目周期
455 {$obj.vod_area} 地区
456 {$obj.vod_lang} 语言
457 {$obj.vod_year} 年代
458 {$obj.vod_version} 版本-dvd,hd,720p
459 {$obj.vod_state} 资源类别-正片,预告片,花絮
460 {$obj.vod_author} 编辑人员
461 {$obj.vod_jumpurl} 跳转url
462 {$obj.vod_tpl} 独立模板
463 {$obj.vod_tpl_play} 独立播放页模板
464 {$obj.vod_tpl_down} 独立下载页模板
465 {$obj.vod_isend} 是否完结
466 {$obj.vod_lock} 锁定1
467 {$obj.vod_level} 推荐级别
468 {$obj.vod_points_play} 点播付费
469 {$obj.vod_points_down} 下载付费
470 {$obj.vod_hits} 总点击量
471 {$obj.vod_hits_day} 日点击量
472 {$obj.vod_hits_week} 周点击量
473 {$obj.vod_hits_month} 月点击量
474 {$obj.vod_duration} 时长
475 {$obj.vod_up} 顶数
476 {$obj.vod_down} 踩数
477 {$obj.vod_score} 平均分
478 {$obj.vod_score_all} 总评分
479 {$obj.vod_score_num} 评分次数
480 {$obj.vod_time} 更新时间
481 {$obj.vod_time_add} 添加时间
482 {$obj.vod_time_hits} 点击时间
483 {$obj.vod_time_make} 生成时间
484 {$obj.vod_trysee} 试看时长分
485 {$obj.vod_reurl} 来源地址
486 {$obj.vod_rel_vod} 关联视频ids
487 {$obj.vod_rel_art} 关联文章ids
488 {$obj.vod_content} 详细介绍
489 {$obj.vod_play_from} 播放组
490 {$obj.vod_play_server} 播放服务器组
491 {$obj.vod_play_note} 播放备注
492 {$obj.vod_play_url} 播放地址
493 {$obj.vod_down_from} 下载租
494 {$obj.vod_down_server} 下载服务器组
495 {$obj.vod_down_note} 下载备注
496 {$obj.vod_down_url} 下载地址
497 {:mac_url_vod_detail($obj)} 视频详情页链接
498 {:mac_url_vod_play($obj,[‘sid’=>1,’nid’=>1])} 视频播放页链接
499 {:mac_url_vod_down($obj,[‘sid’=>1,’nid’=>1])} 视频下载页链接
500 视频内容页、播放页标签
501 code
502 列出播放地址
503 {maccms:foreach name=”obj.vod_play_list” id=”vo”}
504 <div class=”ui-box marg” id=”playlist_{$key}”>
505 <div class=”down-title”>
506 <h2>{$vo.from}-在线播放</h2><span>[{$vo.player_info.tip}]</span>
507 </div>
508 <div class=”video_list fn-clear”>
509 {maccms:foreach name=”vo.urls” id=”vo2″}
510 <a href=”{:mac_url_vod_play($obj,[‘sid’=>$vo.sid,’nid’=>$vo2.nid])}”>{$vo2.title}</a>
511 {/maccms:foreach}
512 </div>
513 </div>
514 {/maccms:foreach}
515 列出下载地址
516 {maccms:foreach name=”obj.vod_down_list” id=”vo”}
517 <div class=”ui-box marg” id=”downlist_{$key}”>
518 <div class=”down-title”>
519 <h2>{$vo.from}-下载</h2><span>[{$vo.player_info.tip}]</span>
520 </div>
521 <div class=”video_list fn-clear”>
522 {maccms:foreach name=”vo.urls” id=”vo2″}
523 <a href=”{:mac_url_vod_down($obj,[‘sid’=>$vo.sid,’nid’=>$vo2.nid])}”>{$vo2.title}</a>
524 {/maccms:foreach}
525 </div>
526 </div>
527 {/maccms:foreach}
528 上边循环过程中,其中获取播放器详细信息的方法是
529 {$vo.player_info.from} 编码
530 {$vo.player_info.show} 名称
531 {$vo.player_info.des} 备注
532 {$vo.player_info.tip} 提示
533 {$vo.player_info.sort} 排序
534 {$vo.player_info.parse} 解析接口
535 =======视频播放页独有标签=======
536 {$param.sid} 当前播放组序号
537 {$param.nid} 当前集数序号
538 {$obj.player_info.link_next} 下一页地址,*后一页时此链接将当前页链接
539 {$obj.player_info.link_pre} 上一页地址,*页时此链接将当前页链接
540 {$obj[‘vod_play_list’][$param[‘sid’]]} 获取当前播放组数据
541 {$obj[‘vod_play_list’][$param[‘sid’]][‘player_info’]} 播放器信息
542 {$obj[‘vod_play_list’][$param[‘sid’]][‘server_info’]} 服务器组信息
543 {$obj[‘vod_play_list’][$param[‘sid’]][‘url_count’]} 总集数
544 {$obj[‘vod_play_list’][$param[‘sid’]][‘urls’]} 集数信息
545 {$obj[‘vod_play_list’][$param[‘sid’]][‘urls’][$param[‘nid’]]} 当前集数信息
546 {$obj[‘vod_play_list’][$param[‘sid’]][‘urls’][$param[‘nid’]][‘name’]} 当前集数名称
547 {$obj[‘vod_play_list’][$param[‘sid’]][‘urls’][$param[‘nid’]][‘url’]} 当前集数url
548 下载页获取以上信息,请把vod_play_list改为vod_down_list,其他参数不变
549 {$player_data} 播放数据
550 {$player_js} 加载播放器
551 =======获取与当前视频相关联视频和关联文章数据======
552 <h2>与<strong>“{$obj.vod_name}”</strong>关联的视频</h2>
553 <ul class=”img-list dis”>
554 {maccms:vod num=”6″ rel=”‘.$obj[‘vod_rel_vod’].'” order=”desc” by=”time”}
555 <li><a href=”{:mac_url_vod_detail($vo)}” title=”{$vo.vod_name}”><img src=”{:mac_url_img($vo.vod_pic)}” alt=”{$vo.vod_name}”><h2>{$vo.vod_name}</h2><p></p><i>{$vo.vod_version}</i><em></em></a></li>
556 {/maccms:vod}
557 </ul>
558 <h2>与<strong>“{$obj.vod_name}”</strong>关联的文章</h2>
559 <ul class=”img-list dis”>
560 {maccms:art num=”6″ rel=”‘.$obj[‘vod_rel_art’].'” order=”desc” by=”time”}
561 <li><a href=”{:mac_url_art_detail($vo)}” title=”{$vo.art_name}”><img src=”{:mac_url_img($vo.art_pic)}” alt=”{$vo.art_name}”><h2>{$vo.art_name}</h2><p></p><i>{$vo.vod_from}</i><em></em></a></li>
562 {/maccms:art}
563 </ul>
564 文章列表标签
565 code
566 参数:
567 order排列顺序desc倒序,asc正序
568 by排序依据
569 start从第几条开始
570 num获取条数
571 ids指定1,2,3一组ID;
572 type指定获取分类数据 all所有;1,2,3指定;
573 class指定某扩展分类 支持多个
574 tag指定tag 支持多个 aaa,xxx
575 level指定推荐值 支持多个
576 rel指定关联数据 1,2,3 或 变形金刚
577 timeadd添加时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour
578 timehits点击时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour
579 time更新时间 一天前 -1 day,一周前-1 week,一月前-1 month,一小时前-1 hour
580 hitsmonth月点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000
581 hitsweek周点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000
582 hitsday日点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000
583 hits总点击量 大于一千 gt 1000, 小于一千 lt 1000,区间一千二千之间 between 1000,2000
584 paging是否分页yes
585 pageurl分页地址
586 {maccms:art num=”10″ paging=”no” type=”all” order=”asc” by=”sort”}
587 内部同下方,{$obj.改为{$vo.开头即可
588 {/maccms:art}
589 =======文章内容页独有标签=======
590 {$obj.art_id} 文章id
591 {$obj.type_id} 分类id
592 {$obj.type_id_1} 一级分类id
593 {$obj.type} 视频分类对象,二级属性可参考分类
594 {$obj.type_1} 一级分类对象,二级属性可参考分类
595 {$obj.group_id} 用户组id
596 {$obj.art_name} 标题
597 {$obj.art_sub} 副标题
598 {$obj.art_en} 别名
599 {$obj.art_status} 状态0未审1已审
600 {$obj.art_letter} 首字母
601 {$obj.art_color} 颜色
602 {$obj.art_from} 来源
603 {$obj.art_author} 作者
604 {$obj.art_tag} tags
605 {$obj.art_class} 扩展分类
606 {$obj.art_pic} 主图
607 {$obj.art_pic_thumb} 缩略图
608 {$obj.art_pic_slide} 幻灯图
609 {$obj.art_blurb} 简介
610 {$obj.art_remarks} 备注
611 {$obj.art_jumpurl} 跳转url
612 {$obj.art_tpl} 独立模板
613 {$obj.art_level} 推荐等级
614 {$obj.art_lock} 锁定
615 {$obj.art_up} 顶数
616 {$obj.art_down} 踩数
617 {$obj.art_hits} 总点击量
618 {$obj.art_hits_day} 日点击量
619 {$obj.art_hits_week} 周点击量
620 {$obj.art_hits_month} 月点击量
621 {$obj.art_time} 更新时间
622 {$obj.art_time_add} 添加时间
623 {$obj.art_time_hits} 点击时间
624 {$obj.art_time_make} 生成时间
625 {$obj.art_score} 平均分
626 {$obj.art_score_all} 总评分
627 {$obj.art_score_num} 评分次数
628 {$obj.art_rel_art} 关联文章
629 {$obj.art_rel_vod} 关联视频
630 {$obj.art_title} 页标题
631 {$obj.art_note} 页备注
632 {$obj.art_content} 页详细介绍
633 {:mac_url_art_detail($obj)} 文章详情页链接
634 =======获取与当前文章相关联视频和关联文章数据======
635 <h2>与<strong>“{$obj.art_name}”</strong>关联的视频</h2>
636 <ul class=”img-list dis”>
637 {maccms:vod num=”6″ ids=”‘.$obj[‘art_rel_vod’].'” order=”desc” by=”time”}
638 <li><a href=”{:mac_url_vod_detail($vo)}” title=”{$vo.vod_name}”><img src=”{:mac_url_img($vo.vod_pic)}” alt=”{$vo.vod_name}”><h2>{$vo.vod_name}</h2><p></p><i>{$vo.vod_version}</i><em></em></a></li>
639 {/maccms:vod}
640 </ul>
641 <h2>与<strong>“{$obj.art_name}”</strong>关联的文章</h2>
642 <ul class=”img-list dis”>
643 {maccms:art num=”6″ ids=”‘.$obj[‘art_rel_art’].'” order=”desc” by=”time”}
644 <li><a href=”{:mac_url_art_detail($vo)}” title=”{$vo.art_name}”><img src=”{:mac_url_img($vo.art_pic)}” alt=”{$vo.art_name}”><h2>{$vo.art_name}</h2><p></p><i>{$vo.vod_from}</i><em></em></a></li>
645 {/maccms:art}
646 </ul>
647 分页内容标签
648 code
649 分页代码可用在分类页、筛选页、搜索页、文章内容页、留言本、评论、专题首页等页面,使用前提是页面有包含paging=’yes’获取分页数据的标签。
650 其中包含隐藏参数pageurl=””,视频默认是vod/type,文章分页默认是art/type,分页时必须加入此参数以免分页出错!!!
651 例如:{maccms:vod num=”10″ paging=”yes” pageurl=”vod/type”} {/maccms:vod}
652 视频分类页是pageurl=”vod/type”
653 视频筛选页是pageurl=”vod/show”
654 视频搜索页是pageurl=”vod/search”
655 首页是pageurl=”index/index”
656 文章分类页是pageurl=”art/type”
657 文章筛选页是pageurl=”art/show”
658 文章搜索页是pageurl=”art/search”
659 <div class=”mac_pages”>
660 <div class=”page_tip”>共{$__PAGING__.record_total}条数据,当前{$__PAGING__.page_current}/{$__PAGING__.page_total}页</div>
661 <div class=”page_info”>
662 <a class=”page_link” href=”{$__PAGING__.page_url|mac_url_page=1}” title=”首页”>首页</a>
663 <a class=”page_link” href=”{$__PAGING__.page_url|mac_url_page=$__PAGING__.page_prev}” title=”上一页”>上一页</a>
664 {maccms:foreach name=”$__PAGING__.page_num” id=”num”}
665 {if condition=”$__PAGING__[‘page_current’] eq $num”}
666 <a class=”page_link page_current” href=”javascript:;” title=”第{$num}页”>{$num}</a>
667 {else}
668 <a class=”page_link” href=”{$__PAGING__.page_url|mac_url_page=$num}” title=”第{$num}页”>{$num}</a>
669 {/if}
670 {/maccms:foreach}
671 <a class=”page_link” href=”{$__PAGING__.page_url|mac_url_page=$__PAGING__.page_next}” title=”下一页”>下一页</a>
672 <a class=”page_link” href=”{$__PAGING__.page_url|mac_url_page=$__PAGING__.page_total}” title=”尾页”>尾页</a>
673 <input class=”page_input” type=”text” placeholder=”页码” id=”page” autocomplete=”off” style=”width:40px”>
674 <button class=”page_btn mac_page_go” type=”button” data-url=”{$__PAGING__.page_url}” data-total=”{$__PAGING__.page_total}” data-sp=”{$__PAGING__.page_sp}”>GO</button>
675 </div>
676 </div>
677 常用处理函数
678 code
679 允许使用多个函数,都使用|分隔开
680 {:mac_data_count(0,’all’,’vod’)} 获取视频总数量
681 {:mac_data_count(0,’today’,’vod’)} 获取今日更新视频总数量
682 {:mac_data_count(0,’all’,’art’)} 获取文章总数量
683 {:mac_data_count(0,’today’,’art’)} 获取今日更新文章总数量
684 {:mac_data_count(1,’all’)} 获取某个分类下的数据总量,支持视频和文章,传入分类ID
685 {:mac_data_count(1,’today’)} 获取某个分类下的今日更新数据总量,支持视频和文章,传入分类ID
686 {:mac_url(‘map/index’)} 获取站内链接,参数代表 模块/页面
687 {$vo.vod_pic|mac_url_img} 自动转换图片地址
688 {$vo.vod_content|mac_substring=100}返回截取字符串100个字
689 {$vo.vod_content|mac_filter_html}返回没有html代码的内容
690 {$vo.actor|mac_url_create=’actor’,’vod’,’search’}把,号相连的一串字符生成N个搜索链接,后2个参数可以不填写默认是生成vod模块搜索链接。 例子是创建演员搜索链接。支持演员、导演、tag、扩展分类等字段
691 {$vo.vod_time|mac_day} 自动返回日期
692 {$vo.vod_time|mac_friend_date} 友好时间提醒 几秒前,几分前,几小时前,几天前。。。
693 {$vo.vod_year|mac_default=’未知’}如果字符串为空,则返回默认字符串
694 {$user.user_login_ip|mac_long2ip}返回格式化ip地址
695 常用JS处理函数=======一般用元素的class自动绑定处理事件
696 code
697 会员-收藏视频内容
698 <a href=”javascript:;” class=”mac_ulog” data-type=”2″ data-mid=”{$maccms.mid}” data-id=”{$obj.vod_id}”>我要收藏</a>
699 会员-收藏文章内容页
700 <a href=”javascript:;” class=”mac_ulog” data-type=”2″ data-mid=”{$maccms.mid}” data-id=”{$obj.art_id}”>我要收藏</a>
701 会员-收藏专题内容页
702 <a href=”javascript:;” class=”mac_ulog” data-type=”2″ data-mid=”{$maccms.mid}” data-id=”{$obj.topic_id}”>我要收藏</a>
703 以下内容一般放到body结尾之前,不用于显示,只用户记录信息。
704 会员-文章浏览记录
705 <span style=”display:none” class=”mac_ulog_set” alt=”设置文章内容页浏览记录” data-type=”1″ data-mid=”{$maccms.mid}” data-id=”{$obj.art_id}” data-sid=”{$param.sid}” data-nid=”{$param.nid}”></span>
706 会员-专题浏览记录
707 <span style=”display:none” class=”mac_ulog_set” alt=”设置专题内容页浏览记录” data-type=”1″ data-mid=”{$maccms.mid}” data-id=”{$obj.topic_id}” data-sid=”{$param.sid}” data-nid=”{$param.nid}”></span>
708 会员-视频浏览记录
709 <span style=”display:none” class=”mac_ulog_set” alt=”设置内容页浏览记录” data-type=”1″ data-mid=”{$maccms.mid}” data-id=”{$obj.vod_id}” data-sid=”{$param.sid}” data-nid=”{$param.nid}”></span>
710 会员-视频播放记录
711 <span style=”display:none” class=”mac_ulog_set” alt=”设置视频播放记录” data-type=”4″ data-mid=”{$maccms.mid}” data-id=”{$obj.vod_id}” data-sid=”{$param.sid}” data-nid=”{$param.nid}”></span>
712 会员-视频下载记录
713 <span style=”display:none” class=”mac_ulog_set” alt=”设置视频播放记录” data-type=”5″ data-mid=”{$maccms.mid}” data-id=”{$obj.vod_id}” data-sid=”{$param.sid}” data-nid=”{$param.nid}”></span>
714 视频、文章、专题 顶和踩 通用
715 <a class=”digg_link” data-id=”{$obj.vod_id}{$obj.art_id}{$obj.topic_id}” data-mid=”{$maccms.mid}” data-type=”up” href=”javascript:;”>
716 顶<em class=”digg_num”>{$obj.vod_up}{$obj.art_up}{$obj.topic_up}</em>
717 </a>
718 <a class=”digg_link” data-id=”{$vod_id}{$art_id}{$topic_id}” data-mid=”{$maccms.mid}” data-type=”down” href=”javascript:;”>
719 踩<em class=”digg_num”>{$obj.vod_down}{$obj.art_down}{$obj.topic_down}</em>
720 </a>
721 视频、文章、专题点击量显示 通用
722 总点击量:<span class=”mac_hits hits” data-mid=”{$maccms.mid}” data-id=”{$obj.vod_id}{$obj.art_id}{$obj.topic_id}” “=”” data-type=”hits”></span>
723 日点击量:<span class=”mac_hits hits_day” data-mid=”{$maccms.mid}” data-id=”{$obj.vod_id}{$obj.art_id}{$obj.topic_id}” “=”” data-type=”hits_day”></span>
724 周点击量:<span class=”mac_hits hits_week” data-mid=”{$maccms.mid}” data-id=”{$obj.vod_id}{$obj.art_id}{$obj.topic_id}” “=”” data-type=”hits_week”></span>
725 月点击量:<span class=”mac_hits hits_month” data-mid=”{$maccms.mid}” data-id=”{$obj.vod_id}{$obj.art_id}{$obj.topic_id}” “=”” data-type=”hits_month”></span>
726 前台浏览历史记录调用
727 <a href=”javascript:;” class=”mac_history”>历史记录</a>
728 在视频、文章、专题详情页面写入浏览历史记录
729 <span style=”display:none” class=”mac_history_set” alt=”设置视频历史记录” data-name=”[{$obj.type.type_name}]{$obj.vod_name}” data-pic=”{$obj.vod_pic|mac_url_img}”></span>
730 <span style=”display:none” class=”mac_history_set” alt=”设置文章历史记录” data-name=”[{$obj.type.type_name}]{$obj.art_name}” data-pic=”{$obj.art_pic|mac_url_img}”></span>
731 <span style=”display:none” class=”mac_history_set” alt=”设置专题历史记录” data-name=”{$obj.topic_name}” data-pic=”{$obj.topic_pic|mac_url_img}”></span>
732 预留ajax数据接口,方便瀑布流加载
733 code
734 参数
735 mid:模块1视频2文章3专题
736 limit:每页条数,支持10,20,30
737 page:页码,*多不超过20页,防止非法采集
738 接口地址是index.php/ajax/data.html?mid=1&page=1&limit=10
739 常用标签技巧
740 code
741 1,在循环中获取每个分类的数据量
742 {maccms:type ids=”1,2,3,4″ order=”asc” by=”sort” id=”vo1″ key=”key1″}
743 分成:{$vo1.type_name};总数量: {$vo1.type_id|mac_data_count=all};今日数量:{$vo1.type_id|mac_data_count=today}。
744 {/maccms:type}
745 2,嵌套循环外层分类内部视频或文章,重点在于外部和内部标签各自设置 id 和 key,系统默认都是vo不适合会导致数据冲掉。
746 {maccms:type ids=”1,2,3,4″ order=”asc” by=”sort” id=”vo1″ key=”key1″}
747 {maccms:vod num=”10″ type=”‘.$vo1[‘type_id’].'” order=”desc” by=”time” id=”vo2″ key=”key2″}
748 {$vo1.type_name}:{$vo2.vod_name};
749 {/maccms:vod}
750 {/maccms:type}

iOS开发教你怎么集成ApplePay(苹果支付)

ApplePay在中国上线后,就有许多线上app前后脚加入了对其的接入支持,个人比较喜欢的ENJOY也抢在首批接入了ApplePay应用内支付。本文将分享作者的接入经验。

ApplePay是苹果公司推出的一种线上/线下的便捷支付方式,根据TouchId来验证支付卡持卡人身份,ApplePay并不参与资金流动,*终还是让银行完成扣款处理,目前据Apple介绍只配备在iphone6以上和新款的ipad Air2和ipad mini3上,中国地区*低系统要求为IOS9.2,对于一种新支付体验,这门槛的确有点高了。苹果开发文档对ApplePay工作方式的介绍.

%title插图%num

线下支付使用NFC POST机只需要与银联联系签约租用即可,我们来介绍线上支付的流程和app应用内接入的方法。

目前的接入方式有两种,一是使用第三方提供商的SDK接入,另一种是让PassKit Framework直接与银联的接口对接,当然网络上还有一些自己使用PassKit PaymentRequest自己生成订单组织信息,直接与Apple对接的Demo,因为我们不可能每家银行跑去签约,大陆的银行也不会给我们开放特许,因此这种方式仅仅能用于测试ApplePay的功能和API尝鲜,并不适用于生产中。
ApplePay官网上有列出中国目前支持并提供SDK的第三方提供商

使用第三方SDK接入的优点是开发成本比较低,并且各自都应该有高度定制的Payment Sheet(因订单信息完整度的不同),可供定制更详细的商品信息展示,缺点就是要钱。
若我们选择后者,相对开发成本会高,移动端不仅需要对支持性进行验证,协商银联接口数据对Payment Sheet的展示关闭进行控制,对各种异常进行捕抓和处理,同时后台需要自己实现对银联接口的认证交互,对交易数据的标准封装,订单状态的处理,支付信息的解密等。

我们选择使用银联SDK接入这种折中的方式,免费,工作量可以接受。

使用银联SDK接入的实现方式如图所示,主要工作是商户后台利用现成的API与银联的交互:

%title插图%num

 

 

申请MerchantID并更新你的证书:

向苹果申请我们独有的商户ID,详细步骤,真的很详细易懂。

获得MerchantId后,更新你的证书,并且于项目->targets->Capabilities中打开ApplePay权限,选择正确的MerchantID,让三个steps成为tick状态完全权限的配置。

%title插图%num

ok开始与银联碰头,于银联商家技术服务中心找到ApplePay入口,然后在”技术文档”选项卡中可以找到相应的SDK和后台文档。

%title插图%num

这里我使用PHP后台,在下载的SDK压缩包里找到了PHP Version SDK,忽略掉这个外壳,我们需要将子文件夹upacp_demo_app部署到我们的服务器中。

%title插图%num

这里我将upacp_demo_app部署到我mac的PHP环境中,打开upacp_demo_app/demo/api_05_app可以看见各种对订单处理的接口。

%title插图%num

订单的创建,取消,查询,退款等,现在我们测试下创建订单接口

 

 

订单参数

下图是创建订单的请求参数,目前银联创建ApplePay订单仅支持图中所示的参数字段,基本满足使用但可定制性比较低,*基本的订单参数merId商户号,orderId订单号,txnTime订单发送时间,txnAmt订单金额,目前测试阶段我们可以通过直接调用此接口post传参,也可以直接写死在php文件中

  • 注意:这里的merId是银联商户号,而非苹果分配的MerchantID。%title插图%num

 

测试证书

了解到这里后还没有具备生成订单的条件,然后我们需要配置配置签名证书和验签证书的路径,这些证书在SDK下载包里面已经有附带,我们只需要在upacp_demo_app/sdk/SDKConfig.php文件中配置好他们的路径即可

%title插图%num

这里需要配置主机的*对路径,不能使用项目相对路径,完成SDK_SIGN_CERT_PATH,SDK_ENCRYPT_CERT_PATH,SDK_VERIFY_CERT_DIR路径的配置

 

 

成功获取tn

我们请求下Form_6_2_AppConsume.php接口,即可创建订单,并且返回对应的Trade Name,在App端我们就是拿这个Trade Name来对相应的订单进行付款。

%title插图%num

 

拿到订单tn后,我们已经可以使用银联SDK调起支付,在这之前还要做的就是对设备和平台的支持性检测,通过,present出Payment Sheet即可。

工程配置:

1.添加SDK包:
将下载SDK解压包中找到applePaySDK文件夹,加入到需要接入ApplePay的项目中。

 

 

**这里注意,项目内如果同时支持银联普通支付的话,因为两个库引用重复,*好的办法就是升级银联SDK至*新版本(3.3.3),当然可以使用添加Linker Flags的方式解决,或者可以自己剥离掉重复部分,我是懒人,我选择升级哈哈。

2.为工程引入必须的framework:

  • CFNetwork.framework
  • PassKit.framework
  • SystemConfiguration/framework
  • libUPAPayPlugin.a
  • libz.1.2.5.tbd

    3.银联SDK使用http请求,在ios9以后需在工程plist文件中添加NSAppTransportSecurity来支持Http继续使用。

—注意—

  • 因为银联SDK内部分代码是由C/C++组织,这里必须添加libz.1.2.5.tbd,并且将引用到UPAPayPlugin.h的源文件的后缀改为.mm
  • 同时检查Target->Build Settings->Search Paths->Library Search Paths中自定义库libUPAPayPlugin.a的路径是否正确

    4.*后可以开始写代码了,在需要调起ApplePay支付控件的文件中引入头文件UPAPayPlugin.h(记得文件名后缀需要改成.mm),PassKit/PassKit.h

  1. – (void)verifiesApplePayAbility {
  2. if (![PKPaymentAuthorizationViewController class]) {
  3. //检查系统版本支持性
  4. PopMessage(@“当前系统版本不支持ApplePay,*低支持:iphone6, ios9.0以上”);
  5. return;
  6. } else if (![PKPaymentAuthorizationViewController canMakePayments]) {
  7. //检查设备支持性
  8. PopMessage(@“当前设备不支持ApplePay,*低支持:iphone6, ios9.0以上”);
  9. return;
  10. } else {
  11. //检查卡片支持性
  12. NSArray *supportedNetwork = @[PKPaymentNetworkVisa, PKPaymentNetworkMasterCard, PKPaymentNetworkChinaUnionPay, PKPaymentNetworkAmex, PKPaymentNetworkDiscover];
  13. if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetwork]) {
  14. PopMessage(@“没有绑定支持的卡片”);
  15. return;
  16. }
  17. }
  18. //调起苹果支付控件
  19. [self presentPaymentSheet];
  20. }
  21. – (void)presentPaymentSheet {
  22. WaitingMessage(@“正在呼出ApplePay支付控件”);
  23. [UPAPayPlugin startPay:yourPayTn mode:self.applePayMode viewController:self delegate:self andAPMechantID:kAppleMechantId];
  24. //-startPay *个参数是后台向银联请求创建订单获得的商品tn
  25. //mode是字符串,00为正式环境,01为测试环境
  26. //此处的MechantID传的是从苹果那获取的mechantId
  27. }

如果需要对借记卡/信用卡作限制,在检查卡片支持性的步骤可以这样写:

  1. //检查卡片支持性
  2. NSArray *supportedNetwork = @[PKPaymentNetworkVisa, PKPaymentNetworkMasterCard, PKPaymentNetworkChinaUnionPay, PKPaymentNetworkAmex, PKPaymentNetworkDiscover];
  3. PKMerchantCapability capabilities = PKMerchantCapabilityEMV | PKMerchantCapability3DS | PKMerchantCapabilityDebit;
  4. if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetwork capabilities:capabilities]) {
  5. PopMessage(@“没有绑定支持的卡片,本支付仅支持使用借记卡支付”);
  6. return;
  7. }

*后是银联ApplePay的支付回调:
返回的UPPayResult对象中有各种支付状态,同时我们还应该检查他的otherInfo属性,里面包含银联的优惠活动信息,如果有则应该在支付成功页中告知客户。

  1. //实现UPAPayPluginDelegate
  2. – (void)UPAPayPluginResult:(UPPayResult *)payResult {
  3. //do something
  4. //检查是否有银联优惠信息,告知客户
  5. }

otherInfo中包含优惠信息的格式为:

  1. otherInfo = “currency=元&order_amt=20.00&pay_amt=15.00”
  2. //currency 币种
  3. //order_amt 订单金额
  4. //pay_amt 实付金额

!!!目前不支持商户自定义优惠活动!!!
博主自己研究了php API很久后无果,咨询银联客服,然后彻底死心。。

 

展示

以下左图是通过银联SDK接入,因为可定制参数比较少,Payment Sheet比较简短,右图是使用苹果API直接生成的订单。

%title插图%num

相信美团的ApplePay也是跟银联对接的,心血来潮买了个流量顺便作下对比

%title插图%num

 

 

生产环境:

csr文件
若需要在生产环境中使用银联SDK接入ApplePay,首先需向银联申请开通ApplePay服务(联系下签约服务),并从银联商户服务平台生成ApplePay专用的CSR文件,重新去苹果开发者网站签署证书。

%title插图%num

 

公钥,私钥
公钥在SDK下载包里面有,私钥在cfca入网通知邮件里面附带也可以自行下载,一个商户号唯一一份私钥和授权码,跟银联普通支付私钥是同一份。

配置
修改生产环境配置文件中的签名证书,密码,后台url地址
更换正式环境商户号(也可以是同一个)
app前端startPay方法的mode参数改为”00″

 

注意事项:

  • 银联常规支付SDK升级*新版本3.3.3
  • 项目内是否有引入libz.1.2.5.tbd
  • 将引用到UPAPayPlugin.h的源文件的后缀改为.mm
  • 检查Target->Build Settings->Search Paths->Library Search Paths中自定义库libUPAPayPlugin.a的路径是否正确
  • ApplePay的按钮展示必须使用官方指定,否则过不了审核

java 服务端验证苹果支付applepay账单

支付流程
前端支付完,付款成功
苹果会返回一个receipt-data,大概长这个样子{“receipt-data” : “MIIaYAYJKoZIhvcNAQcC……”}
将这个值返回给自己服务器,服务器开始验证账单
开始撸服务端代码 (部分代码来自网络)
大致原理也就是拿着receipt-data请求苹果服务器,苹果会返回给我们详细的账单信息,根据该信息判断账单是否正确
沙箱环境:https://sandbox.itunes.apple.com/verifyReceipt
正式环境:https://buy.itunes.apple.com/verifyReceipt
请求参数:receipt-data
请求方法:POST
使用HttpsURLConnection(推荐使用)

`
public static JSONObject verify(String url, String receipt) {
try {
HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection();
connection.setRequestMethod(“POST”);
connection.setDoOutput(true);
connection.setAllowUserInteraction(false);
PrintStream ps = new PrintStream(connection.getOutputStream());
ps.print(“{\”receipt-data\”: \”” + receipt + “\”}”);
ps.close();
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String str;
StringBuffer sb = new StringBuffer();
while ((str = br.readLine()) != null) {
sb.append(str);
}
br.close();
String resultStr = sb.toString();
JSONObject result = JSONObject.parseObject(resultStr);
if (result != null && result.getInteger(“status”) == 21007) { //递归,以防漏单
return verify(“https://sandbox.itunes.apple.com/verifyReceipt”, receipt);
}
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

使用HttpClient

`
public static JSONObject verify(String url, String receipt) {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
try {
JSONObject data = new JSONObject();
data.put(“receipt-data”, receipt);
StringEntity entity = new StringEntity(data.toJSONString());
entity.setContentEncoding(“utf-8”);
entity.setContentType(“application/json”);
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);
HttpEntity httpEntity = response.getEntity();
String resultStr = EntityUtils.toString(httpEntity);
JSONObject result = JSONObject.parseObject(resultStr);
httpPost.releaseConnection();
if (result.getInteger(“status”) == 21007) {
return verify(“https://sandbox.itunes.apple.com/verifyReceipt”, receipt);
}
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

返回值
`
{
“status”: 0,
“environment”: “Sandbox”,
“receipt”: {
“receipt_type”: “ProductionSandbox”,
“adam_id”: 0,
“app_item_id”: 0,
“bundle_id”: “com.platomix.MicroBusinessManage”,
“application_version”: “2.0.0”,
“download_id”: 0,
“version_external_identifier”: 0,
“receipt_creation_date”: “2017-06-06 06:35:27 Etc/GMT”,
“receipt_creation_date_ms”: “1496730927000”,
“receipt_creation_date_pst”: “2017-06-05 23:35:27 America/Los_Angeles”,
“request_date”: “2017-06-06 07:13:26 Etc/GMT”,
“request_date_ms”: “1496733206549”,
“request_date_pst”: “2017-06-06 00:13:26 America/Los_Angeles”,
“original_purchase_date”: “2013-08-01 07:00:00 Etc/GMT”,
“original_purchase_date_ms”: “1375340400000”,
“original_purchase_date_pst”: “2013-08-01 00:00:00 America/Los_Angeles”,
“original_application_version”: “1.0”,
“in_app”: []
}
}

后台通过判断返回的JSON传中status的值来判断支付成功

status状态:

0 支付成功
21000 App Store不能读取你提供的JSON对象
21002 receipt-data域的数据有问题
21003 receipt无法通过验证
21004 提供的shared secret不匹配你账号中的shared secret
21005 receipt服务器当前不可用
21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送
21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务
21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务

java苹果支付

苹果支付
苹果支付
前端从苹果拿到的数据大概是这样的
后台生成订单
回调
工具类
苹果支付
注:苹果支付和微信支付、支付宝支付流程不同,微信支付、支付宝支付需调用各自统一下单接口,再将得到的参数值返回给前端。苹果支付只是在后台生成订单(订单信息需包含订单编号,金额等),将订单返回给IOS客户端,客户端直接支付,再由客户端调后台接口处理支付完的业务逻辑,并不是由苹果公司来回调

前端从苹果拿到的数据大概是这样的

1 {
2     “status”: 0,
3     “environment”: “Production”,
4     “receipt”: {
5         “receipt_type”: “Production”,
6         “adam_id”: 2341443613,
7         “app_item_id”: 2234443613,
8         “bundle_id”: “com.xxxxx.xxxxx”,
9         “application_version”: “1”,
10         “download_id”: 23456572706673,
11         “version_external_ident ifier”: 821223402,
12         “receipt_creation_date”: “2017-01-25 00:52:37 Etc/GMT”,
13         “receipt_creation_date_ms”: “3333897657000”,
14         “receipt_creation_date_pst”: “2017-01-25 17:57:37 America/Los_Angeles”,
15         “request_date”: “2017-01-26 00:57:38 Etc/GMT”,
16         “request_date_ms”: “1445897657000”,
17         “request_date_pst”: “2017-05-29 17:57:38 America/Los_Angeles”,
18         “original_purchase_date”: “2016-01-25 15:37:18 Etc/GMT”,
19         “original_purchase_ date_ms”: “145234568000”,
20         “original_purchase_date_pst”: “2016-01-25 07:37:18 America/Los_Angeles”,
21         “original_application_version”: “12”,
22         “in_app”: [
23              {
24                  “quantity”: “1”,
25                  “product_id”: “xxxxxxxxx”,
26                  “transaction_id”: “110000290198443”,
27                  “original_transaction_id”: “110000290198443”,
28                  “purchase_date”: “2017-01-26 00:23:36 Etc/GMT”,
29                  “purchase_date_ms”: “1496105856000”,
30                  “purchase_date_pst”: “2017-01-26 00:35:30 America/Los_Angeles”,
31                  “original_purchase_date”: “2017-01-26 00:57:36 Etc/GMT”,
32                  “original_purchase_date_ms”: “14347896000”,
33                  “original_purchase_date_pst”: “2017-01-25 17:57:36 America/Los_Angeles”,
34                  “is_trial_period”: “false”
35              }
36          ]
37      }
38 }

后台生成订单

此处不贴代码,每个人的订单不一样

回调

/**
* 苹果支付回调(APP调用,不是苹果官方回调)
* @param transactionId
* @param payload
* @return
* @throws Exception
*/
@RequestMapping(value=”/applepay/order/notifyCallBack”)
@ResponseBody
public AppResponse<Object> applepayOrderNotifyCallBack(String transactionId, String payload) {
AppResponse<Object> appResponse = new AppResponse<>();
Map<String, Object> map = new HashMap<>();
logger.info(“苹果支付客户端传过来的值1:” + transactionId + “,客户端传过来的值2:” + payload);
try {
String verifyResult = IosVerifyUtil.buyAppVerify(payload, 1); //1.先线上测试 发送平台验证
if (verifyResult == null) { // 苹果服务器没有返回验证结果
logger.info(“无订单信息!”);

map.put(“result”, 2);
map.put(“message”, “无订单信息”);
appResponse.setData(map);
appResponse.setMsg(“无订单信息”);
appResponse.setStatus(AppResponseCode.SUCCESS);
} else { // 苹果验证有返回结果
logger.info(“线上,苹果平台返回JSON:” + verifyResult);
JSONObject job = JSONObject.parseObject(verifyResult);
String states = job.getString(“status”);

//0 正常
//21000 App Store不能读取你提供的JSON对象
//21002 receipt-data域的数据有问题
//21003 receipt无法通过验证
//21004 提供的shared secret不匹配你账号中的shared secret
//21005 receipt服务器当前不可用
//21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送
//21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务
//21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务
if(“21007”.equals(states)){ //是沙盒环境,应沙盒测试,否则执行下面
verifyResult = IosVerifyUtil.buyAppVerify(payload, 0); //2.再沙盒测试 发送平台验证
logger.info(“沙盒环境,苹果平台返回JSON:” + verifyResult);
job = JSONObject.parseObject(verifyResult);
states = job.getString(“status”);
}

logger.info(“苹果平台返回值:job” + job);
if (states.equals(“0”)){ // 前端所提供的收据是有效的 验证成功
String r_receipt = job.getString(“receipt”);
JSONObject returnJson = JSONObject.parseObject(r_receipt);
String in_app = returnJson.getString(“in_app”);
JSONObject in_appJson = JSONObject.parseObject(in_app.substring(1, in_app.length() – 1));

String product_id = in_appJson.getString(“product_id”);
String transaction_id = in_appJson.getString(“transaction_id”); // 订单号

/************************************************+自己的业务逻辑开始+**********************************************************/
//如果单号一致 则开始处理逻辑
if(transactionId.equals(transaction_id)){
String[] moneys = product_id.split(“\\.”);//实际支付金额
//此处开始业务逻辑
}
/************************************************+自己的业务逻辑结束+**********************************************************/

map.put(“result”, 1);
map.put(“message”, “操作成功!”);
} else {
map.put(“message”, “receipt数据有问题”);
map.put(“result”, 0);
}
appResponse.setData(map);
appResponse.setStatus(AppResponseCode.SUCCESS);
}
} catch (Exception e) {}
return appResponse;
}

工具类

package com.fengdi.lianmeng.util;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Locale;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class IosVerifyUtil {

private static class TrustAnyTrustManager implements X509TrustManager {

public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[] {};
}
}

private static class TrustAnyHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
return true;
}
}

private static final String url_sandbox = “https://sandbox.itunes.apple.com/verifyReceipt”;
private static final String url_verify = “https://buy.itunes.apple.com/verifyReceipt”;

/**
* 苹果服务器验证
*
* @param receipt
* 账单
* @url 要验证的地址
* @return null 或返回结果 沙盒 https://sandbox.itunes.apple.com/verifyReceipt
*
*/
public static String buyAppVerify(String receipt, int type) {
//环境判断 线上/开发环境用不同的请求链接
String url = “”;
if (type == 0) {
url = url_sandbox; //沙盒测试
} else {
url = url_verify; //线上测试
}
//String url = EnvUtils.isOnline() ?url_verify : url_sandbox;

try {
SSLContext sc = SSLContext.getInstance(“SSL”);
sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom());
URL console = new URL(url);
HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
conn.setSSLSocketFactory(sc.getSocketFactory());
conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
conn.setRequestMethod(“POST”);
conn.setRequestProperty(“content-type”, “text/json”);
conn.setRequestProperty(“Proxy-Connection”, “Keep-Alive”);
conn.setDoInput(true);
conn.setDoOutput(true);
BufferedOutputStream hurlBufOus = new BufferedOutputStream(conn.getOutputStream());

String str = String.format(Locale.CHINA, “{\”receipt-data\”:\”” + receipt + “\”}”);//拼成固定的格式传给平台
hurlBufOus.write(str.getBytes());
hurlBufOus.flush();

InputStream is = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = reader.readLine()) != null) {
sb.append(line);
}

return sb.toString();
} catch (Exception ex) {
System.out.println(“苹果服务器异常”);
ex.printStackTrace();
}
return null;
}

/**
* 用BASE64加密
* @param str
* @return
*/
public static String getBASE64(String str) {
byte[] b = str.getBytes();
String s = null;
if (b != null) {
s = new sun.misc.BASE64Encoder().encode(b);
}
return s;

iOS开发:城市选择器集成

一、简介
该项目集成了三种类型的城市选择器:

1、XXCityPickerView 省市区,可以分级:1省 2省-市 3省-市-区
2、SQSelectAddress 省市区乡/镇,页面跳转
3、RattanCityPicker 省市区,包含邮编地址,开放多个属性设置的接口
二、XXCityPickerView使用
1、从该项目导入【XXCityPickerView】文件包
2、 导入系统库 :libsqlite3.tbd
3、方法实现

1 #import “XXCityPickerView.h”
2
3 @interface ViewController ()<XXCityPickerViewDelegate>
4
5 @property(nonatomic,strong)XXCityPickerView *cityPicker;
6
7 @end
8
9 @implementation ViewController
10
11 – (void)viewDidLoad {
12     [super viewDidLoad];
13 }
14
15 ///方法调用
16 -(void)clickAction{
17     [self cityPicker];
18 }
19
20 – (XXCityPickerView *)cityPicker{
21     if (_cityPicker == nil){
22         // 初始化  设置类别   1省  2省-市  3省-市-区
23         _cityPicker = [[XXCityPickerView alloc]initWithComponents:3];
24         // 设置代理
25         _cityPicker.delegate = self;
26         [self.view addSubview:_cityPicker];
27     }
28     return  _cityPicker;
29 }

4、代理实现

1 // —- 【XXCityPickerViewDelegate】
2 // 取消
3 – (void)XXCityPickerViewLeftAction{
4     [self removeCityPickerView];
5 }
6 // 完成
7 – (void)XXCityPickerViewRightAction:(XXCityPickerView *)picker andCity:(NSString *)city andData:(NSMutableDictionary *)dic{
8     [self removeCityPickerView];
9     NSLog(@”������XXCityPickerView:\n city= %@   dic= %@”,city,dic);
10 }
11
12 -(void)removeCityPickerView{
13     if (_cityPicker) {
14         [_cityPicker removeFromSuperview];
15         _cityPicker = nil;
16     }
17 }

 

三、SQSelectAddress使用
1、导入【SQSelectAddress】文件包
2、调用【SQSelectAddressViewController.h】类
3、协议声明
@interface ViewController ()<SQSelectAddressViewControllerDelegate>
1
4、方法实现
pragma mark –
#pragma mark – SQSelectAddress
///页面添加
-(void)sqSelectAddressPockerView{
SQSelectAddressViewController *selectAddressVC = [[SQSelectAddressViewController alloc] init];
//签署协议
selectAddressVC.delegate = self;
selectAddressVC.animating = NO;
selectAddressVC.footerBg_color = [UIColor greenColor];
selectAddressVC.headerBg_color = [UIColor greenColor];
selectAddressVC.title_font = [UIFont systemFontOfSize:25];
selectAddressVC.titleText_color = [UIColor orangeColor];
[self presentViewController:selectAddressVC animated:YES completion:nil];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
5、代理协议实现
– (void)selectAddressViewController:(SQSelectAddressViewController *)selectController selectedDetailAdreess:(NSString *)address townCode:(NSString *)townCode{
NSLog(@”����SQSelectAddress:\n地址=%@ 编码=%@”,address,townCode);
}
1
2
3
四、RattanCityPicker使用
1、导入[RattanCityPicker]文件包
2、方法实现
#import “RattanCityPicker.h”

#pragma mark –
#pragma mark – RattanCityPicker

-(void)rattanCity{
RattanCityPicker *picker=[[RattanCityPicker alloc] init];
picker.animation_dur = 0.3;
picker.toolViewBg_color =[UIColor greenColor];
picker.componentFir_font = [UIFont systemFontOfSize:16];
picker.componentStrFir_color = [UIColor redColor];;
picker.componentBgFir_color = [UIColor lightGrayColor];
picker.selectLblStr_font = [UIFont systemFontOfSize:20];
picker.selectLblStr_color = [UIColor redColor];
//点击确定按钮代码块调用
picker.sureBtnBlock = ^(){

};
//获取选择的城市的信息
[picker cityPikerGetSelectCity:^(NSMutableDictionary *dicSelectCity) {
[self setTextLbl:dicSelectCity];
NSLog(@”����RattanCityPicker:\n%@”,dicSelectCity);
}];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速