前言:

各位同学大家好 ,有一段时间没有见面了。 具体多久我也不清楚了, 最近在学习iOS 手游sdk 的开发 所以就想着写完 写一份教程分享给大家, 本人之前一直都是做安卓开发的 安卓 app和安卓手游SDK 开的都会。

需要用到的三方库

     pod 'AFNetworking'pod 'SDWebImage','4.0.0'pod 'WHToast','~>0.1.0'

效果图

主要实现逻辑 手游SDK

初始化        init.
登录            login
支付            pay.
区服登录    servicelogin.
等级变化上报   updateuserinfo

接口设计

//
//  NineFunSdk.h
//  016登录界面
//
//  Created by xuqing on 2022/4/26.
//#import <Foundation/Foundation.h>
#import <UIkit/UIkit.h>
#import "RoleInfo.h"
#import "ServiceInfo.h"
NS_ASSUME_NONNULL_BEGINtypedef void (^LoginFinishBlock)(BOOL success, id data);typedef void (^InitFinishBlock)(BOOL success, NSString * data);
typedef void (^PayFinishBlock)(BOOL success, NSString * data);typedef void (^ServiceBlock)(BOOL success);typedef void (^UpdateUserInfoBlcok)(BOOL success);@interface NineFunSdk : NSObject+ (void)viewcontroller:(UIViewController *)controller sdkCheckLogin:(LoginFinishBlock)finishBlock;+ (void)initSdk:(InitFinishBlock)finishBlock;+ (void)pay:(PayFinishBlock)finishBlock;+ (void)serviceinfo:(ServiceInfo*)getserviceinfo  serviceLogin:(ServiceBlock)finishBlock;+ (void)roleinfo:(RoleInfo*)getroleinfo updateUserInfo:(UpdateUserInfoBlcok)finishBlock;@endNS_ASSUME_NONNULL_END

我们定义这些对外方法 当然你也可以写成类方法 然后写个单例 去掉也行 我这边方便就用 + 然后每个方法我们定义了 block回调 这个看具体需求 因为参考了安卓了那边写法 每个对外接口都给回调 我就都给加了

具体接口的实现

//
//  NineFunSdk.m
//
//  Created by xuqing on 2022/4/26.
//#import "NineFunSdk.h"
#import "ViewController.h"
#import  <AFNetworking.h>
#import "NSString+Encrypt.h"
#import "RoleInfo.h"
#import "ServiceInfo.h"
#import "Md5Utils.h"@implementation NineFunSdk// 登录接口
+ (void)viewcontroller:(UIViewController *)controller sdkCheckLogin:(LoginFinishBlock)finishBlock{ViewController * viewController= [[ViewController alloc]init];viewController.logBlock = finishBlock;[controller presentViewController:viewController animated:YES completion:nil];
}// 初始化接口
+ (void)initSdk:(InitFinishBlock)finishBlock{}//支付接口
+ (void)pay:(PayFinishBlock)finishBlock{}// 区服登录接口
+ (void)serviceinfo:(ServiceInfo*)getserviceinfo  serviceLogin:(ServiceBlock)finishBlock{NSLog(@"区服登录");NSString * sign = [NSString stringWithFormat:@"sid=%@role_id=%@role_anme=%@||0a649d6b-df9f-4583-bf7d-3fae84838519",getserviceinfo->_sid,getserviceinfo->_roleid,getserviceinfo->_rolename];NSLog(@" sign %@", sign);// NSString * getsign=[sign MD5];NSString * getsign=[Md5Utils getMd5_32Bit_String:sign isUppercase:NO];NSString * serviceLoginUrl=@"http://192.168.7.25:8090/boss/serviceinfo/servicelogin?";NSMutableString *geturl = [NSMutableString string];[geturl appendString:serviceLoginUrl];[geturl appendString:@"gid="];[geturl appendString:getserviceinfo->_gid];[geturl appendString:@"&"];[geturl appendString:@"sid="];[geturl appendString:getserviceinfo->_sid];[geturl appendString:@"&"];[geturl appendString:@"role_name="];[geturl appendString:getserviceinfo->_rolename];[geturl appendString:@"&"];[geturl appendString:@"role_level="];[geturl appendString:getserviceinfo->_rolelevel];[geturl appendString:@"&"];[geturl appendString:@"role_id="];[geturl appendString:getserviceinfo->_roleid];[geturl appendString:@"&"];[geturl appendString:@"sign="];[geturl appendString:getsign];NSString *url = [geturl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];//    NSLog(@"geturl --- %@",geturl);[[AFHTTPSessionManager manager]GET:url parameters:nil headers:nil progress:^(NSProgress * _Nonnull downloadProgress) {NSLog(@"");} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {NSLog(@"");NSLog(@"请求成功---%@",responseObject);NSLog(@"请求 msg ---%@",[responseObject objectForKey:(@"msg")]);finishBlock(YES);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"");}];};//等级变化上报接口
+ (void)roleinfo:(RoleInfo*)getroleinfo updateUserInfo:(UpdateUserInfoBlcok)finishBlock{NSLog(@"等级变化上报");NSString * sign = [NSString stringWithFormat:@"sid=%@role_id=%@role_anme=%@||0a649d6b-df9f-4583-bf7d-3fae84838519",getroleinfo->_sid,getroleinfo->_roleid,getroleinfo->_rolename];NSLog(@" sign %@", sign);// NSString * getsign=[sign MD5];NSString * getsign=[Md5Utils getMd5_32Bit_String:sign isUppercase:NO];NSLog(@"  getsign %@", getsign);NSString * serviceLoginUrl=@"http://192.168.7.25:8090/boss/roleinfo/submitroleinfo?";NSMutableString *geturl = [NSMutableString string];[geturl appendString:serviceLoginUrl];[geturl appendString:@"gid="];[geturl appendString:getroleinfo->_gid];[geturl appendString:@"&"];[geturl appendString:@"sid="];[geturl appendString:getroleinfo->_sid];[geturl appendString:@"&"];[geturl appendString:@"role_name="];[geturl appendString:getroleinfo->_rolename];[geturl appendString:@"&"];[geturl appendString:@"role_level="];[geturl appendString:getroleinfo->_rolelevel];[geturl appendString:@"&"];[geturl appendString:@"role_id="];[geturl appendString:getroleinfo->_roleid];[geturl appendString:@"&"];[geturl appendString:@"sign="];[geturl appendString:getsign];NSString *url = [geturl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];//    NSLog(@"geturl --- %@",geturl);[[AFHTTPSessionManager manager]GET:url parameters:nil headers:nil progress:^(NSProgress * _Nonnull downloadProgress) {NSLog(@"");} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {NSLog(@"");NSLog(@"请求成功---%@",responseObject);NSLog(@"请求 msg ---%@",[responseObject objectForKey:(@"msg")]);finishBlock(YES);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"");}];}
@end

因为时间问题 我这边制作了 login 和servicelogin. updateuserinfo 这几个接口的实现

登录接口

// 登录接口
+ (void)viewcontroller:(UIViewController *)controller sdkCheckLogin:(LoginFinishBlock)finishBlock{ViewController * viewController= [[ViewController alloc]init];viewController.logBlock = finishBlock;[controller presentViewController:viewController animated:YES completion:nil];
}

登录接口我们需要传入 UIViewController 实例和 实现LoginFinishBlock 回调

登录界面逻辑

  • m 文件

//
//  ViewController.h
//  016登录界面
//
//  Created by xuqing on 2021/7/27.
//#import <UIKit/UIKit.h>@interface ViewController : UIViewController{//登录界面的组成UILabel *_usernameLabel;UILabel * _passwordLabel;UITextField *_userTextfield;UITextField *_passwordfield;UIButton * _loginBtn;UIButton * _registerBtn;}
@property(retain,nonatomic)UILabel * usernameLabel;
@property(retain,nonatomic)UILabel * pswLabel;
@property(retain,nonatomic)UITextField * userTextfield;
@property(retain,nonatomic)UITextField * pswfield;
@property(retain,nonatomic)UIButton * loginBtn ;
@property(retain, nonatomic)UIButton * registerBtn;
@property (nonatomic,copy)void(^logBlock)(BOOL success, id data);
@end
  • h 文件

//
//  ViewController.m
//  016登录界面
//
//  Created by xuqing on 2021/7/27.
#import "ViewController.h"
#import "RegisterController.h"
#import  <AFNetworking.h>
#import <WHToast.h>
#import "TextUtils.h"
@interface ViewController ()
@end@implementation ViewController
@synthesize usernameLabel=_usernameLabel;
@synthesize pswLabel=_passwordLabel;
@synthesize userTextfield=_userTextfield;
@synthesize pswfield=_passwordfield;
@synthesize loginBtn=_loginBtn;
@synthesize registerBtn=_registerBtn;- (void)viewDidLoad {[super viewDidLoad];_usernameLabel =[[UILabel alloc]init];_usernameLabel.frame=CGRectMake(60, 100, 60, 40);_usernameLabel.text=@"账号:";_usernameLabel.textColor=[UIColor blueColor];[self.view addSubview:_usernameLabel];_userTextfield =[[UITextField alloc] init];_userTextfield.frame=CGRectMake(100, 100,180, 40);_userTextfield.font= [UIFont systemFontOfSize:15];// 设置字体颜色_userTextfield.textColor=[UIColor blackColor];//设置边框的风格// UITextBorderStyleBezel bezel线框// UITextBorderStyleRoundedRect 圆角风格// UITextBorderStyleLine 线框风格// UITextBorderStyleNone  无边框风格_userTextfield.borderStyle= UITextBorderStyleRoundedRect;//设置虚拟键盘风格//UIKeyboardTypeDefault 默认风格//UIKeyboardTypeNumberPad 纯数字风格//UIKeyboardTypeNamePhonePad 字母和数字组合风格_userTextfield.keyboardType=UIKeyboardTypeNamePhonePad;_userTextfield.placeholder=@"请输入用户名...";//是否作为密码输入//YES 做为处理 圆点加密//NO: 正常显示输入的文字_userTextfield.secureTextEntry= NO;[self.view addSubview:  _userTextfield];_passwordLabel =[[UILabel alloc]init];_passwordLabel.frame=CGRectMake(60, 150, 60, 40);_passwordLabel.text=@"密码:";_passwordLabel.textColor=[UIColor blueColor];[self.view addSubview:_passwordLabel];_passwordfield =[[UITextField alloc] init];_passwordfield.frame=CGRectMake(100, 150,180, 40);_passwordfield.font= [UIFont systemFontOfSize:15];// 设置字体颜色_passwordfield.textColor=[UIColor blackColor];//设置边框的风格// UITextBorderStyleBezel bezel线框// UITextBorderStyleRoundedRect 圆角风格// UITextBorderStyleLine 线框风格// UITextBorderStyleNone  无边框风格_passwordfield.borderStyle= UITextBorderStyleRoundedRect;//设置虚拟键盘风格//UIKeyboardTypeDefault 默认风格//UIKeyboardTypeNumberPad 纯数字风格//UIKeyboardTypeNamePhonePad 字母和数字组合风格_passwordfield.keyboardType=UIKeyboardTypeNamePhonePad;_passwordfield.placeholder=@"请输入密码...";//是否作为密码输入//YES 做为处理 圆点加密//NO: 正常显示输入的文字_passwordfield.secureTextEntry= YES;[self.view addSubview:  _passwordfield];_loginBtn=[UIButton buttonWithType: UIButtonTypeRoundedRect];_loginBtn.frame=CGRectMake(80, 220, 80, 40);[_loginBtn setTitle:@"登录" forState:UIControlStateNormal];[_loginBtn addTarget:self action:@selector(login) forControlEvents:UIControlEventTouchUpInside];_loginBtn.backgroundColor=[UIColor blueColor];[_loginBtn setTitleColor: [UIColor whiteColor ] forState:UIControlStateNormal] ;//设置按钮颜色[_loginBtn setTitleColor: [UIColor grayColor] forState:UIControlStateHighlighted] ;[self.view addSubview:_loginBtn];_registerBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect];_registerBtn.frame=CGRectMake(180, 220, 80, 40);[_registerBtn setTitle:@"注册" forState:UIControlStateNormal];[_registerBtn addTarget:self action:@selector(registerMethod) forControlEvents:UIControlEventTouchUpInside];_registerBtn.backgroundColor=[UIColor blueColor];[_registerBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];[self.view addSubview:_registerBtn];}-(void)registerMethod{RegisterController * registerController= [[RegisterController alloc]init];registerController.registerBlock = self.logBlock;[self presentViewController:registerController animated:YES completion:nil];}-(void)login{NSString * _strTextName=_userTextfield.text;NSString * _strTextPsw=_passwordfield.text;if(![TextUtils isBlankString:_strTextName]&&![TextUtils isBlankString:_strTextPsw]){NSLog(@"登录成功");NSLog(@"%@ %@",_strTextName,_strTextPsw);NSString * registerString=@"http://192.168.7.25:8090/boss/user/validlogin?";NSString * str1=@"username=";NSString * str2=@"password=";NSMutableString *geturl = [NSMutableString string];[geturl appendString:registerString];[geturl appendString:str1];[geturl appendString:_strTextName];[geturl appendString:@"&"];[geturl appendString:str2];[geturl appendString:_strTextPsw];NSLog(@" geturl  ---  > %@",geturl);[[AFHTTPSessionManager manager]GET:geturl parameters:nil headers:nil progress:^(NSProgress * _Nonnull downloadProgress) {NSLog(@"");} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {NSLog(@"");NSLog(@"请求成功---%@",responseObject);NSLog(@"请求 msg ---%@",[responseObject objectForKey:(@"msg")]);if (self.logBlock) {self.logBlock(YES, responseObject);}[self dismissViewControllerAnimated:YES completion:nil];} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"");}];}else {[WHToast showMessage:@"账号或者密码不能为空" duration:2 finishHandler:^{NSLog(@"登录toast");}];}}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{//回收键盘[_userTextfield resignFirstResponder];[_passwordfield  resignFirstResponder];
}
@end

我们看到 我们在登录的viewcontroller 也定义了一个block 然后我们跳转的时候将外部传进来的 block 赋值给我们在登录定义的block.然后我们在登录网络请求成功以后 回调我们数据回去即可。
还有注册的viewcontroller 也是同理的 我就不展开讲了 也是注册成功 将服务端返回的数据结构 回调回去

数据上报逻辑 servicelogin

// 区服登录接口
+ (void)serviceinfo:(ServiceInfo*)getserviceinfo  serviceLogin:(ServiceBlock)finishBlock{NSLog(@"区服登录");NSString * sign = [NSString stringWithFormat:@"sid=%@role_id=%@role_anme=%@||0a649d6b-df9f-4583-bf7d-3fae84838519",getserviceinfo->_sid,getserviceinfo->_roleid,getserviceinfo->_rolename];NSLog(@" sign %@", sign);NSString * getsign=[Md5Utils getMd5_32Bit_String:sign isUppercase:NO];NSLog(@" getsign --- >  %@" ,getsign);NSString * serviceLoginUrl=@"http://192.168.7.25:8090/boss/serviceinfo/servicelogin?";NSMutableString *geturl = [NSMutableString string];[geturl appendString:serviceLoginUrl];[geturl appendString:@"gid="];[geturl appendString:getserviceinfo->_gid];[geturl appendString:@"&"];[geturl appendString:@"sid="];[geturl appendString:getserviceinfo->_sid];[geturl appendString:@"&"];[geturl appendString:@"role_name="];[geturl appendString:getserviceinfo->_rolename];[geturl appendString:@"&"];[geturl appendString:@"role_level="];[geturl appendString:getserviceinfo->_rolelevel];[geturl appendString:@"&"];[geturl appendString:@"role_id="];[geturl appendString:getserviceinfo->_roleid];[geturl appendString:@"&"];[geturl appendString:@"sign="];[geturl appendString:getsign];NSString *url = [geturl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
//    NSLog(@"geturl --- %@",geturl);[[AFHTTPSessionManager manager]GET:url parameters:nil headers:nil progress:^(NSProgress * _Nonnull downloadProgress) {NSLog(@"");} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {NSLog(@"");NSLog(@"请求成功---%@",responseObject);NSLog(@"请求 msg ---%@",[responseObject objectForKey:(@"msg")]);finishBlock(YES);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"");}];
};

我们同样定义对外接口方法 需要传入 ServiceInfo 模型实例 然后实现 ServiceBlock 回调
然后我们在这个方法内部去请求服务端进去游戏里面数据上报逻辑 。

具体接入效果

  • 登录接入

//登录
- (IBAction)login:(id)sender {[NineFunSdk viewcontroller:self sdkCheckLogin:^(BOOL success, id data) {NSLog(@"回调成功成功---%@",data);}];
}
  • 数据上报 servicelogin

// 区服登录上报
- (IBAction)servicelogin:(id)sender {ServiceInfo * serviceinfo=[ServiceInfo new];serviceinfo->_sid=@"1111";serviceinfo->_gid=@"424251";serviceinfo->_roleid=@"旋涡名人";serviceinfo->_rolename=@"最强王者";serviceinfo->_rolelevel=@"214141";[NineFunSdk serviceinfo:serviceinfo serviceLogin:^(BOOL success) {NSLog(@"区服登录");}];
}
  • 数据上报 updateuserinfo

// 等级变化上报
- (IBAction)updateuserinfo:(id)sender {RoleInfo * roleinfo= [RoleInfo new];roleinfo->_gid=@"12232";roleinfo->_roleid=@"422422";roleinfo->_rolename=@"醉生梦死";roleinfo->_sid=@"测试服务器";roleinfo->_rolelevel=@"191";[NineFunSdk roleinfo:roleinfo updateUserInfo:^(BOOL success) {NSLog(@"等级变化上报");}];
}

整个iOS 手机SDK 大概就讲完了

最后总结:

有很多同学这时候就说 做成SDK 应该最后要打包成静态库才对吧 。是的没错 这一期我只是讲大概思路 因为我也不会打包静态库 所以我也还在学习 后面继续更新哈代码里面很多的三方库其实也不是这样去用的 我们应该直接去拉代码 不应该用 pod file 这样去依赖 我也是为了方便。最后希望我的文章能帮助到各位解决问题 ,以后我还会贡献更多有用的代码分享给大家。各位同学如果觉得文章还不错 ,麻烦给关注和star,小弟在这里谢过啦!

ios 手游SDK 开发教程相关推荐

  1. 鸿蒙 手游sdk 开发教程

    前言 : 各位同学的大家好 , 最近在学习鸿蒙开发, 因为我是从事手游SDK 开发的 之前也写过iOS 手游sdk 开发和安卓手游sdk 开发(kotlin 版本) 效果图: 设计思路 我们需要封装 ...

  2. android手游sdk开发教程,Android SDK开发基本教程

    一.本文章总计460字,需要花费您5分钟时间进行阅读. A.先来理解SDK开发的基本流程.首先,在你的Project中新建一个module,指定为Android Library.再新建一个Activi ...

  3. 手游sdk开发有哪些功能?

    在游戏对接的时候,由于不同的游戏要接入不同的SDK,这些SDK参数多,接口不统一,而且更新和维护费用也很高.SDK现在的功能,就是在频道上建立一个统一的界面,让所有的用户家都能对接游戏. 手游SDK大 ...

  4. 关于android手游Sdk开发的专题(一)

    随着手游行业的蓬勃发展,以及各大IP加入,对于Android手游插件sdk的开发也多了起来. 下面我将给大家分享手游插件的开发细节 1.sdk开发与传统的app开发的不同点 首先做为sdk由于要兼容e ...

  5. 手游平台开发需要哪些人员配置?

    说起手游的研发,相信很多人都很熟悉,但是,如果要开发展手游平台,还需要什么人?开发费用和时间安排是什么?很多人都很迷茫. 一.手游平台开发需要哪些人? 一般情况下,我们至少要雇佣5个以上的程序员. 整 ...

  6. 手游平台开发需要哪些人员构成?

    目前,手游平台是目前最主要的游戏代理平台,可以为游戏商带来巨大的利润.开发和部署手机游戏平台需要什么样的技术人才?小编的知识课,将会带你深入了解手游平台开发的庐山真面貌! 首先,我们的产品管理人员.在 ...

  7. 手游SDK到底是什么?

    一.SDK概念 SDK,即Software Development Kit,软件开发工具包的意思,通俗点说,就是辅助开发某一类软件的相关文档.范例和工具的集合,不过我们平时所说到的sdk其实会更加简单 ...

  8. 手游SDK是什么意思,可以解决哪些问题?

    SDK一般是指软件开发工具包(Software Development Kit),是软件工程师为项目特定的项目准备的软件包.软件框架.硬件平台.操作系统等建立应用软件时的开发工具的集合. 手游SDK是 ...

  9. Android手游SDK那点事(四)聚合打包

    更新: 聚合SDK 我们的SDK其实也可以称为聚合SDK,所谓聚合,就是CP游戏方接入聚合SDK,然后通过打包工具将游戏分发到更多渠道上,我们的SDK也有这个能力,相对渠道少一点 分发渠道包 以下操作 ...

  10. Android手游SDK那点事(二)SDK项目结构设计(初版,废弃)

    项目构建 上一个完整架构图 以KSDK为名称模拟项目构建 项目建议: 1.这里游戏sdk不使用mvp或者mmvm的方式,其实这两种模式开发者在开发应用的时候不要盲目的使用,根据自己项目业务情况选择一个 ...

最新文章

  1. arm b bl 地址无关码_ARM_异常和中断
  2. 企业校园网的6大趋势
  3. php网页打开输入密码,PHP输入密码查看网页
  4. 一步一步实现自己的模拟控件(5)——隐藏类
  5. PHP随机生成中国人姓名的类
  6. android seekbar 代码设置高度,Android - 如何更改默认的SeekBar厚度?
  7. POJ 1325 Machine Schedule(zoj 1364) 最小覆盖数
  8. 《集体智慧编程》第8章 构建价格模型 个人笔记
  9. linux+企业微信+api,概述 - 企业微信API
  10. 【实验技术笔记】细胞表型检测之细胞凋亡(Hoechst染色 + PI染色 + TUNEL 染色 + Annexin V-PI 双染)
  11. [转帖]江湖高手专用的“隐身术”:图片隐写技术
  12. html meta标签使用总结
  13. PostgreSQL 9.6源码解析之XLOG生成
  14. STL源码剖析 RB-tree
  15. 畜牧业中资金问题的解决——活体贷技术和实现原理
  16. 超市收银软件测试自学,超市收银系统测试计划.doc
  17. 北大韦神答辩PPT,最后一页文字被挑剔
  18. cc 和 bcc 的区别 邮件
  19. 程序设计之B - 东东学打牌(C++
  20. 二叉查找树的创建及遍历

热门文章

  1. mysql 建表语句
  2. unity4.x从入门到精通、Unity 5.x游戏开发指南读书摘要(2015-4-21 12:10、2015-12-28 22:12)
  3. Android Studio中XML注释错误问题
  4. 关于高等数学、线性代数、数理统计和概率论
  5. 复变函数(第五版)课后答案 余家荣 版 课后习题答案 高等教育出版社 第一章 课后题答案与解析
  6. CMOS版图课程第七讲--可靠性设计,视频截图节选
  7. 【openeuler 21.3】Linux硬盘分区、更改/home目录挂载空间及root目录扩容
  8. 中级软件测试笔试题100精讲_软件测试工程师笔试题目(含答案)
  9. vue3中json编辑器
  10. 关于UnityHub更换位置后找不到编辑器以及登录界面白屏的问题