利用bmob平台,使用云端逻辑在Xcode上实现用户注册、登录
思路:bmob上构建云端逻辑,xcode通过http请求来在不引入bmob SDK的情况下,远程操作bmob上构建的数据库,实现注册、登录。
xcode导入
AFNetWorking-----------------网络请求,AFNetworking请求回的数据默认为nsdictionary,无需进一步转换
MBProgressHUD--------------------异步加载时的菊花显示
1.bmob云端逻辑构建
首先bmob注册,创建应用,拿到secretKey

云端逻辑的调用链接是:
http://cloud.bmob.cn/secretKey/functionName
云端逻辑的编写使用的js,没基础的可学下JS的基础用法,这里提一下
a.js数组创建 new Array()、动态添加arr.push(element)
b.字典是一种特殊的数组,通过key访问value,字典创建var dic = {"key":"value"}
c.调用response.send(obj)来返回云端函数处理的结果到xcode,以进一步处理
举个粒子:
function example(request,response,modules)
{
//客户端有参数上传,使用的post请求,request拿到相应参数
var curname = request.body.name;
var curPsd = request.body.password; //response将云端执行的结果返回SDK
respose.send(obj) modules提供各种对象处理的模块,如oData数据库对象、oFunctions云端逻辑对象
var db = modules.oData;
db.find(
{
"table":"tableName"
},functions(err,data)
{
});
}
具体的数据库操作,方法之间的调用,看bmob开发文档!

我这里创建了4个云端函数,多说无益,附上doLogin、registerUser的代码
function onRequest(request, response, modules) {
var functions = modules.oFunctions;
var nameArr = new Array();
var str = "";
functions.run({
"name":"getAllUserName"
},function(err,data){
//data为二进制流,转换一下
var jsonObj = JSON.parse(data);
// response.send(jsonObj);
for(var o in jsonObj){
var tmpstr = jsonObj[o];
if(tmpstr){
//非空字符串
nameArr.push(tmpstr);
}
}
// response.send(nameArr);
var curname = request.body.username;
var curpassword = request.body.password;
//设立boolean变量,0-false,1-true
var flag = 1;
//构建输出端口
var finalArr = {"code":"","msg":""};
for(var i in nameArr){
var tmpStr = nameArr[i];
// response.send(tmpStr);
if(tmpStr == curname){
flag = 0;
finalArr["code"] = "100";
finalArr["msg"] = "用户名已注册";
// response.send("用户名已注册!");
response.send(finalArr);
break;
}
}
if(flag){
var db = modules.oData;
finalArr["code"] = "200";
if(curname && curpassword){
db.insert({
"table":"TestUser",
"data":{"name":curname,"password":curpassword}
},function(err,data){
if(err){
// response.send(err);
finalArr["msg"] = err;
}else{
// response.send("注册成功");
finalArr["msg"] = "注册成功";
}
response.send(finalArr);
});
}
}
});
}
function onRequest(request, response, modules) {
var functions = modules.oFunctions;
var nameArr = new Array();
functions.run({
"name":"getAllUserName"
},function(err,data){
var jsonObj = JSON.parse(data);
for(var o in jsonObj){
var tmpstr = jsonObj[o];
if(tmpstr){
nameArr.push(tmpstr);
}
}
// response.send(nameArr);
var curname = request.body.username;
var curpassword = request.body.password;
var flag = 0;
//构建responseObj
var responseObj = {"code":"","msg":""};
for(var o in nameArr){
var tmpstr = nameArr[o];
if(curname == tmpstr){
flag = 1;
break;
}
}
if(flag == 0){
// response.send("用户名未注册!"
responseObj["code"] = "100";
responseObj["msg"] = "用户名未注册!";
response.send(responseObj);
}else{
var db = modules.oData;
db.find({
"table":"TestUser"
//单条数据必须使用objectID查询
// "name":curname
},function(err,data){
// response.send(data);
//遍历data,拿到相应name的password
var jsonObj = JSON.parse(data);
var arr = jsonObj["results"];
// var loginFlag = 0;
for(var o in arr){
var theName = arr[o].name;
if(theName == curname){
var thePassword = arr[o].password;
if(thePassword == curpassword){
// response.send("登录成功!");
responseObj["code"] = "200";
responseObj["msg"] = "登录成功!";
}else{
// response.send("密码错误!");
responseObj["code"] = "201";
responseObj["msg"] = "密码错误!";
}
response.send(responseObj);
break;
}
}
});
}
})
}
云端函数的调试有两种方式,一种直接浏览器上链接

另一种函数写完,直接测试(推荐),网页链接仅指向最近的一次正确提交,显示不了错误

Xcode发起请求,并拿回处理结果
1.afnetworking封装(不在赘述)
// AFNetWorkingHelper.m
// DateCorner
//
// Created by 小儿黑挖土 on 16/12/2.
// Copyright 2016年 小儿黑挖土. All rights reserved. #import "AFNetWorkingHelper.h" static AFNetWorkingHelper *_instance = nil; @interface AFNetWorkingHelper () @property (nonatomic,strong)AFHTTPSessionManager *manager; @end
@implementation AFNetWorkingHelper +(instancetype) defaultHelper{
static dispatch_once_t token;
dispatch_once(&token, ^{
_instance = [[super allocWithZone:NULL] init];
[_instance initialization];
});
return _instance;
}
//重写alloc,copy的调用方法,instanc只初始化一次,实现单例
+(id)allocWithZone:(struct _NSZone *)zone{
return [AFNetWorkingHelper defaultHelper];
}
-(id)copyWithZone:(struct _NSZone *)zone{
return [AFNetWorkingHelper defaultHelper];
}
#pragma mark HTTP
-(void)sendRequestWithURLString:(NSString *)urlString
parameters:(NSDictionary *)parameters
success:(void (^)(NSURLSessionDataTask *,id))success
failure:(void (^)(NSURLSessionDataTask *,NSError *))failure
cache:(BOOL)useCache{
// _manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// _manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
if(useCache){
_manager.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
}else{
_manager.requestSerializer.cachePolicy = NSURLRequestUseProtocolCachePolicy;
}
if(parameters != nil){//post
[_manager POST:urlString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
@try{
success(task,responseObject);
}@catch(NSException *exception){
NSLog(@"[%@] throws exception:%@",NSStringFromSelector(_cmd),exception);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
@try{
failure(task,error);
}@catch(NSException *exception){
NSLog(@"[%@] throws exception:%@",NSStringFromSelector(_cmd),exception);
}
}];
}else{//get
[_manager GET:urlString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
@try{
success(task,responseObject);
}@catch(NSException *exception){
NSLog(@"[%@] throws exception:%@",NSStringFromSelector(_cmd),exception);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
@try{
failure(task,error);
}@catch(NSException *exception){
NSLog(@"[%@] throws exception:%@",NSStringFromSelector(_cmd),exception);
}
}];
}
}
-(void)sendRequestWithURLString:(NSString *)urlString
parameters:(NSDictionary *)parameters
success:(void (^)(NSURLSessionDataTask *,id))success
failure:(void (^)(NSURLSessionDataTask *,NSError *))failure{
[self sendRequestWithURLString:urlString parameters:parameters success:success failure:failure cache:NO];
}
-(void)sendRequestWithURLString:(NSString *)urlString
success:(void (^)(NSURLSessionDataTask *,id))success
failure:(void (^)(NSURLSessionDataTask *,NSError *))failure
cache:(BOOL)useCache{
[self sendRequestWithURLString:urlString parameters:nil success:success failure:failure cache:useCache];
}
-(void)sendRequestWithURLString:(NSString *)urlString
success:(void (^)(NSURLSessionDataTask *,id))success
failure:(void (^)(NSURLSessionDataTask *,NSError *))failure{
[self sendRequestWithURLString:urlString parameters:nil success:success failure:failure cache:NO];
}
-(void)uploadWithURLString:(NSString *)urlString
data:(NSData *)data
success:(void (^)(NSURLResponse *,id))success
failure:(void (^)(NSURLResponse *,NSError *))failure{
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request addValue:@"b21fbd9b0ce4879dc618f6f685c223e0" forHTTPHeaderField:@"X-Bmob-Application-Id"];
[request addValue:@"8f397fe28f5e02d316d9af109b3fcdc9" forHTTPHeaderField:@"X-Bmob-REST-API-Key"];
[request addValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:data];
[request setHTTPMethod:@"POST"]; NSURLSessionDataTask *task = [_manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
@try{
if(error != nil){
/*error NSError * domain: @"com.alamofire.error.serialization.response" - code: 18446744073709550605 0x0000600000440a50*/
failure(response,error);
}else{
success(response,responseObject);
}
}@catch(NSException *exception){
NSLog(@"throw exception:%@",exception);
}
}];
[task resume];
}
#pragma mark private
-(void)initialization{
self.manager = [AFHTTPSessionManager manager];
}
@end
2.封装参数,post请求
-(void)uploadPara{
NSString *username = _usernameField.text;
NSString *password = _passwordField.text;
NSDictionary *para = @{@"username":username,@"password":password};
AFNetWorkingHelper *helper = [AFNetWorkingHelper defaultHelper];
[helper sendRequestWithURLString:KURLTypeRegister parameters:para success:^(NSURLSessionDataTask *task, NSDictionary *jsonObj) {
[self successWithTask:task response:jsonObj];
} failure:^(NSURLSessionDataTask *task, NSError *error) {
[self failureWithTask:task error:error];
}];
}
3.拿回结果,进行相应的逻辑处理
//登录状态
-(void)successWithTask:(NSURLSessionTask *)task response:(NSDictionary *)data{
if(data){
//hud显示在异步网络请求前,消失在数据回传之后
[hud hideAnimated:YES];
NSString *msg = data[@"msg"];
NSInteger code = [data[@"code"] integerValue];
[self tipsAniamtion:msg];
if(code == 200){
[self performSelector:@selector(doDismiss) withObject:nil afterDelay:3];
}
}
} -(void)failureWithTask:(NSURLSessionTask *)task error:(NSError *)error{
// NSLog(@"register with error:%@",error.localizedDescription);
// [self tipsAniamtion:error.localizedDescription];
}
项目效果如下:
源项目地址:https://github.com/xuanyuelin/BmobRegister/tree/master
有兴趣的伙伴,可以留言相互讨论!
利用bmob平台,使用云端逻辑在Xcode上实现用户注册、登录的更多相关文章
- 不同WINDOWS平台下磁盘逻辑扇区的直接读写
不同WINDOWS平台下磁盘逻辑扇区的直接读写 关键字:VWIN32.中断.DeviceIoControl 一.概述 在DOS操作系统下,通过BIOS的INT13.DOS的INT25(绝对读).INT ...
- Android 基于Bmob平台数据管理常用方法整理
最近想搞一下基于Bmob平台的应用开发,发现确实挺方便的,很好的解决了服务器后台部署的难题, 但是也有一些弊端,数据架构的可扩展性不强,做一些数据结构简单的应用还是可以的. package com.b ...
- Trufun云端建模平台之云端UML工具发布
Trufun云端建模平台包括云端UML工具,云端BPMN工具,云端思维导图工具. 云端UML工具是目前最先进的基于HTML5的UML2.x建模工具,所有代码基于JAVA开发,支持类图.用例图.活动图. ...
- Bmob实现android云端存储
代码地址如下:http://www.demodashi.com/demo/12547.html 前言 一直很困惑,android到底能不能将本地数据传到一个公共的云端,让云端实现数据库功能,这样的话, ...
- 利用Ambari平台安装与部署Hadoop
* 本篇是利用Ambari平台安装与部署Hadoop,如果需要原生部署Hadoop,请点击以下地址: https://www.cnblogs.com/live41/p/15467263.html 一. ...
- 第三百九十节,Django+Xadmin打造上线标准的在线教育平台—Django+cropper插件头像裁剪上传
第三百九十节,Django+Xadmin打造上线标准的在线教育平台—Django+cropper插件头像裁剪上传 实现原理 前台用cropper插件,将用户上传头像时裁剪图片的坐标和图片,传到逻辑处理 ...
- 在xcode上搭建OpenGL3.x运行环境
最近开始学习OpenGL,网上的教程太散乱,于是打算照着红宝书<OpenGL编程指南(第七版)>来学习. 于是在Mac上搭建一下Demo环境.比较方便的是,OS X上已经装了OpenGL ...
- 1个多商户、多平台版 微信小程序(多商户、多平台版),影城行业、影业连锁 多商户、多平台版微信小程序。(基于多平台版,支持在业务上 可给 每个单独影城 分发定制单独的小程序版本)
1个 影城行业 微信小程序(多商户.多平台版), 影业连锁 多商户.多平台版微信小程序.(基于多平台版,支持在业务上 可给 每个单独影城 分发定制单独的小程序版本) 资讯QQ: 876635409 ...
- 提高在Xcode上的工作效率
对于在Xcode上提高工作效率,内功在这不提,对于外力,我将它分为三类: 工具.快捷键和小技巧.主要获得的路径是通过平时积累和看 WWDC12 上的 Session 402:Working Effic ...
随机推荐
- WPF 2D图形 Shape入门(一)--Shape
本文是篇WPF Shape的入门文章 Shape 首先看看shape的继承链关系: 一个Shape具有哪些重要属性: 属性 说明 DefiningGeometry 默认的几何形状 RenderedGe ...
- .NET6系列:Visual Studio 2022 线路图
系列目录 [已更新最新开发文章,点击查看详细] 在上一篇博客<Visual Studio 2022>中介绍了VS2022的性能改进与重要功能.本文主要介绍在 Visual Stud ...
- 写Bug时,需要注意的几点 02
重构2-重新组织函数 重构的基本技巧--小步前进,频繁测试. 模式是你希望到达的目标,重构则是到达之路. 在单进程软件中,你永远不必操心多么频繁地调用某个函数,因为函数的调用成本很低.但在分布式软件中 ...
- PTH的几种食用姿势
PTH PTH(pass the hash)也叫做hash传递.在内网渗透中是一种很经典的攻击方式,原理就是攻击者可以直接通过NTLM Hash(mimikatz或其他手段抓取到的密码hash)访问远 ...
- GO学习-(17) Go语言基础之反射
Go语言基础之反射 本文介绍了Go语言反射的意义和基本使用. 变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指 ...
- Fiddler抓包后转成jmeter脚本
Fiddler的安装及使用 1.安装:无特别需要注意事项 2.使用: (1)目前我使用的是Fiddler 4版本,打开页面如下 (2)如下图,在界面右侧找到Filters tabs,根据需要进行设置, ...
- JVM-栈帧之局部变量表
1.栈帧的内部结构 每个栈帧中存储着: 局部变量表(Local Variables) 操作数栈(Operand Stack)(或表达式栈) 动态链接(Dynamic Linking)(或指向运行时常量 ...
- 激光SLAM与视觉SLAM的特点
激光SLAM与视觉SLAM的特点 目前,SLAM技术被广泛运用于机器人.无人机.无人驾驶.AR.VR等领域,依靠传感器可实现机器的自主定位.建图.路径规划等功能.由于传感器不同,SLAM的实现方式也有 ...
- 卷积神经网络(CNN,ConvNet)
卷积神经网络(CNN,ConvNet) 卷积神经网络(CNN,有时被称为 ConvNet)是很吸引人的.在短时间内,变成了一种颠覆性的技术,打破了从文本.视频到语音等多个领域所有最先进的算法,远远超出 ...
- Tensor Core技术解析(上)
Tensor Core技术解析(上) NVIDIA在SIGGRAPH 2018上正式发布了新一代GPU架构--Turing(图灵),黄仁勋称Turing架构是自2006年CUDA GPU发明以来最大的 ...