# mallAPP **Repository Path**: mrhiro/mallAPP ## Basic Information - **Project Name**: mallAPP - **Description**: 基础版本 - **Primary Language**: Swift - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2019-09-04 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # H5 Demo框架项目 #### 介绍 iOS移动端APP开发说明文档 #### 软件架构 软件架构说明 1. 需要引用oc文件:请把相应的.h文件添加到HeaderFile文件夹中的**MajorHeader.h**来统一引入 2. oc不能继承swift类,反之可以 3. 所有swift写的controller文件都必须继承**BasicViewController** 4. 所有oc写的controller文件都必须继承**MyBasicViewController** #### 网络请求 服务器根地址修改在**NetAPIManager.swift**文件中如下代码: ~~~ //服务器根地址 #if DEBUG let HOSTURL = "http://beisile.ppepper.cn/" let HOSTWEBURL = "http://beisile.ppepper.cn/" // let HOSTURL = "http://b9s91.com/" // let HOSTWEBURL = "http://b9s91.com/" #else let HOSTURL = "http://b9s91.com/" let HOSTWEBURL = "http://b9s91.com/" #endif ~~~ 方法接口说明: 1. oc用法: ~~~ /// 统一网络请求接口 /// /// - Parameters: /// - name: 接口名称 /// - touch: true为允许用户继续操作页面 false禁止操作 /// - show: true为显示转圈圈 /// - titleString: 转圈圈的文字提示语 /// - postDict: post的参数 /// - success: 成功回调方法 /// - failure: 失败回调方法 [APIManage APIManageSendRequest:@"login/login/index" touch:true show:true titleString:@"加载中" postDict:@{@"username": @1,@"password": @1} success:^(NSDictionary * _Nullable response) { MyLog(@"成功回调 %@",response); if (response == nil || response == NULL) {//无数据返回 return ; } if ([response[@"status"] integerValue] == 0) {//成功错误返回 如入参错误,报错信息存在msg MyLog(@"成功错误回调 "); return; } if ([response[@"status"] integerValue] == 1) { //成功正常返回 MyLog(@"成功正常回调 "); return; } } failure:^(NSError * _Nonnull error) { MyLog(@"失败回调 %@",error); }]; ~~~ 2.swift用法: ~~~ /// 统一网络请求接口 /// /// - Parameters: /// - name: 接口名称 /// - touch: true为允许用户继续操作页面 false禁止操作 /// - show: true为显示转圈圈 /// - titleString: 转圈圈的文字提示语 /// - postDict: post的参数 /// - success: 成功回调方法 /// - failure: 失败回调方法 APIManage.APIManageSendRequest("login/login/index", touch: true, show: true, titleString: "加载中...", postDict: ["username": 1,"password": 1], success: { (response) in guard response != nil else { SVPHUDTool.showError(title: "登录失败") return } if let responseDict = response { guard responseDict["status"] as! Int == 1 else { //数据错误返回,有报错信息 去msg显示 SVPHUDTool.showError(title: responseDict["msg"] as? String ?? "登录失败") return } MyDDLog("正确返回数据 \(responseDict)") } }) { (error) in MyDDLog("首页数据失败了 、\(error)") } ~~~ #### H5与原生框架 ##### 原生框架 1. 使用WKWebView封装浏览器主控件,父类controller为**H5Webview文件夹**中的**H5WKWebViewController** 2. 用户登录的sessionId存在 Defaults[.sessionId]里面,现在的cookie形式是**JSESSIONID=XXXXX**,如需要js注入用户信息到cookie中,请看**H5WKWebViewController.swift**文件中47行代码,修改请方法**getJSCookiesString**里面的实现如下代码 ~~~ if let mySessionID = sessionId { JSESSIONID = "JSESSIONID=\(mySessionID)" } else { JSESSIONID = "JSESSIONID=" } ~~~ 3. 加载URL简单的controller使用方法 > 根目录H5页面初期化controller ~~~ let fourVC = BaseHomeViewController() fourVC.title = "个人中心" fourVC.myUrl = "https://www.baidu.com" fourVC.isHiddenProView = false ~~~ > 二级目录H5页面初期化controller ~~~ let homeView = H5WKWebViewController() homeView.title = "跳转中...." homeView.isBack = true homeView.myUrl = "https://www.baidu.com" ~~~ ##### H5框架 > 统一规定拦截协议:bridge > 统一交互规则:协议: + /模块名 + /方法名 + /占位符 + ?参数 ; 举个例子:bridge:/system/callback/pageInit?callback=uploadImage&user=lewis 既需要与原生交互时H5中的js文件location.href = "bridge:/native/video/pageInit"; > 统一js回调方法: callback(methed,jsonData){ } //*********** methed 为js中某个具体方法【需要跟前端APP人员规定,也可以通过统一交互规则中的参数里面的callback字段[callback=uploadImage]】, jsonData回调参数 格式为json字符串"{data:["第一个参数","第二个参数"]}",某个方法接收的参数需要多少个,需要告诉前端APP人员, ~~~ //js 文件中的写法 function callback(methed,jsonData){ // alert("hello"); if(methed == "uploadImage") { uploadImage(jsonData) } } //在具体的方法里面解析json数据 function uploadImage(jsonData){ alert(jsonData); } ~~~ ##### js与原生交互写法样列 **实现打开一个新H5页面** location.href = "bridge:/webview/open/pageInit?url=http://hs.gx10010.com/mobile/preOrd/orderInit?pageId=1005&source=app&fromApp=App"; ##### H5协议部分内容 > 分五个模块:native system base webview dialog > 解析出URL中的模块逻辑写在文件**URLRouterManage.swift**,每个模块都有自己独有的方法并有与之一一对应的文件 | 模块 | 参数格式 | 是否必须 | | ------------- | :----------: | :----: | | native | bridge:/native/api/pageInit?xxx=xxx | 是 | | system | bridge:/system/callphone/pageInit?xxx=xxx | 是 | | base | bridge:/base/login/pageInit?xxx=xxx | 是 | | webview | bridge:/webview/open/pageInit?xxx=xxx | 是 | | dialog | bridge:/dialog/show/pageInit?xxx=xxx | 是 | #### 特别说明 > 以下协议表中的方法中的**回调js方法**,必须要在js文件中写实现 - native 对应处理逻辑文件**NativeMethodManage.swift** | 方法 | 方法说明 | 必要参数字段 | 参数说明 | 回调js方法 | 回调参数说明 | 完整的例子 | | ------------- | :----------: | :---------------: | :----------: | :-----------: | :---------------: | :-----------: | | api | 调用原生网络请求POST方法 | url | 请求的地址(不带跟地址) | complete("ok","服务端返回的json数据") | ok 成功 fail 失败 | bridge:/native/api/pageInit?url=/api/order/my/getOrderList&userId=10086&callback=complete | | openFile | 查看doc,ppt,pdf等文件 | url | 文件的URL地址 | 无 | 无 | bridge:/native/openFile/pageInit?url=https://csmall.hisugar.com/web/listmoney.doc | | download | 下载doc,ppt,pdf等文件 | url | 文件的URL地址 | 无 | 无 | bridge:/native/download/pageInit?url=https://csmall.hisugar.com/api/order/my/money.pdf | | imageVC | 调用原生相册或者摄像头 | 无 | 无 | uploadImg("imgBase64数据") | 图片base64数据 | bridge:/native/imageVC/pageInit?xx=xxx | | scan | 调用原生扫一扫功能 | 无 | 无 | equipQRCode("二维码数据") | 字符串数据 | bridge:/native/scan/pageInit?url=xxxx | - system 对应处理逻辑文件**SystemMethodManage.swift** | 方法 | 方法说明 | 必要参数字段 | 参数说明 | 回调js方法 | 回调参数说明 | 完整的例子 | | ------------- | :----------: | :---------------: | :----------: | :-----------: | :---------------: | :-----------: | | call | 调用原生拨打电话 | tel | 电话号码 | 无 | 无 | bridge:/system/call/pageInit?tel=18577851417 | | setting | 进入iOS系统设置 | 无 | 无 | 无 | 无 | bridge:/system/setting/pageInit?xx=xxx | | Safari | 调起系统Safari浏览器 | url | 网页URL地址 | 无 | 无 | bridge:/system/Safari/pageInit?url=https://www.baidu.com | | sms | 调起发起短信 | sms | 手机号码 | 无) | 无 | bridge:/system/sms/pageInit?sms=18577851417 | - base 对应处理逻辑文件**BaseMethodManage.swift** 业务功能 后面扩充最多的一个模块,根据自己的业务需求来约定 | 方法 | 方法说明 | 必要参数字段 | 参数说明 | 回调js方法 | 回调参数说明 | 完整的例子 | | ------------- | :----------: | :---------------: | :----------: | :-----------: | :---------------: | :-----------: | | login0ut | 退出登录 | 无 | 无 | 无 | 无 | bridge:/base/login0ut/pageInit?userId=10086 | | relogin / login | 重新登录 | 无 | 无 | 无 | 无 | bridge:/base/relogin/pageInit?xxx=xxxx | | goHome | 关闭页面,回到首页 | 无 | 无 | 无 | 无 | bridge:/base/goHome/pageInit?xx=xxx | | goBack | 返回上一个页面 | 无 | 无 | 无 | 图片base64数据 | bridge:/base/goBack/pageInit?xx=xxx | | jumpRoot | 回退到根目录页面 | index | 0 首页 3个人中心 | 无 | 无 | bridge:/base/jumpRoot/pageInit?index=0 | - webview 对应处理逻辑文件**WebviewMethodManage.swift** | 方法 | 方法说明 | 必要参数字段 | 参数说明 | 回调js方法 | 回调参数说明 | 完整的例子 | | ------------- | :----------: | :---------------: | :----------: | :-----------: | :---------------: | :-----------: | | open | 打开新的页面 | url | 页面URL地址 | 无 | 无 | bridge:/webview/open/pageInit?url=https://csmall.hisugar.com/web/index.html | | reload | 重新加载当前浏览器页面 | 无 | 无 | 无 | 无 | bridge:/webview/reload/pageInit?xxx=xxxx | | close | 关闭当前浏览器页面 | 无 | 无 | 无 | 无 | bridge:/webview/close/pageInit?xxx=xxxx | | goBack | 当前浏览器回退上一个页面 | 无 | 无 | 无 | 无 | bridge:/webview/goBack/pageInit?xxx=xxxx | | goForward | 当前浏览器前往下一个页面 | 无 | 无 | 无 | 无 | bridge:/webview/goForward/pageInit?xxx=xxxx | - dialog 对应处理逻辑文件**DialogMethodManage.swift** | 方法 | 方法说明 | 必要参数字段 | 参数说明 | 回调js方法 | 回调参数说明 | 完整的例子 | | ------------- | :----------: | :---------------: | :----------: | :-----------: | :---------------: | :-----------: | | alert | 调用原生提示框 | msg | 提示信息 | 无 | 无 | bridge:/dialog/alert/pageInit?msg=你发财了 | | toast | 弹框提示 | msg | 提示信息 | 无 | 无 | bridge:/dialog/toast/pageInit?msg=你发财了 | | success | 成功提示信息 | msg | 提示信息 | 无 | 无 | bridge:/dialog/success/pageInit?msg=你发财了 | | error | 错误❌提示信息 | msg | 提示信息 | 无 | 无 | bridge:/dialog/error/pageInit?msg=你发错裁了 | | confirm | 二次确认提示 | msg | 提示信息 | confirm("ok") | ok 确认 fail 放弃 | bridge:/dialog/confirm/pageInit?msg=你d真的发财了?&callback=confirm | #### 使用说明 git 简单命令 1. 更新代码 git pull --rebase 2. 提交代码 git commit -m "提交的log说明" 3. 推送代码 git push