Back

【flutter记录】实现在安卓和iOS唤起第三方钉钉授权登录功能

flutter记录--实现在安卓和iOS唤起第三方钉钉授权登录功能

目录

1.当前flutter和所需依赖版本。

2.钉钉后台登录配置

3.flutter安卓端签名配置

一.当前flutter和所需依赖版本。

​ 1.flutter版本为1.22.5。
​ 2.dart版本为2.10.4。
​ 3.第三方钉钉登录依赖fludd: ^0.0.3,pub官网地址
​ 4.Android studio版本3.5.2。
​ 5.Xcode版本 12.0。

二.钉钉后台登录配置。

第一步:登录钉钉管理后台,需要用公司钉钉管理员账户扫码登录。

第二步:登录成功后,创建一个钉钉移动端授权的应用,单击应用开发,选择移动应用接入单击分享,然后单击新增移动应用

然后出现以下页面

1. 应用名称:就是app的名称,在唤起钉钉授权登录页面时展登录后xx应用想获取您的信息,按照自己项目名称进行填写。
2. 应用描述:填写app的简单描述。
3. 小图标:自己app手机桌面图片格式如图所示2828,按照要求来上传即可。
4. 大图标:自己app手机桌面图片格式如图所示宽高108108,按照要求来上传即可,这个图片会在唤起钉钉授权登录页面时展示。
5. 权限申请:两个一起勾选即可,如果用登录会自动包含分享权限。
6. 应用类型:按自己的app分发的平台来勾选,一把安卓和ios的一起勾选即可。
7. IOS市场地址:这个不是必填项就没有填。
8. IOS Bundle ID: bundle id是每个ios应用的唯一标示,填写该app的bundleid即可,尽量在开发的时候就在苹果开发后台配置好,这个id的格式要求是倒写的域名比如com.baidu.name,会有验证。
9. Android市场地址:这个不是必填项就没有填。
10. Android包名称:这个选项踩了一个坑,由于没有开发过app,第一次填写包名称的时候填写的和应用名称一样的app的名称,在测试的时候一直报钉钉授权错误,在查询了好久资料后,才发现应该填写flutter项目中android/app/src/main/AndroidManifest.xml文件里面的package="com.example.myapp"的值,比如此处就是com.example.myapp,这个会在项目创建时有一个默认的,可以进行修改。
修改时有两点注意事项,当时也踩过坑:
第一点.单词不要以数字开头,会报java变量不能以数字开头的错。
第二点.修改可以全局搜索这个值,进行替换成新的包名称,但除了变量外,还有修改一个地方的目录名称,如下图箭头标记的地方,创建项目时项目名称是myapp,会在安卓生成的包名称就是com.example.myapp,在此处的文件夹目录就是/com/example/mypp,如果要更改包名称,此处目录也必须更改为相对应的,比如更改后的是com.baidu.name,此处文件夹命名应该 为/com/baidu/name。然后从新run项目安卓包名称就改过来了。

11.安卓签名

​ 第一步:生成安卓签名

​ 要先生成一个安卓签名,安卓签名可以免费生成,可以通过命令行生成,也可以通过第三方在线生成工具生成。
命令行生成:
​ 在 macOS 或者 Linux 系统上,执行下面的代码

keytool -genkey -v -keystore ./key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

在 Windows 系统上,执行下述代码:

keytool -genkey -v -keystore ./key.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key

-keystore 参数配置的是密钥文件生成后存储的路径,该命令是生成在当前命令行目录下
-alias 参数配置的是密钥文件的别名,在安卓签名配置的时候会用到。

输入后会让输入一系列信息,如下图:

注意事项:比较重要的是口令,类似于密码的作用,一定要记好。国家地区输入CN,最后会有确认,输入Y即可,直接回车会被认为成否,又要重新再来一遍。

在线第三方工具快捷生成

觉得命令行麻烦的也可以借助第三方平台提供的工具,比如第八区安卓证书在线制作,如下图,输入别名,密码,组织名称,点击生成证书即可。

第二步:获取安卓签名文件中32位md5加密密钥。

此时已经生成好了安卓证书,比如此处密钥名称为key.jks,在该文件处打开命令行,输入查看密钥信息的命令:

keytool -list -v -keystore ./key.jks -storepass 123456

-keystore 参数配置的是密钥文件的路径

-storepass 参数配置的是密钥文件生成的时候输入的口令(密码)

然后展示内容如下图展示:

箭头标示的地方SHA1后面的密钥即为配置钉钉授权登录安卓签名,只是需要做一下处理,把所有的冒号都去掉,然后会得到一串32位的密钥字符串。

let str = '11:25:9E:2B:76:34:56:1B:A7:5F:BE:93:8D:05:95:6E:0F:90:F9:6B'
str.replace(/\:/g, '')
// 11259E2B7634561BA75FBE938D05956E0F90F96B

把这串密钥复制到创建钉钉授权里面的安卓签名输入框里面,最终再检查一遍填写的内容,确认没问题后点击创建即,创建成功后会获取到应用的AppIDAppSecret

三. flutter钉钉授权登录安卓端签名配置

​ 1.第一步把生成的密钥文件key.jks和密钥文件的密码别名文件。

在项目android目录下创建一个key_store文件夹,把密钥文件key.jks文件放进去,并在该目录下新建密钥密码配置文件key.properties,文件代码如下

storePassword=123456 #生成密钥文件时输入的密码(口令),对应上文第2.11生成密钥命令中的-keystore参数
keyPassword=123456    # 生成密钥文件时输入的密码(口令),对应上文第2.11生成密钥命令中的-keystore参数
keyAlias=fitch_key # 生成密钥文件时输入的别名,,对应上文第2.11生成密钥命令中的-alias参数
storeFile=../key_store/fitch.jks #密钥文件放置的路径,虽然密钥文件与此代码文件在同一目录,但由于是在android/app/build.gradle里使用密钥文件,路径要改成密钥文件相对于android/app/build.gradle文件的相对路径

配置好后的目录结构为下图所示

2.第二步在android/app/build.gradle文件配置使用密钥文件

在android/app/build.gradle文件中android代码之前添加:

// 创建一个名为keystorePropertiesFile的变量,并将其初始化为aodroid/key_store文件夹中的keystore.properties文件。
def keystoreProperties = new Properties()
// 初始化一个名为keystoreProperties的新Properties()对象
def keystorePropertiesFile = rootProject.file('key_store/key.properties')
// 将keystore.properties文件加载到keystoreProperties对象中
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

配置完成后代码如下图所示:

现在就已经把密钥文件引用进来了,接下来要配置使用签名配置了。

3.第三步在android/app/build.gradle文件配置密钥文件的密码配置文件

在android/app/build.gradle文件中把找到整个buildTypes代码块代码:

buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
        }
    }

替换成:

// 签名配置
signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
}
// 配置构建类型
buildTypes {
                // 打包构建
        release {
            signingConfig signingConfigs.release
        }
}

上面代码是配置了签名文件的密码相关配置,并在app的打包构建时应用,打包时候签名就会使用我们配置的key.jks文件签名,就可以和我们在钉钉授权登录中配置的签名关联起来了。

注意:如果只在buildTypes的release构建版本中配置了,发布版本的signingConfigs.release配置,则该key.jks文件签名只在打包构建时会使用,在debug开发环境安卓会默认生成一个签名,这也是当时开发遇到的一个坑,明明配置好了签名,但开发环境总是唤起钉钉登录失败,如果想在开发环境也用key.jks文件签名来调试钉钉登录,只需要在buildTypes配置中新增代码:

// debug开发环境构建
debug {
            signingConfig signingConfigs.release
}

这样我们在开发环境下也可以使用key.jks签名文件了,配置后的代码如下图:

到此为止,安卓的签名就配置好了,接下来该配置ios钉钉登录所需要的工作了。

四. flutter钉钉授权登录IOS端配置

相比安卓的签名配置,ios端钉钉配置要简单一点,只需要在ios/Runner/Info.plist文件中添加以下钉钉配置代码:

<!-- iOS 打开本地其他应用程序配置 -->
<key>CFBundleURLTypes</key>
    <array>
        <dict/>
        <dict>
            <key>CFBundleTypeRole</key>
            <string>Editor</string>
            <key>CFBundleURLName</key>
            <!-- 配置钉钉对应的名称 -->
            <string>dingtalk</string>
            <key>CFBundleURLSchemes</key>
            <array>
        <!-- 配置钉钉后台授权登录应用申请后得到的appid -->
                <string>ddAppid</string>
            </array>
        </dict>
    </array>
    <!-- iOS平台设置应用访问白名单 -->
    <key>LSApplicationQueriesSchemes</key>
    <array>
    <!-- 允许钉钉跳转回来 -->
        <string>dingtalk-sso</string>
        <string>dingtalk</string>
        <string>dingtalk-open</string>
    </array>

至此在原生安卓和ios的工程中的配置就都已经完成了,接下来该我们原生flutter项目中调用唤起钉钉登录!

五. 在flutter唤起钉钉授权登录。

第一步安装第三方钉钉授权登录依赖。

项目采用的是社区里面已经有大神写好的钉钉登录插件fludd: ^0.0.3,pub官网地址

1.添加依赖,在依赖配置文件pubspec.yaml中配置:

dependencies:
  fludd: ^0.0.3

2.安装依赖,一般点击保存,编辑器会检测到,自动同步依赖,如果没有自动同步,在命令行收到同步下载一下即可:

flutter pub get

依赖就已经安装好了。

第二步在代码里面使用。

示例:在/lib/main.dart添加代码

import 'package:flutter/material.dart';
import 'package:fludd/fludd.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  String _ddCode;

  @override
  void initState() {
    super.initState();
    // 1.配置appid注册钉钉登录授权
    Fludd.registerApp(appId: "dingoaiipnnwr0mkb0mbly");
    // 2.监听钉钉授权的回调code
    Fludd.responseFromAuth.listen((event) {
      print(event.code);
      if(event.code != null) {
        setState(() {
          _ddCode = event.code;
        });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('唤起钉钉授权登录'),
        ),
        body: Center(
          child: FlatButton(
            color: Colors.blue,
            onPressed: (){
            // 此处配置ios的bundleId
            Fludd.sendAuth(bundleId: 'com.51zhulie.ios.fitch').then((res){
              print("授权回调:$res");
            }).catchError((err){
              // 如果保错包含DingDing not installed,代表设备未未安装钉钉,可以引导用户跳转商店下载,可以跳到网页版授权登录,
                            // 直接提示未安装或者引导下载ios上架时会遇到问题,后面会讲解决方案。
              if(err.toString().contains('DingDing not installed')){
                print('未安装钉钉app');
              } else {
                print("授权失败回调:$err");
              }
            });
          }, child: Text("钉钉授权:${_ddCode == null ? '点击授权' : _ddCode}", style: TextStyle(color: Colors.white)))
        ),
      ),
    );
  }
}

项目运行页面如下,点击授权按钮,如果配置没有遗漏的地方,再可以跳转到钉钉app,弹出授权页面,点击确定授权,会回到自己的项目中,并在监听code的地方获取到授权回调code,把code传给后端处理即可。

y

参考链接

钉钉开发者平台:https://ding-doc.dingtalk.com/document/mobile-app-guide/mobile-application-access):https://ding-doc.dingtalk.com/document/mobile-app-guide/mobile-application-access。

flutter中文文档:https://flutter.cn/docs/deployment/android。
fludd依赖:https://pub.dev/packages/fludd。

第八区安卓证书在线制作:https://www.dibaqu.com/utils/android-cert。

郭炯韦个人博客 备案号: 豫ICP备17048833号-1
Top