原生插件开发--友盟一键登录(UMVerify)

  • 友盟SDK准备
    • 下载UMVerify SDK
    • 将SDK 导入项目
    • 遇到的问题
    • 代码调用
      • iOS端代码
        • iOS 登录成功返回数据
      • uniapp端代码
    • 本地运行调试

友盟SDK准备

下载UMVerify SDK

手工集成友盟SDK,打开友盟官网,选择开发者中心-SDK

进去之后选择端—选择平台—选择产品服务进行集成

将SDK 导入项目

下载之后
.framework导入到主工程里面。
.bundle导入到主项目下的Bundles文件夹下面。
这里需要注意,所有的第三方的.bundle文件都需要放在这里。要不然引用不进来。

第一步:下载SDK

第二步 :导入主工程的framework里面

第三步:bundle导入到主工程特定的文件夹里面。

友盟SDK的配置按照官方文档即可。

遇到的问题

如果在插件工程里面出现下面的问题,可以按照下面的步骤参考解决方案。

1、问题:插件工程引用友盟头文件报错,提示找不到该文件。 解决:将下载下来的友盟头文件,全部拷贝到插件工程文件下面,然后将其路径放在targets—search paths—framework search paths 里面。如图


这样在编译运行就可以使用友盟头文件了。

代码调用

iOS端代码

新建一个YMModule文件,继承DCUniModule。在YMModule.h文件里面引入插件、友盟需要的头文件。如下图

第一个头文件是插件开发需要继承的,必写
第二个是友盟需要引用的头文件,必写
第三个是用于友盟第三方分享。

框起来的三个是友盟一键登录需要的头文件。
第一个是一键登录SDK头文件,必填
第二个是友盟一键登录页面样式的重写。(根据实际情况引用)
第三个是风火轮。(根据实际情况引用)

.m文件

@implementation YMModule
// 友盟 一键登录。宏定义用于uniapp调用
UNI_EXPORT_METHOD(@selector(UmLoginVerify:callback:))
#pragma mark - 一键登录  js调用的方法
- (void)UmLoginVerify:(NSDictionary *)options callback:(UniModuleKeepAliveCallback)callback
{// options 为 js 端调用此方法时传递的参数// 第一个参数为回传给js端的数据,第二个参数为标识,表示该回调方法是否支持多次调用,如果原生端需要多次回调js端则第二个参数传 YES;float timeout = 5.0;__weak typeof(self) weakSelf = self;[ProgressHUD show:@"请稍等..." Interaction:YES];// 初始化友盟相关配置[UMConfigure initWithAppkey:[options objectForKey:@"UMAppkey"] channel:@"App Store"];// 设置密钥NSString*info = [NSString stringWithFormat:@"%@",[options objectForKey:@"VerifySDKInfo"]];//设置SDK参数,app生命周期内调用一次即可[UMCommonHandler setVerifySDKInfo:info complete:^(NSDictionary*_Nonnull resultDic){NSLog(@"VerifySDKInf=%@",resultDic);}];// 检测当前环境是否支持一键登录,支不支持提前知道 (UMPNSAuthTypeLoginToken 检查一键登录环境 UMPNSAuthTypeVerifyToken 检查号码认证环境)__block BOOL support = YES;[UMCommonHandler checkEnvAvailableWithAuthType:UMPNSAuthTypeLoginToken complete:^(NSDictionary*_Nullable resultDic){support =[PNSCodeSuccess isEqualToString:[resultDic objectForKey:@"resultCode"]];}];//是否有sim卡if ([UMCommonUtils simSupportedIsOK]){[UMCommonHandler accelerateLoginPageWithTimeout:timeout complete:^(NSDictionary * _Nonnull resultDic) {if ([PNSCodeSuccess isEqualToString:[resultDic objectForKey:@"resultCode"]] == NO) {[ProgressHUD showError:@"取号,加速授权页弹起失败"];if (callback) {callback(resultDic,YES);}return ;}//2. 调用获取登录Token接口,可以立马弹起授权页[ProgressHUD dismiss];UMCustomModel *model = [weakSelf buildCustomModel:NO];model.supportedInterfaceOrientations = UIInterfaceOrientationMaskAllButUpsideDown;[UMCommonHandler getLoginTokenWithTimeout:timeout controller:[YMModule dc_findCurrentShowingViewController] model:model complete:^(NSDictionary * _Nonnull resultDic) {NSLog(@"logintoken:%@",resultDic);if (callback) {callback(resultDic,YES);}NSString *code = [resultDic objectForKey:@"resultCode"];if ([PNSCodeLoginControllerPresentSuccess isEqualToString:code]) {[ProgressHUD showSuccess:@"弹起授权页成功"];} else if ([PNSCodeLoginControllerClickCancel isEqualToString:code]) {[ProgressHUD showSuccess:@"点击了授权页的返回"];} else if ([PNSCodeLoginControllerClickChangeBtn isEqualToString:code]) {[ProgressHUD showSuccess:@"点击切换其他登录方式按钮"];} else if ([PNSCodeLoginControllerClickLoginBtn isEqualToString:code]) {if ([[resultDic objectForKey:@"isChecked"] boolValue] == YES) {[ProgressHUD showSuccess:@"点击了登录按钮,check box选中,SDK内部接着会去获取登陆Token"];} else {[ProgressHUD showSuccess:@"点击了登录按钮,check box选中,SDK内部不会去获取登陆Token"];}} else if ([PNSCodeLoginControllerClickCheckBoxBtn isEqualToString:code]) {[ProgressHUD showSuccess:@"点击check box"];} else if ([PNSCodeLoginControllerClickProtocol isEqualToString:code]) {[ProgressHUD showSuccess:@"点击了协议富文本"];} else if ([PNSCodeSuccess isEqualToString:code]) {//点击登录按钮   获取登录Token成功回调NSString *token = [resultDic objectForKey:@"token"];// 下面拿token去服务器换手机号 // 如果是原生功能 这个地方就可以调用服务器接口了。 //现在是插件开发,这个token就需要传给uniapp了。//这里是将整个result传给uniapp。dispatch_async(dispatch_get_main_queue(), ^{[UMCommonHandler cancelLoginVCAnimated:YES complete:nil];});}}];}];}else {[self debugLogin:[YMModule dc_findCurrentShowingViewController] model:nil];}
}

// debug登录方法
-(void)debugLogin:(UIViewController *)controller model:(UMCustomModel *)model
// 唤起一键登录页面
-(UMCustomModel *)buildCustomModel:(BOOL)isAlert

// 这个是debug登录方法,可以不写的。
-(void)debugLogin:(UIViewController *)controller model:(UMCustomModel *)model
{[UMCommonHandler debugLoginUIWithController:controller model:model complete:^(NSDictionary * _Nonnull resultDic) {}];
}
// 这个方法是唤起一键登录页面
- (UMCustomModel *)buildCustomModel:(BOOL)isAlert {if (isAlert) {return [UMModelCreate createAlert];} else {return [UMModelCreate createFullScreen];}
}

// 获取当前显示的 UIViewController
+(UIViewController *)dc_findCurrentShowingViewController
+(UIViewController *)findCurrentShowingViewControllerFrom:(UIViewController *)vc

因为module没有包含viewcontroller,所以在使用viewcontroller的地方就需要上面的方法了。

比如, 在原生功能里面的代码是这样使用的。
[UMCommonHandler getLoginTokenWithTimeout:timeout controller:self model:model complete:^(NSDictionary * _Nonnull resultDic) { }];

这里的self 在插件项目里面就需要改成 [YMModule dc_findCurrentShowingViewController]
完整的代码就会变成

[UMCommonHandler getLoginTokenWithTimeout:timeout controller:[YMModule dc_findCurrentShowingViewController] model:model complete:^(NSDictionary * _Nonnull resultDic) { }];


#pragma mark - 获取viewcontroller
// 获取当前显示的 UIViewController
+ (UIViewController *)dc_findCurrentShowingViewController {//获得当前活动窗口的根视图UIViewController *vc = [UIApplication sharedApplication].keyWindow.rootViewController;UIViewController *currentShowingVC = [self findCurrentShowingViewControllerFrom:vc];return currentShowingVC;
}
+ (UIViewController *)findCurrentShowingViewControllerFrom:(UIViewController *)vc
{// 递归方法 Recursive methodUIViewController *currentShowingVC;if ([vc presentedViewController]) {// 当前视图是被presented出来的UIViewController *nextRootVC = [vc presentedViewController];currentShowingVC = [self findCurrentShowingViewControllerFrom:nextRootVC];} else if ([vc isKindOfClass:[UITabBarController class]]) {// 根视图为UITabBarControllerUIViewController *nextRootVC = [(UITabBarController *)vc selectedViewController];currentShowingVC = [self findCurrentShowingViewControllerFrom:nextRootVC];} else if ([vc isKindOfClass:[UINavigationController class]]){// 根视图为UINavigationControllerUIViewController *nextRootVC = [(UINavigationController *)vc visibleViewController];currentShowingVC = [self findCurrentShowingViewControllerFrom:nextRootVC];} else {// 根视图为非导航类currentShowingVC = vc;}return currentShowingVC;
}@end

iOS 登录成功返回数据

在登录成功,拿到token的地方会返回参数。根据拿到的token值,请求服务器接口,进行验证。

{
carrierFailedResultData = {
};
innerCode = 103000;
innerMsg = “”;
msg = “”;
requestId = c724a6248bd64c3f;
resultCode = 600000;
token = 123456;
}

uniapp端代码


<template><div><button type="primary" @click="testAsyncFunc">testAsyncFunc</button><button type="primary" @click="testSyncFunc">testSyncFunc</button><button type="primary" @click="testUmLoginVerify">testUmLoginVerify</button></div>
</template><script>// 首先需要通过 uni.requireNativePlugin("ModuleName") 获取 module var testModule = uni.requireNativePlugin("cymtestPlugins-YMModule")export default {methods: {testAsyncFunc() {// 调用异步方法testModule.testAsyncFunc({'name': 'uni-app','age': 1},(ret) => {uni.showToast({title:'cym-demo-调用异步方法 ' + ret,icon: "none"})})},testSyncFunc() {// 调用同步方法var ret = testModule.testSyncFunc({'name': 'uni-app','age': 1})uni.showToast({title:'调用同步方法cym ' + ret,icon: "none"})}testUmLoginVerify(){testModule.UmLoginVerify({'UMAppkey': '59892ebcaed179694b000104','VerifySDKInfo': 'WPsC0MdV+g0nHmn1HdpGlPp1aiL6IM8oTjxG0DI89yFBhYp7mTTOQOMSJJMcbiIGd+6XdDs8pILvvklioVfVGkUYsULKoIlh1UqWwNl9LRXW6/jgK55oxgPk20vffYdc85XTPtU8BacNSJgyItD1WXh2DryPX7RQoPW3vJyKVmPv3LH3XAd5MVvjsWHtTW30nF1ZySe5WMRyE7q7MTAJsfEBe2Fa3P6KQNffAA2fGcaM7d0aOnFAoD6MgxaGSoph/vAvDpDiW4A='},(ret) => {uni.showToast({title:'cym-demo-UmLoginVerify,获取到token ' + ret.token,icon: "none"})})}}}
</script>

本地运行调试

注意uniapp打包之后的包名需要要与iOS里面的control文件里面的appid保持一致。

uniapp里面的

iOS里面的

uniapp导出本地包

这里要注意,使用的HBuilder X工具要和iOS插件里面的SDK版本保持一直。要不然运行会报错。这里统一都是当前最新的3.4.18版本。

点击这个路径就获取到最新的本地包了,将包拉取到iOS项目里面。

这样我们就可以运行iOSAPP了。

下面就是一键登录拿到的token值。

uni原生插件开发--友盟一键登录相关推荐

  1. 友盟一键登录获取手机号码PHP后端

    友盟一键登录获取手机号码PHP后端 下载友盟的SDK(以iOS为例) PHP的后端撸起 下载友盟的SDK(以iOS为例) 下载地址就不解释了 ...带过直接进入正题 然后项目搞起来 ,你讲会看到这也页 ...

  2. (0013)iOS 开发之集成友盟第三方登录

    第三方登录的原理和流程 用户采用第三方登录的时候,用户会发送哪些信息到我的后台,后台会进行哪些比对操作?首次使用第三方登录和再次使用第三方登录时验证有哪些不同,后台如何保存用户的登录信息尼? 对于用户 ...

  3. 友盟第三方登录 无法切换账号 退出 取消授权

    友盟第三方登录后,哪怕你卸载了微博/qq这些客户端,你点击上次登录的方式还是能正常登录的,不需要重新授权..导致一个问题,比如我先用这个QQ登录 后,想换另外一个QQ登录会导致无法登录,哪怕退出QQ, ...

  4. iOS App 友盟授权登录后,如何获取微信unionid

    随着公司业务的拓展,接入微信平台的情况下,微信所提供的 unionid显得越来越重要了.但用友盟授权登录后友盟并未获取到unionid这个字段,就需要我们自己想办法了. 很简单就是用微信提供的接口自己 ...

  5. 友盟第三方登录精简版QQ遇到的坑

    这几天在项目中集成了友盟第三方登录,完成以后微信和微博基本都没什么问题,只有QQ遇到的问题比较烦人.具体的集成步骤我不在此赘述,官方文档上有,而且已经有不少介绍的很详细的文章.个人遇到问题可能不同,此 ...

  6. 友盟微信登录失败Unable to find explicit activity class

    在使用友盟第三方登录的时候,如果安装的是旧版本微信则会报错: E/MicroMsg.SDK.MMessageAct: send fail, ex = Unable to find explicit a ...

  7. Android友盟第三方登录

    最近项目中使用到了友盟(社会化Android组件),开始集成的时候没来及细读友盟提供的开发文档.现在来总结一下集成过程中遇到的问题. ##### 1.申请第三方账号     友盟   新浪微博开放平台 ...

  8. 友盟第三方登录(QQ登录)

    第一步打开友盟官网注册一个账号,登录如下图进行操作点击个人中心 进入下一个界面点击管理创建一个应用生成AppKey:如下图 返回首页点击SDK与文档点击进行第三方登录集成点击右边的SDK下载选择你需要 ...

  9. 关于友盟QQ登录返回的信息

    如题  哪位哥哥遇到过这种情况 这是打印日志: info:{ is_yellow_year_vip=0,  vip=0, level=0,  province=北京, yellow_vip_level ...

最新文章

  1. UA MATH575B 数值分析下VI 统计物理的随机模拟方法2
  2. 用ARM DS-5进行android linux开发
  3. Fedora 31 已经为 Python 3.8 做好了准备
  4. 案例 github_github 项目搜索技巧-让你更高效精准地搜索项目
  5. 离职阿里三年后,他又回来了
  6. java 图片合并成pdf_Java多张图片合成PDF
  7. 吉他效果器amplitube 4 mac 完整破解版永久激活方法
  8. 力扣学习计划——数据结构与算法入门笔记
  9. Python——OCR识别
  10. 旧台式电脑改软路由过程记录
  11. c语言求平均值 保留三位小数,Excel求平均值时,保留小数位数与参与求平均值的个数有关...
  12. 交叉熵误差(cross entropy error)
  13. Matlab 未找到支持的编译器或 SDK 解决方法归纳
  14. C语言编程>第三周 ⑧ 打印出杨辉三角形(要求打印出10行)
  15. 大数据云原生能力成熟度模型,重磅发布!
  16. 克莱茵瓶&莫比乌斯带
  17. linux 安装wkhtmltopdf 所出的问题
  18. 今日学习在线编程题:古人的剩余定理
  19. 分享一个国内可用的免费ChatGPT网站
  20. Some words about Computer

热门文章

  1. mongodb客户端编程
  2. Android 源码中添加自定义服务并提供给上层使用
  3. linux 目录只读,解决Linux文件系统变成只读的方法
  4. 想要认识更多人,扩大自己的交际圈
  5. tplink-如何远程WEB管理路由器?
  6. 动态规划总结以及状态转移方程的推导(一)
  7. ansible Error - Invalid characters were found in group names but not replaced
  8. Mathematics Puzzle Numbrs
  9. 【视频】深入浅出servlet现场教学系列之一
  10. 电感知识:参数、线圈、作用、型号、规格、命名、应用、与磁珠的联系与区别、计算公式、测量、注意事项