uni原生插件开发--友盟一键登录

本文详细介绍了如何在iOS原生插件中集成友盟SDK,实现一键登录功能。从下载SDK、导入项目、配置搜索路径,到解决引用头文件问题,再到代码调用和登录成功后的数据处理,每个步骤都有清晰的说明。同时,文中还展示了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 
<think>我们正在处理用户关于在Compose中集成友盟一键登录的询问。首先回顾一下引用的资料: - 引用[1]展示了一个简单的Compose登录页面,包含输入框和按钮,并处理用户输入。 - 引用[2]提到了compose-multiplatform的社交登录统一处理,但用户需要的是友盟登录(属于第三方登录),可能可以借鉴其架构思想。 - 引用[3]是关于Docker Compose部署的,与当前问题无关。 - 引用[4]详细描述了在Compose中接入微信登录的方法,包括manifest配置和代码实现,这为我们提供了实现第三方登录的参考模板。 用户明确要求集成友盟一键登录。由于友盟一键登录通常是针对Android平台的,我们可以参考引用[4]中微信登录的实现方式(同为第三方登录),并结合友盟官方文档来完成。 步骤: 1. 添加依赖:在build.gradle中引入友盟一键登录SDK。 2. 配置AndroidManifest.xml:添加必要的权限和Activity声明(参考友盟文档)。 3. 在Compose中实现登录界面:使用TextField输入手机号(可选),但友盟一键登录可以自动获取本机号码,所以主要是一个按钮触发登录。 4. 初始化友盟SDK:在Application中初始化。 5. 处理登录逻辑:调用友盟一键登录API,处理回调(成功获取token,再去友盟服务器换手机号,然后用自己的服务器验证)。 具体步骤参考: 第一步:添加依赖 在模块的build.gradle文件中添加友盟一键登录SDK依赖(注意检查最新版本): ```groovy dependencies { implementation 'com.umeng.umsdk:oaid_lenovo:1.0.0' // 根据手机厂商选择 implementation 'com.umeng.umsdk:oaid_mi:1.0.0' implementation 'com.umeng.umsdk:oaid_oppo:1.0.0' implementation 'com.umeng.umsdk:oaid_vivo:1.0.0' implementation 'com.umeng.umsdk:umeng-asms:1.8.1' // 友盟安全组件,必须 implementation 'com.umeng.umsdk:umeng-common:9.7.0' // 友盟公共库,必须 implementation 'com.umeng.umsdk:umeng-accs:1.8.0' // 友盟推送依赖,如果不需要可以去掉 implementation 'com.umeng.umsdk:umeng-apm:1.9.0' // 友盟APM,可选 implementation 'com.umeng.umsdk:umeng-login:9.7.0' // 友盟登录SDK,必须 } ``` 第二步:配置AndroidManifest.xml 添加必要的权限: ```xml <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> ``` 注意:Android 11以上需要声明包可见性,如果需要跳转其他应用授权(如移动、联通、电信的授权界面)则需要添加: ```xml <queries> <!-- 中国移动 --> <package android:name="com.cmpay" /> <!-- 中国联通 --> <package android:name="com.uplus" /> <!-- 中国电信 --> <package android:name="com.ct.client" /> </queries> ``` 第三步:在Compose中创建登录按钮 在Compose函数中,创建一个按钮,点击按钮时调用友盟一键登录的授权方法。 第四步:初始化友盟SDK 在Application的onCreate中初始化: ```kotlin class MyApp : Application() { override fun onCreate() { super.onCreate() // 初始化友盟SDK UMConfigure.init(this, "你的AppKey", "渠道名", UMConfigure.DEVICE_TYPE_PHONE, "") // 初始化一键登录(必须) UmengLoginHelper.init(this) } } ``` 第五步:实现一键登录逻辑 在Compose中,我们通过回调来处理登录过程。由于友盟SDK是Java/Kotlin库,我们需要在ViewModel或者单独的工具类中处理,并在Compose中通过副作用和回调来触发。 创建一个ViewModel来处理登录逻辑: ```kotlin class LoginViewModel : ViewModel() { private val _loginResult = MutableStateFlow<Result<String>?>(null) val loginResult: StateFlow<Result<String>?> = _loginResult.asStateFlow() fun oneKeyLogin(context: Context) { // 调用友盟一键登录 UmengLoginHelper.getInstance().oneKeyLogin(context, object : UmengLoginListener { override fun onResult(result: LoginResult) { // 登录结果回调 when (result.code) { UmengLoginResultCode.SUCCESS -> { val token = result.token // 获取到的token,用于向友盟服务器换取手机号(注意:需要在服务端换取) _loginResult.value = Result.success(token) } else -> { // 错误处理 _loginResult.value = Result.failure(Exception("登录失败: ${result.msg}")) } } } }) } fun release() { UmengLoginHelper.getInstance().release() } } ``` 在Compose中使用: ```kotlin @Composable fun LoginScreen(viewModel: LoginViewModel = viewModel()) { val context = LocalContext.current val loginResult by viewModel.loginResult.collectAsState() Button(onClick = { viewModel.oneKeyLogin(context) }) { Text("一键登录") } // 处理登录结果 LaunchedEffect(loginResult) { loginResult?.onSuccess { token -> // 这里拿到token,需要发送到自己的服务器,由服务器去友盟换取手机号(避免客户端密钥泄露) // 然后根据服务器返回的结果,进行后续操作(如登录成功跳转等) // 注意:友盟要求必须在服务端用token换手机号 Log.d("Login", "获取到的token: $token") } loginResult?.onFailure { // 处理错误 } } // 在离开页面时释放资源(可选,根据友盟文档建议在不再使用登录功能时释放) DisposableEffect(Unit) { onDispose { viewModel.release() } } } ``` 注意事项: 1. 友盟一键登录需要获取READ_PHONE_STATE权限,在Android 6.0以上需要动态申请。 2. 一键登录获取到的token不能直接拿到手机号,需要将token传递给自己的服务器,由服务器调用友盟的REST API(需要友盟的AppKey和AppSecret)来换取手机号。这样可以避免AppSecret泄露。 3. 需要确保添加了正确的OAID(设备标识)依赖,以支持不同厂商的手机。 4. 如果用户手机不支持一键登录(比如没有SIM卡等),可以降级为短信验证码登录友盟也提供了短信验证码登录的接口。 以上就是Compose集成友盟一键登录的基本步骤。由于具体的AppKey和服务器交互逻辑因项目而异,这里只提供客户端集成的关键步骤。详细请参考友盟官方文档。 §§相关问题§§ 1. 如何在Compose中动态申请友盟一键登录所需的权限? 2. 如何在自己的服务器端使用token换取手机号? 3. 友盟一键登录在哪些情况下会失败?有哪些降级方案? 4. Compose中如何封装友盟登录SDK以便复用? </think>在 Compose 中集成友盟一键登录,可参考以下步骤(结合 Android 原生实现和 Compose 特性): ### 1. 添加依赖 在 `build.gradle` 中添加友盟 SDK 依赖(版本号以官方最新为准): ```groovy dependencies { implementation 'com.umeng.umsdk:common:9.7.0' // 必选(基础库) implementation 'com.umeng.umsdk:asms:1.8.1' // 必选(一键登录) implementation 'com.umeng.umsdk:oaid_lenovo:1.0.0' // OEM 厂商支持 implementation 'com.umeng.umsdk:oaid_mi:1.0.0' // 小米设备支持 } ``` ### 2. 配置 AndroidManifest.xml ```xml <!-- 网络权限 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 运营商识别 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 声明一键登录 Activity --> <activity android:name="com.umeng.umverify.UMVerifyActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@style/Theme.UMVerify.Transparent" /> ``` ### 3. Compose 登录界面实现 ```kotlin @Composable fun LoginScreen() { val context = LocalContext.current Column( modifier = Modifier.padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally ) { Text("欢迎登录", style = MaterialTheme.typography.h4) Spacer(modifier = Modifier.height(32.dp)) // 一键登录按钮 Button( onClick = { initUmLogin(context) } // 初始化登录逻辑 ) { Text("一键登录") } } } ``` ### 4. 初始化友盟 SDK 在 `Application` 类中初始化: ```kotlin class MyApp : Application() { override fun onCreate() { super.onCreate() UMConfigure.init(this, "YOUR_APP_KEY", null, UMConfigure.DEVICE_TYPE_PHONE, "") UmLoginHelper.init(this) // 初始化一键登录 } } ``` ### 5. 实现登录逻辑 ```kotlin fun initUmLogin(context: Context) { val loginHelper = UmLoginHelper.getInstance() // 检查SIM卡状态 if (!loginHelper.isSimReady(context)) { Toast.makeText(context, "SIM卡不可用", Toast.LENGTH_SHORT).show() return } // 启动一键登录 loginHelper.oneKeyLogin(context, object : UmLoginListener { override fun onResult(result: LoginResult) { when (result.code) { UmengLoginResultCode.SUCCESS -> { val token = result.token // 获取临时凭证 verifyTokenWithServer(token) // 向自有服务器验证 } else -> handleError(result.code, result.msg) } } }) } ``` ### 6. 服务器端验证(伪代码) ```kotlin private fun verifyTokenWithServer(token: String) { viewModelScope.launch { try { val result = authRepository.umengVerify(token) if (result.success) { // 登录成功,存储用户信息 } else { // 验证失败处理 } } catch (e: Exception) { // 网络错误处理 } } } ``` ### 注意事项 1. **权限动态申请**:针对 Android 6.0+ 需动态申请 `READ_PHONE_STATE` 权限 2. **隐私合规**:需在用户同意隐私政策后初始化 SDK 3. **OEM 适配**:需集成对应厂商的 OAID 支持库 4. **服务端验证**:客户端获取的 token 需通过友盟 REST API 验证(防止伪造) 5. **降级策略**:当一键登录不可用时,需提供短信验证码备选方案 参考实现:[^1][^2][^4] --- ### 相关问题 1. **如何解决 Compose 中动态权限申请问题?** 2. **友盟一键登录如何实现服务端 token 验证?** 3. **在 Compose 多平台场景下如何统一登录逻辑?** 4. **如何处理友盟登录过程中的运营商适配问题?** 5. **Compose 如何封装友盟登录组件实现复用?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力成为包租婆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值