曾志,欧阳承
(惠州学院信息科学技术学院,惠州 516007)
随着我国经济崛起以及与国际交流日益频繁,人们对物资与信息流通产生了更大、更多元化、更个性化的需求,快递服务迎来了飞速的发展,形成了国际、国内与同城三种模式[1]。同城快递是快递企业为处在同一城市不同辖区的发件人和收件人所进行的快件收发活动,是国际快递和国内异地快递的有力补充。其重点是“同城”,因此更突出配送效率和个性化服务。在当前同城共同配送体系不健全的环境下,同城快递主要抓住了用户对“末端快递配送”的服务需求点:时效性强、个性化明显、安全性高和服务灵活。可以大大节省收发快递的时间,凸显了App带来的成本与效率的双重增长。与一般的快递App不同[2-4],首先,同城快递iOS-App使用范围为同一城市,避免了同一城市快递分拣而导致隔日递送的缺点,使得快递在数小时内完成送达;其次,吸引大众参与模式,所有经过审核认证的人员,均可以参与到派送快件这项工作中来,举手之劳创造价值。对于参与派件的人员,提出采纳支付保证金的方法,同时对发送的物品进行前后拍照比较认证的方法确保快递物品的安全。一旦完成交易,系统将自动将费用转入派送员账户。综上,同城快递iOSApp系统将快递物流与移动电子商务更加紧密地结合,一方面在于加速物品在同城范围内的递送,同时也为大众的参与提供了平台,解决了“最后一公里”高效快速的快件递送问题。
“互联网+”利用信息通信技术与各行业的深度融合,为经济社会的创新发展提供了便捷、高效的解决方案。基于App的移动计算技术正在成为实现“互联网+”创造新业务与新服务模式的基础。同城快递App采用目前较为新近的技术框架,分析各业务流程(如图1所示),完善和添加有利于用户体验的模块,从技术上以及产品上均有一定的创新。
图1 同城快递App系统的业务流程
从系统架构可知,同城快递iOS-App系统是一款双App系统,包括用户端与快递员派送端两部分。系统iOS客户端使用Apple官方IDE Xcode,以及苹果最稳定的Objective-C编程语言进行代码编写,并用iOS数据格式Plist,NSUserdefault单例进行数据归档,使用AFNetworking与服务器端进行数据交互。整个项目采用了MVVM架构,很好地解决Massive View Controller的问题。在该项目中将Controller中的展示逻辑抽取出来,放置到ViewModel。MVVM衍生于MVC,是对MVC的一种演进,它促进了UI代码与业务逻辑的分离。它正式规范了视图和控制器紧耦合的性质,并引入新的组件。各组件间的结构关系如图2所示。
其次,整个项目图片都采用异步加载保证界面流畅度,在图片呈现前显示占位图,当图片加载后再予以替换占位图,加载后的图片采用缓存机制,亦或多级缓存机制,用以提升客户端界面的流畅度。此外,界面组件还采用了预排版技术,将每条Cell需要的数据都在后台线程计算并封装为一个布局对象CellLayout,避免Cell内部的重计算,增加了UITableView列表的加载速度,增加了用户体验。最后,项目实践过程采用了全局并发控制技术,App内所有异步操作,包括图像解码、对象释放、异步绘制等,均已按优先级放入了全局的serial queue中执行,从而避免了过多线程影响计算性能的问题。
依据同城快递App系统业务流程,用户App前端模块共包含7大模块,而快递员派送端App主要包含接单模块。用户App端的几大模块描述见图3所示。用户首先是注册、认证与个人信息的完善,接着就是下单、支付、查询与评价;而快递员端App主要有接/抢单、派送、签收几大功能。以下为iOS-App端所涉及的下单、接单、查询与支付几大模块的实现。
图3 iOS-App用户端功能模块
在用户注册并经过认证后,用户就具有发货位置,物品信息,包括物品照片,订单发布时间,联系方式等。用户在手机端完成订单的填写,将数据打包成JSON格式传递到后台处理,代码实现如下:
//用户下单模块
- (void)completeInputInfomationWithJSON:(NSDictionary *)json{
AFHTTPSessionManager*manager=[AFHTTPSession⁃Manager manager];
图2 iOS-App系统架构体系
//申明请求的数据是json类型
manager.requestSerializer=[AFJSONRequestSerializer se⁃rializer];
manager.responseSerializer=[AFHTTPResponseSerializer serializer];
manager.requestSerializer.timeoutInterval=10;
manager.responseSerializer.acceptableContentTypes=[NS⁃Set setWithObjects:@"text/plain", @"multipart/form- data",@"application/json",@"text/html",@"image/jpeg",@"image/png",@"application/octet-stream",@"text/json",nil];
NSString*createNewOrderurl=[NSString stringWithFor⁃mat:@"% @/Express/order/Order_createOrder.action", server⁃URL];
[manager POST:createNewOrderurl parameters:json con⁃structingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData){
//formData:专门用于拼接需要上传的数据,在此位置生成一个要上传的数据体
for(int i=0;i<self.imagesM.count;i++){
UIImage*image=self.imagesM[i];
NSData*imageData=UIImageJPEGRepresen⁃tation(image,0.5);
//使用当前的系统事件作为文件名
NSDateFormatter*formatter=[[NSDateFormat⁃ter alloc]init];
//设置时间格式
[formatter setDateFormat:@"yyyyMMddHHmmss"];
NSString*dateString=[formatter stringFrom⁃Date:[NSDate date]];
NSString*fileName=[NSString stringWithFor⁃mat:@"%@.jpg",dateString];
[formData appendPartWithFileData:imageData name:@"upload"fileName:fileName mimeType:@"image/jpeg"];///jpg/png
}
}
}
快递员派送端可以在App完成订单的查询、接单与派送的过程。其中接单也被认为是抢单,系统完成手机端数据的拼接,并通过序列化的方式对数据完成传输操作,代码略。
支付主要实现钱包的功能,包括支付宝、微信和银行卡的支付与提现。根据用户ID列出订单的明细列表,而后提交后台进行支付相关的处理。代码实现如下:
//支付模块
-(void)walletInstruction{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"说明"message:@" 1、余额可提现至支付宝、微信和银行卡(银联)等平台。 2、提交提现申请后,需要2~3个工作日到账。 3、提现或充值后,如遇到金额长时间没有到账,请及时联系客服。"preferredStyle:UI⁃AlertControllerStyleAlert];
UIAlertAction*canelAction=[UIAlertAction actionWith⁃Title:@"知道了"style:UIAlertActionStyleDefault handler:nil];UIAlertAction*callAction=[UIAlertAction actionWithTitle:@"联系客服"style:UIAlertActionStyleDefault handler:^(UIAlertAc⁃tion*_Nonnull action){
//通过UIWebView实现
UIWebView*phoneWV=[[UIWebView alloc]init⁃WithFrame:CGRectZero];
[self.view addSubview:phoneWV];
//读入电话号码
NSString *urlStr= [NSString stringWithFormat:@"tel:%@",@"0752-8884788"];
NSURL*url=[NSURL URLWithString:urlStr];
NSURLRequest*request=[NSURLRequest request⁃WithURL:url];
//加载请求
[phoneWV loadRequest:request];
}];
[alertController addAction:canelAction];
[alertController addAction:callAction];
[self presentViewController:alertController animated:YES completion:nil];
}
//请求账户明细数据
-(void)requestDataFromServer{
//请求的参数
NSUserDefaults*userDefaults=[NSUserDefaults standar⁃dUserDefaults];
NSString*userID=[[userDefaults objectForKey:@"userIn⁃formation"]objectForKey:@"userID"];
NSDictionary*dic=[NSDictionary dictionaryWithObject⁃sAndKeys:@“0”,@“first”,userID,@“userId”,nil];
NSString*uploadAddressUrl=[NSString stringWithFor⁃mat:@"%@%@",serverURL,@"/Express/user/User_findEx⁃pense.action"];
AFHTTPSessionManager*manager=[AFHTTPSession⁃Manager manager];
manager.responseSerializer=[AFHTTPResponseSerializer serializer];
[managerPOST:uploadAddressUrlparameters:dic con⁃structingBodyWithBlock:^(id_Nonnull formData){
//拼接data到请求体
}progress:^(NSProgress*_Nonnull uploadProgress){[SVProgressHUD show];
[SVProgressHUD setDefaultStyle:SVProgressHUDStyle⁃Dark];
} success:^(NSURLSessionDataTask * _Nonnull task, id_Nullable responseObject){
……
}failure:^(NSURLSessionDataTask*_Nullable task,NSError*_Nonnull error){
……
}
后台管理系统实现了用户认证管理、下单、接单、查询、支付以及评价管理等,其中查询模块调用了百度地图API实现[5]。后台数据管理页面效果如图4所示。
图4 iOS-App后台管理系统功能示例
手机App端各页面效果展示如图5所示。
图5 iOS-App手机端页面效果示例
使用Instruments进行内存测试,根据需求分析的要求重复测试3次以上,Instruments并没有发出警报,在测试的过程中并没有发生内存暴涨的情况。综上,软件并没有明显的内存泄漏,不影响功能和使用,符合需求分析的要求。Instruments内存泄漏测试如图6所示。
图6 iOS-App内测效果
综上,同城快递App系统将快递物流与同城内的移动电子商务更加紧密地结合,属于C2C模式的一种实现。一方面在于加速物品同城快递的递送,同时为大众参与提供了平台,解决了“最后一公里”高效快速的快件递送问题。