Flutter集成Truecaller功能插件flutter_truecaller_sdk的使用

Flutter集成Truecaller功能插件flutter_truecaller_sdk的使用

Flutter插件,该插件使用了Truecaller的Android SDK来提供移动号码验证服务以验证Truecaller用户。

当前,该插件仅支持Android。从v0.0.2及以上版本开始,您可以验证Truecaller用户以及非Truecaller用户。而v0.0.1版本仅允许验证那些在其设备上安装了Truecaller应用并且已登录的用户。 通过Truecaller SDK,您可以快速验证、注册或登录您的用户,使用他们的手机号码进行验证。

更多详细信息,请参阅这里

集成步骤

1. 更新pubspec.yaml

在您的pubspec.yaml文件中添加最新版本的flutter_truecaller_sdk

dependencies:
  ...
  flutter_truecaller_sdk: ^0.0.1
  ...

2. 生成应用密钥并将其添加到AndroidManifest.xml

  1. 注册Truecaller开发者账户,或者登录现有账户。
  2. 参考官方文档生成应用密钥。
  3. 打开您的AndroidManifest.xml文件,并在application元素中添加一个meta-data元素,包含您的应用密钥:
<application>
...
<activity>
..
</activity>

<meta-data android:name="com.truecaller.android.sdk.PartnerKey" android:value="PASTE_YOUR_PARTNER_KEY_HERE"/>

...
</application>

3. 修改MainActivity.kt

  1. 转到/android模块下的MainActivity.kt文件。
  2. SDK需要使用FragmentActivity而不是Activity,因此将MainActivity.kt扩展为FlutterFragmentActivity
  3. MainActivity.kt中覆盖两个函数configureFlutterEngine(flutterEngine: FlutterEngine)getBackgroundMode()
class MainActivity: FlutterFragmentActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)
    }

    override fun getBackgroundMode(): FlutterActivityLaunchConfigs.BackgroundMode {
        return FlutterActivityLaunchConfigs.BackgroundMode.transparent
    }
}
  1. AndroidManifest.xml中更新MainActivity.ktlaunchModesingleTask
<application>
...
<activity android:name=".MainActivity"
          android:launchMode="singleTask">
..
</activity>
...
</application>

4. 添加必要的权限到AndroidManifest.xml

如果初始化SDK时使用TruecallerSdkScope.SDK_OPTION_WITH_OTP,则必须添加以下权限:

对于Android 8及以上版本:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>

对于Android 7及以下版本:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>

这些权限是SDK能够自动检测挂断电话并完成验证流程所必需的。

要了解有关用户验证的不同场景,请点击这里

示例 1(仅验证拥有Truecaller应用的Truecaller用户)

// This Example is valid for flutter_truecaller_sdk 0.0.1 onwards 

// 导入包
import 'package:flutter_truecaller_sdk/flutter_truecaller_sdk.dart';

// 步骤1: 使用SDK_OPTION_WITHOUT_OTP初始化SDK
TruecallerSdk.initializeSDK(sdkOptions: TruecallerSdkScope.SDK_OPTION_WITHOUT_OTP);

// 步骤2: 检查SDK是否可用
bool isUsable = await TruecallerSdk.isUsable;

// 步骤3: 如果isUsable为true,则可以调用getProfile以显示同意屏幕验证用户的号码
isUsable ? TruecallerSdk.getProfile : print("***Not usable***");

// 或者您也可以直接替换步骤2和步骤3
TruecallerSdk.isUsable.then((isUsable) {
 isUsable ? TruecallerSdk.getProfile : print("***Not usable***");
});

// 步骤4: 监听TruecallerSdk.getProfile回调结果(成功、失败、验证)
StreamSubscription streamSubscription = TruecallerSdk.streamCallbackData.listen((truecallerSdkCallback) {
  switch (truecallerSdkCallback.result) {
    case TruecallerSdkCallbackResult.success:
      print("First Name: ${truecallerSdkCallback.profile.firstName}");
      print("Last Name: ${truecallerSdkCallback.profile.lastName}");
      break;
    case TruecallerSdkCallbackResult.failure:
      print("Error code : ${truecallerSdkCallback.error.code}");
      break;
    case TruecallerSdkCallbackResult.verification:
      print("Verification Required!!");
      break;
    default:
      print("Invalid result");
  }
});

// 步骤5: 释放streamSubscription
@override
void dispose() {
  if (streamSubscription != null) {
    streamSubscription.cancel();
  }
  super.dispose();
}

示例 2(验证Truecaller用户(示例1)和非Truecaller用户(手动验证))

// This Example is valid for flutter_truecaller_sdk 0.0.2 onwards 

// 导入包
import 'package:flutter_truecaller_sdk/flutter_truecaller_sdk.dart';

// 步骤1: 使用SDK_OPTION_WITH_OTP初始化SDK
TruecallerSdk.initializeSDK(sdkOptions: TruecallerSdkScope.SDK_OPTION_WITH_OTP);

// 步骤2: 调用getProfile以显示同意屏幕验证用户的号码
// 注意:当使用SDK_OPTION_WITH_OTP时,isUsable总是返回TRUE,所以可以直接调用getProfile
TruecallerSdk.isUsable.then((isUsable) {
 isUsable ? TruecallerSdk.getProfile : print("***Not usable***");
});

// 步骤3: 通过[streamCallbackData]流监听TruecallerSdk.getProfile回调结果(成功、失败、验证)
StreamSubscription streamSubscription = TruecallerSdk.streamCallbackData.listen((truecallerSdkCallback) {
  switch (truecallerSdkCallback.result) {
    case TruecallerSdkCallbackResult.success:
      // 如果Truecaller用户且其设备上有Truecaller应用,您会直接获得个人资料
      print("First Name: ${truecallerSdkCallback.profile.firstName}");
      print("Last Name: ${truecallerSdkCallback.profile.lastName}");
      break;
    case TruecallerSdkCallbackResult.failure:
      print("Error code : ${truecallerSdkCallback.error.code}");
      break;
    case TruecallerSdkCallbackResult.verification:
      // 如果回调在这里,表示需要手动验证,因此请遵循步骤4
      // 您会收到一个可空错误,可用于确定导致验证的用户操作
      print("Manual Verification Required!! ${truecallerSdkCallback.error != null ? 
            truecallerSdkCallback.error.code : ""}");
      break;
    default:
      print("Invalid result");
  }
});

// 步骤4: 通过请求用户输入手机号码发起手动验证
TruecallerSdk.requestVerification(phoneNumber: "PHONE_NUMBER");

// 步骤5: 通过[streamCallbackData]流监听TruecallerSdk.requestVerification回调结果(错过通话发起、错过通话接收、OTP发起、OTP接收、已验证、验证完成、异常)
StreamSubscription streamSubscription = TruecallerSdk.streamCallbackData.listen((truecallerSdkCallback) {
  switch (truecallerSdkCallback.result) {
    case TruecallerSdkCallbackResult.missedCallInitiated:
      // 号码验证将通过漏接电话完成,所以您可以显示加载器直到收到电话
      // 您还会收到ttl(秒),它决定了完成用户验证所需的时间
      // TTL到期后,您需要重新开始验证过程,可以从步骤4开始
      // 您可以让用户输入另一个号码,或者可以通过提供重试按钮自动重试同一号码上的验证
      print("${truecallerUserCallback.ttl}");
      break;
    case TruecallerSdkCallbackResult.missedCallReceived:
      // 收到了漏接电话,现在您可以按照步骤6a完成验证
      break;
    case TruecallerSdkCallbackResult.otpInitiated:
      // 号码验证将通过OTP完成
      // 您还会收到ttl(秒),它决定了完成用户验证所需的时间
      // TTL到期后,您需要重新开始验证过程,可以从步骤4开始
      // 您可以让用户输入另一个号码,或者可以通过提供重试按钮自动重试同一号码上的验证
      print("${truecallerUserCallback.ttl}");
      break;
    case TruecallerSdkCallbackResult.otpReceived:
      // 已经收到OTP,现在您可以按照步骤6b完成验证
      // 如果SMS Retriever哈希码已配置在Truecaller的开发者仪表板上,您可以从回调中获取OTP
      print("${truecallerUserCallback.otp}");
      break;
    case TruecallerSdkCallbackResult.verificationComplete:
      // 号码验证已完成,您可以从回调中获取accessToken
      print("${truecallerUserCallback.accessToken}");
      break;
    case TruecallerSdkCallbackResult.verifiedBefore:
      // 号码已在此之前验证过,因此无需验证。从回调中检索个人资料数据
      print("${truecallerUserCallback.profile.firstName}");
      print("${truecallerUserCallback.profile.lastName}");
      print("${truecallerUserCallback.profile.accessToken}");
      break;
    case TruecallerSdkCallbackResult.exception:
      // 处理异常
      print("${truecallerUserCallback.exception.code}, ${truecallerUserCallback.exception.message}");
      break;
    default:
      print("Invalid result");
  }
});

// 步骤6: 完成用户验证
// 6a: 如果在同一设备上收到了漏接电话,调用此方法并传入用户的名字
TruecallerSdk.verifyMissedCall("FIRST_NAME", "LAST_NAME");

// 6b: 如果在任何设备上发起了或收到了OTP,调用此方法并传入用户的名字和接收到的OTP
TruecallerSdk.verifyOtp("FIRST_NAME", "LAST_NAME", "OTP");

// 步骤7: 释放streamSubscription
@override
void dispose() {
  if (streamSubscription != null) {
    streamSubscription.cancel();
  }
  super.dispose();
}

如步骤5所述,当TruecallerSdkCallbackResult等于TruecallerSdkCallbackResult.missedCallInitiatedTruecallerSdkCallbackResult.otpInitiated时,您会收到额外的参数TTL(以秒为单位),它作为String extra传递并在回调中使用truecallerUserCallback.ttl检索。该值确定了完成用户验证所需的剩余时间。您可以使用该值向用户显示等待消息,以便在他们尝试进行另一次尝试之前等待。一旦TTL到期,您需要从步骤4开始重新启动验证过程。

注意事项

  • 有关不同类型的错误代码的详细信息,请参阅这里
  • 有关不同类型的异常的详细信息,请参阅这里
  • 有关服务器端响应验证的详细信息,请参阅这里
  • 有关示例实现,请访问示例模块。

自定义选项

语言

要自定义同意屏幕的语言,可以在调用TruecallerSdk.getProfile之前添加以下行:

/// 初始化SDK并检查isUsable,然后再调用此方法
/// 默认值为"en",即英语
TruecallerSdk.setLocale("hi") // 这将设置语言为印地语

暗主题

您还可以通过添加以下行来自定义同意屏幕的暗主题:

/// 初始化SDK并检查isUsable,然后再调用此方法
TruecallerSdk.setDarkTheme

注意:暗主题不适用于TruecallerSdkScope.CONSENT_MODE_BOTTOMSHEET

同意屏幕UI

您可以使用类TruecallerSdkScopescope_options.dart中的选项来自定义同意屏幕UI,并在初始化SDK时传递它们。

/// [sdkOptions] 确定您想要使用SDK来验证
/// 1. [TruecallerSdkScope.SDK_OPTION_WITHOUT_OTP] 即仅限Truecaller用户
/// 2. [TruecallerSdkScope.SDK_OPTION_WITH_OTP] 即Truecaller用户和非Truecaller用户
///
/// 注意:在flutter_truecaller_sdk 0.0.1中,仅支持
/// [TruecallerSdkScope.SDK_OPTION_WITHOUT_OTP]
/// 在flutter_truecaller_sdk 0.0.2及以后版本中,同时支持
/// [TruecallerSdkScope.SDK_OPTION_WITHOUT_OTP] 和 [TruecallerSdkScope.SDK_OPTION_WITH_OTP]
///
/// [consentMode] 确定您想向用户显示哪种类型的同意屏幕。
/// [consentTitleOptions] 仅适用于 [TruecallerSdkScope.CONSENT_MODE_POPUP] 和 [TruecallerSdkScope.CONSENT_MODE_FULLSCREEN],并设置标题前缀
/// [footerType] 确定底部按钮文本。您可以将其设置为
/// [TruecallerSdkScope.FOOTER_TYPE_NONE] 如果不想显示任何底部按钮
/// 对于 [TruecallerSdkScope.CONSENT_MODE_BOTTOMSHEET] 有一些仅适用的定制选项
/// 包括:
/// [loginTextPrefix] 确定登录句子的前缀文本
/// [loginTextSuffix] 确定登录句子的后缀文本
/// [ctaTextPrefix] 确定登录按钮的前缀文本
/// [privacyPolicyUrl] 设置您自己的隐私政策URL
/// [termsOfServiceUrl] 设置您自己的服务条款URL
/// [buttonShapeOptions] 设置登录按钮形状
/// [buttonColor] 设置登录按钮颜色
/// [buttonTextColor] 设置登录按钮文本颜色
static initializeSDK(
        {@required int sdkOptions,
        int consentMode: TruecallerSdkScope.CONSENT_MODE_BOTTOMSHEET,
        int consentTitleOptions: TruecallerSdkScope.SDK_CONSENT_TITLE_GET_STARTED,
        int footerType: TruecallerSdkScope.FOOTER_TYPE_SKIP,
        int loginTextPrefix: TruecallerSdkScope.LOGIN_TEXT_PREFIX_TO_GET_STARTED,
        int loginTextSuffix: TruecallerSdkScope.LOGIN_TEXT_SUFFIX_PLEASE_LOGIN,
        int ctaTextPrefix: TruecallerSdkScope.CTA_TEXT_PREFIX_USE,
        String privacyPolicyUrl: "",
        String termsOfServiceUrl: "",
        int buttonShapeOptions: TruecallerSdkScope.BUTTON_SHAPE_ROUNDED,
        int buttonColor,
        int buttonTextColor})

更多关于Flutter集成Truecaller功能插件flutter_truecaller_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter集成Truecaller功能插件flutter_truecaller_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


要在Flutter中集成Truecaller功能,你可以使用 flutter_truecaller_sdk 插件。这个插件允许你在Flutter应用中调用Truecaller SDK,从而实现Truecaller登录和用户信息获取等功能。以下是如何使用 flutter_truecaller_sdk 的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 flutter_truecaller_sdk 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_truecaller_sdk: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

2. 配置Android

在Android项目中,你需要进行以下配置:

2.1 添加Truecaller SDK依赖

android/app/build.gradle 文件中,添加Truecaller SDK的依赖:

dependencies {
    implementation 'com.truecaller.android.sdk:truecaller-sdk:2.6.0'  // 请检查最新版本
}

2.2 配置Manifest文件

android/app/src/main/AndroidManifest.xml 文件中,添加以下权限和元数据:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<application
    android:label="Your App Name"
    android:icon="@mipmap/ic_launcher">
    
    <meta-data
        android:name="com.truecaller.android.sdk.PartnerKey"
        android:value="YOUR_PARTNER_KEY" />  <!-- 替换为你的Partner Key -->
    
    <activity
        android:name="com.truecaller.android.sdk.TruecallerActivity"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
    
</application>

2.3 获取Partner Key

你需要从Truecaller开发者平台获取Partner Key,并将其替换到上面的 YOUR_PARTNER_KEY 位置。

3. 配置iOS

在iOS项目中,你需要进行以下配置:

3.1 添加Truecaller SDK依赖

ios/Podfile 文件中,添加Truecaller SDK的依赖:

pod 'TrueSDK', '~> 1.0.0'  # 请检查最新版本

然后运行 pod install 来安装依赖。

3.2 配置Info.plist

ios/Runner/Info.plist 文件中,添加以下键值对:

<key>TruecallerSDKAppKey</key>
<string>YOUR_APP_KEY</string>  <!-- 替换为你的App Key -->

3.3 获取App Key

你需要从Truecaller开发者平台获取App Key,并将其替换到上面的 YOUR_APP_KEY 位置。

4. 使用 flutter_truecaller_sdk 插件

在你的Flutter代码中,你可以使用 flutter_truecaller_sdk 插件来调用Truecaller SDK的功能。

4.1 初始化Truecaller SDK

首先,初始化Truecaller SDK:

import 'package:flutter_truecaller_sdk/flutter_truecaller_sdk.dart';

void initTruecaller() async {
  await FlutterTruecallerSdk.initialize(
    sdkOptions: SdkOptions(
      sdkOptionType: SdkOptionType.popup,  // 或者 SdkOptionType.fullScreen
      footerType: FooterType.continueWith,  // 或者 FooterType.signUp
    ),
  );
}

4.2 获取用户信息

你可以调用 getProfile 方法来获取用户信息:

void getTruecallerProfile() async {
  try {
    TruecallerProfile profile = await FlutterTruecallerSdk.getProfile();
    print('User Name: ${profile.firstName} ${profile.lastName}');
    print('Phone Number: ${profile.phoneNumber}');
  } catch (e) {
    print('Error: $e');
  }
}

4.3 处理回调

你可以设置回调来处理Truecaller SDK的事件:

FlutterTruecallerSdk.setCallback(
  onSuccess: (profile) {
    print('Profile retrieved: ${profile.firstName}');
  },
  onFailure: (error) {
    print('Error: $error');
  },
  onVerificationRequired: () {
    print('Verification required');
  },
);
回到顶部