• 利用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 

    有兴趣的伙伴,可以留言相互讨论!

  • 相关阅读:
    浅析Vue3相关基础知识:Vue3应用配置、重写的vmodel、emits 选项、getCurrentInstance()获取实例、采用mitt实现全局通讯、vuerouter的新特性
    Vue3结合TS项目开发实践:Composition API的风格理念、关注点分离、如何组织TS进行项目开发(采用声明文件来管理接口及所需类型/目录结构推荐)
    TypeScript类型守卫、联合类型、交叉类型
    Android开发历程_14(广播机制)
    OpenGL_Qt学习笔记之_03(平面图形的着色和旋转)
    OpenGL_Qt学习笔记之_06(纹理滤波、光照和色彩融合)
    Qt学习之路_12(简易数据管理系统)
    特征点检测学习_2(surf算法)
    Kinect+OpenNI学习笔记之2(获取kinect的颜色图像和深度图像)
    PCA算法学习_1(OpenCV中PCA实现人脸降维)
  • 原文地址:https://www.cnblogs.com/xiaoerheiwatu/p/6690506.html
Copyright © 2020-2023  润新知