提交 1aff9194 authored 作者: shixiaochen's avatar shixiaochen

1、初始化

上级
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
/pubspec.lock
**/doc/api/
.dart_tool/
.packages
build/
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled.
version:
revision: 84a1e904f44f9b0e9c4510138010edcc653163f8
channel: stable
project_type: plugin
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8
base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8
- platform: android
create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8
base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8
- platform: ios
create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8
base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'
## 2.1.2
* 初始版本。
\ No newline at end of file
Copyright (c) 2022-present, Aliyun, Inc. All rights reserved.
Most source code in aliyun_face_plugin are MIT licensed.
A copy of the MIT License is included in this file.
Terms of the MIT License
========================
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
\ No newline at end of file
# 阿里云金融级实人认证 flutter 插件
## Getting Started
该工程是阿里云金融级实人认证的 flutter 插件,在她的帮助下,您的业务 App(Android / iOS) 可以更方便的使用阿里云的刷脸认证服务。
具体使用方式,请参考[线上接入文档](https://yuque.antfin-inc.com/wlkqsw/cblvmq/gih2d0)
include: package:flutter_lints/flutter.yaml
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.cxx
group 'com.aliyun.face.aliyun_face_plugin'
version '1.0'
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.1.0'
}
}
rootProject.allprojects {
repositories {
google()
mavenCentral()
flatDir {
dirs 'libs'
}
}
}
apply plugin: 'com.android.library'
android {
compileSdkVersion 31
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
minSdkVersion 18
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 实人认证SDK
implementation(name: 'aliyun-face-v2.1.2-20221027112723', ext: 'aar')
implementation(name: 'aliyun-facelanguage-v2.1.2-20221027112723', ext: 'aar')
implementation(name: 'aliyun-ocr-v2.1.2-20221027112723', ext: 'aar')
implementation(name: 'aliyun-photinus-v2.1.2-20221027112723', ext: 'aar')
implementation(name: 'aliyun-wishverify-v2.1.2-20221027112723', ext: 'aar')
implementation(name: 'Android-AliyunFaceGuard-10033', ext: 'aar')
implementation(name: 'APSecuritySDK-DeepSec-7.0.1.20220813.jiagu', ext: 'aar')
// 实人认证三方依赖库
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.squareup.okio:okio:1.14.0'
implementation 'com.alibaba:fastjson:1.2.83_noneautotype'
implementation 'com.aliyun.dpa:oss-android-sdk:2.9.11'
}
1、新设备 账号+密码登录,短信验证
// 进入应用 是否是登录状态
bool? equipmentF = SpUtil.getBool(equipmentFlag); //是否是新设备登录
state.isLogin = (getMyUserID() != -1 && equipmentF == false) ? true : false;
group 'com.aliyun.face.aliyun_face_plugin'
version '1.0'
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.1.0'
}
}
rootProject.allprojects {
repositories {
google()
mavenCentral()
flatDir {
dirs 'libs'
}
}
}
apply plugin: 'com.android.library'
android {
compileSdkVersion 31
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
minSdkVersion 18
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 实人认证SDK
implementation(name: 'aliyun-face-v2.1.2-20221027112723', ext: 'aar')
implementation(name: 'aliyun-facelanguage-v2.1.2-20221027112723', ext: 'aar')
implementation(name: 'aliyun-ocr-v2.1.2-20221027112723', ext: 'aar')
implementation(name: 'aliyun-photinus-v2.1.2-20221027112723', ext: 'aar')
implementation(name: 'aliyun-wishverify-v2.1.2-20221027112723', ext: 'aar')
implementation(name: 'Android-AliyunFaceGuard-10033', ext: 'aar')
implementation(name: 'APSecuritySDK-DeepSec-7.0.1.20220813.jiagu', ext: 'aar')
// 实人认证三方依赖库
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.squareup.okio:okio:1.14.0'
implementation 'com.alibaba:fastjson:1.2.83_noneautotype'
implementation 'com.aliyun.dpa:oss-android-sdk:2.9.11'
}
\ No newline at end of file
rootProject.name = 'aliyun_face_plugin'
include ':aliyunface'
\ No newline at end of file
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.aliyun.face.aliyun_face_plugin">
</manifest>
package com.aliyun.face.aliyun_face_plugin;
import androidx.annotation.NonNull;
import java.util.Map;
import android.content.Context;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.Log;
import com.alipay.face.api.ZIMCallback;
import com.alipay.face.api.ZIMFacade;
import com.alipay.face.api.ZIMFacadeBuilder;
import com.alipay.face.api.ZIMResponse;
/** AliyunFacePlugin */
public class AliyunFacePlugin implements FlutterPlugin, MethodCallHandler {
/// The MethodChannel that will the communication between Flutter and native Android
///
/// This local reference serves to register the plugin with the Flutter Engine and unregister it
/// when the Flutter Engine is detached from the Activity
private MethodChannel channel;
private Context mContext;
private static String TAG = "AliyunFace";
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "aliyun_face_plugin");
channel.setMethodCallHandler(this);
mContext = flutterPluginBinding.getApplicationContext();
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
if (call.method.equals("getPlatformVersion")) {
result.success("android " + android.os.Build.VERSION.RELEASE);
} else if (call.method.equals("init")) {
Log.d(TAG, "enter init.");
ZIMFacade.install(mContext);
} else if (call.method.equals("getMetaInfos")) {
Log.d(TAG, "enter getMetaInfos.");
String metaInfo = ZIMFacade.getMetaInfos(mContext);
result.success(metaInfo);
} else if (call.method.equals("verify")) {
Log.d(TAG, "enter verify.");
Map<String, String> params = call.arguments();
String certifyId = params.get("certifyId");
if (certifyId == null || certifyId.isEmpty()) {
Log.e(TAG, "certifyId is null");
return;
}
ZIMFacade zimFacade = ZIMFacadeBuilder.create(mContext);
zimFacade.verify(certifyId, false, new ZIMCallback() {
@Override
public boolean response(ZIMResponse response) {
if (null != response && 1000 == response.code) {
Log.d(TAG, "face verify success.");
} else {
Log.e(TAG, "face verify error.");
}
result.success(response.code + "," + response.reason);
return true;
}
});
} else {
result.notImplemented();
}
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
channel.setMethodCallHandler(null);
}
}
package com.aliyun.face.aliyun_face_plugin
import androidx.annotation.NonNull
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
/** AliyunFacePlugin */
class AliyunFacePlugin: FlutterPlugin, MethodCallHandler {
/// The MethodChannel that will the communication between Flutter and native Android
///
/// This local reference serves to register the plugin with the Flutter Engine and unregister it
/// when the Flutter Engine is detached from the Activity
private lateinit var channel : MethodChannel
override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "aliyun_face_plugin")
channel.setMethodCallHandler(this)
}
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
if (call.method == "getPlatformVersion") {
result.success("Android ${android.os.Build.VERSION.RELEASE}")
} else {
result.notImplemented()
}
}
override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null)
}
}
package com.aliyun.face.aliyun_face_plugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import kotlin.test.Test
import org.mockito.Mockito
/*
* This demonstrates a simple unit test of the Kotlin portion of this plugin's implementation.
*
* Once you have built the plugin's example app, you can run these tests from the command
* line by running `./gradlew testDebugUnitTest` in the `example/android/` directory, or
* you can run them directly from IDEs that support JUnit such as Android Studio.
*/
internal class AliyunFacePluginTest {
@Test
fun onMethodCall_getPlatformVersion_returnsExpectedValue() {
val plugin = AliyunFacePlugin()
val call = MethodCall("getPlatformVersion", null)
val mockResult: MethodChannel.Result = Mockito.mock(MethodChannel.Result::class.java)
plugin.onMethodCall(call, mockResult)
Mockito.verify(mockResult).success("Android " + android.os.Build.VERSION.RELEASE)
}
}
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
/build/
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
# aliyun_face_plugin_example
Demonstrates how to use the aliyun_face_plugin plugin.
## Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at
# https://dart-lang.github.io/linter/lints/index.html.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
**/*.keystore
**/*.jks
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
namespace "com.aliyun.face.aliyun_face_plugin_example"
compileSdkVersion 33
ndkVersion flutter.ndkVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.aliyun.face.aliyun_face_plugin_example"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 21
targetSdkVersion 31
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
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
}
}
}
flutter {
source '../..'
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<permission android:name="android.permission.INTERNET"/>
<permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<permission android:name="android.permission.CAMERA"/>
<application
android:label="aliyun_face_plugin_example"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>
package com.aliyun.face.aliyun_face_plugin_example
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
}
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
buildscript {
ext.kotlin_version = '1.7.10'
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
mavenCentral()
flatDir {
dirs project(':aliyun_face_plugin').file('libs')
}
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
tasks.register("clean", Delete) {
delete rootProject.buildDir
}
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
include ':app'
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
def properties = new Properties()
assert localPropertiesFile.exists()
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
// This is a basic Flutter integration test.
//
// Since integration tests run in a full Flutter application, they can interact
// with the host side of a plugin implementation, unlike Dart unit tests.
//
// For more information about Flutter integration tests, please see
// https://docs.flutter.dev/cookbook/testing/integration/introduction
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:aliyun_face_plugin/aliyun_face_plugin.dart';
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
testWidgets('getPlatformVersion test', (WidgetTester tester) async {
final AliyunFacePlugin plugin = AliyunFacePlugin();
final String? version = await plugin.getPlatformVersion();
// The version string depends on the host platform running the test, so
// just assert that some non-empty string is returned.
expect(version?.isNotEmpty, true);
});
}
**/dgph
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>11.0</string>
</dict>
</plist>
#include "Generated.xcconfig"
#include "Generated.xcconfig"
差异被折叠。
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1300"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "331C8080294A63A400263BE5"
BuildableName = "RunnerTests.xctest"
BlueprintName = "RunnerTests"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
</Workspace>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
# Launch Screen Assets
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
</resources>
</document>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Flutter View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Aliyun Face Plugin</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>aliyun_face_plugin_example</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict>
</plist>
#import "GeneratedPluginRegistrant.h"
import Flutter
import UIKit
import XCTest
@testable import aliyun_face_plugin
// This demonstrates a simple unit test of the Swift portion of this plugin's implementation.
//
// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
class RunnerTests: XCTestCase {
func testGetPlatformVersion() {
let plugin = AliyunFacePlugin()
let call = FlutterMethodCall(methodName: "getPlatformVersion", arguments: [])
let resultExpectation = expectation(description: "result block must be called.")
plugin.handle(call) { result in
XCTAssertEqual(result as! String, "iOS " + UIDevice.current.systemVersion)
resultExpectation.fulfill()
}
waitForExpectations(timeout: 1)
}
}
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:aliyun_face_plugin/aliyun_face_plugin.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _infos = 'Unknown';
final _aliyunFacePlugin = AliyunFacePlugin();
@override
void initState() {
super.initState();
// 在App启动的早期调用init接口。
_aliyunFacePlugin.init();
}
Future<void> getMetaInfos() async {
String metainfos;
try {
// 获取客户端metainfos,将信息发送到服务器端,调用服务器端相关接口获取认证ID,即CertifyId。
metainfos = await _aliyunFacePlugin.getMetaInfos() ?? 'Unknown metainfos';
} on PlatformException {
metainfos = 'Failed to get metainfos.';
}
setState(() {
_infos = "metainfos: " + metainfos;
});
}
Future<void> startVerify() async {
String verifyResult;
try {
// 调用认证接口,CertifyId需要调用服务器端接口获取。
// 每个CertifyId只能使用一次,否则会返回code: "2002(iOS), 1001(Android)"。
verifyResult = await _aliyunFacePlugin.verify(
"certifyId", "shac05691e3bf2e1826a968793c1a17d") ??
'-1,error';
} on PlatformException {
verifyResult = '-2,exception';
}
setState(() {
_infos = "verifyResult: " + verifyResult;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Aliyun face plugin demo')),
body: Center(
child: Column(children: <Widget>[
Text('$_infos\n'),
ElevatedButton(
onPressed: () async {
getMetaInfos();
},
child: Text("getMetaInfos")),
ElevatedButton(
onPressed: () async {
startVerify();
},
child: Text("startVerify")),
])),
),
);
}
}
\ No newline at end of file
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
aliyun_face_plugin:
dependency: "direct main"
description:
path: ".."
relative: true
source: path
version: "0.0.1"
async:
dependency: transitive
description:
name: async
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.11.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
characters:
dependency: transitive
description:
name: characters
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0"
clock:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.1"
collection:
dependency: transitive
description:
name: collection
sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.17.1"
cupertino_icons:
dependency: "direct main"
description:
name: cupertino_icons
sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.5"
fake_async:
dependency: transitive
description:
name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.1"
file:
dependency: transitive
description:
name: file
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
url: "https://pub.flutter-io.cn"
source: hosted
version: "6.1.4"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_driver:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.1"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
fuchsia_remote_debug_protocol:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
integration_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
js:
dependency: transitive
description:
name: js
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.6.7"
lints:
dependency: transitive
description:
name: lints
sha256: "6b0206b0bf4f04961fc5438198ccb3a885685cd67d4d4a32cc20ad7f8adbe015"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
matcher:
dependency: transitive
description:
name: matcher
sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.12.15"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.0"
meta:
dependency: transitive
description:
name: meta
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.9.1"
path:
dependency: transitive
description:
name: path
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.8.3"
platform:
dependency: transitive
description:
name: platform
sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.4"
process:
dependency: transitive
description:
name: process
sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.2.4"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
source_span:
dependency: transitive
description:
name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.9.1"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.11.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0"
sync_http:
dependency: transitive
description:
name: sync_http
sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.3.1"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.1"
test_api:
dependency: transitive
description:
name: test_api
sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.5.1"
vector_math:
dependency: transitive
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.4"
vm_service:
dependency: transitive
description:
name: vm_service
sha256: f6deed8ed625c52864792459709183da231ebf66ff0cf09e69b573227c377efe
url: "https://pub.flutter-io.cn"
source: hosted
version: "11.3.0"
webdriver:
dependency: transitive
description:
name: webdriver
sha256: "3c923e918918feeb90c4c9fdf1fe39220fa4c0e8e2c0fffaded174498ef86c49"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.2"
sdks:
dart: ">=3.0.0 <4.0.0"
flutter: ">=2.5.0"
name: aliyun_face_plugin_example
description: Demonstrates how to use the aliyun_face_plugin plugin.
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
environment:
sdk: '>=3.0.0 <4.0.0'
# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
# consider running `flutter pub upgrade --major-versions`. Alternatively,
# dependencies can be manually updated by changing the version numbers below to
# the latest version available on pub.dev. To see which dependencies have newer
# versions available, run `flutter pub outdated`.
dependencies:
flutter:
sdk: flutter
aliyun_face_plugin:
# When depending on this package from a real application you should use:
# aliyun_face_plugin: ^x.y.z
# See https://dart.dev/tools/pub/dependencies#version-constraints
# The example app is bundled with the plugin so we use a path dependency on
# the parent directory to use the current plugin's version.
path: ../
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
dev_dependencies:
integration_test:
sdk: flutter
flutter_test:
sdk: flutter
# The "flutter_lints" package below contains a set of recommended lints to
# encourage good coding practices. The lint set provided by the package is
# activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
flutter_lints: ^2.0.0
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter packages.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
# To add assets to your application, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware
# For details regarding adding assets from package dependencies, see
# https://flutter.dev/assets-and-images/#from-packages
# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages
// This is a basic Flutter widget test.
//
// To perform an interaction with a widget in your test, use the WidgetTester
// utility in the flutter_test package. For example, you can send tap and scroll
// gestures. You can also use WidgetTester to find child widgets in the widget
// tree, read text, and verify that the values of widget properties are correct.
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:aliyun_face_plugin_example/main.dart';
void main() {
testWidgets('Verify Platform version', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(const MyApp());
// Verify that platform version is retrieved.
expect(
find.byWidgetPredicate(
(Widget widget) => widget is Text &&
widget.data!.startsWith('Running on:'),
),
findsOneWidget,
);
});
}
.idea/
.vagrant/
.sconsign.dblite
.svn/
.DS_Store
*.swp
profile
DerivedData/
build/
GeneratedPluginRegistrant.h
GeneratedPluginRegistrant.m
.generated/
*.pbxuser
*.mode1v3
*.mode2v3
*.perspectivev3
!default.pbxuser
!default.mode1v3
!default.mode2v3
!default.perspectivev3
xcuserdata
*.moved-aside
*.pyc
*sync/
Icon?
.tags*
/Flutter/Generated.xcconfig
/Flutter/ephemeral/
/Flutter/flutter_export_environment.sh
\ No newline at end of file
#import <Flutter/Flutter.h>
@interface AliyunFacePlugin : NSObject<FlutterPlugin>
@end
#import "AliyunFacePlugin.h"
#import <AliyunFaceAuthFacade/AliyunFaceAuthFacade.h>
@implementation AliyunFacePlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
FlutterMethodChannel* channel = [FlutterMethodChannel
methodChannelWithName:@"aliyun_face_plugin"
binaryMessenger:[registrar messenger]];
AliyunFacePlugin* instance = [[AliyunFacePlugin alloc] init];
[registrar addMethodCallDelegate:instance channel:channel];
}
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
if ([@"getPlatformVersion" isEqualToString:call.method]) {
NSLog(@"enter getPlatformVersion");
result([@"" stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);
return;
}
if ([@"init" isEqualToString:call.method]) {
NSLog(@"enter init");
[AliyunFaceAuthFacade init];
return;
}
if ([@"getMetaInfos" isEqualToString:call.method]) {
NSLog(@"enter getMetaInfos");
NSDictionary *metaInfo = [AliyunFaceAuthFacade getMetaInfo];
NSString *info = [self convertToJsonData: metaInfo];
result([@"" stringByAppendingString:info]);
return;
}
if ([@"verify" isEqualToString:call.method]) {
NSLog(@"enter verify");
id arguments = call.arguments;
NSString *certifyId = [arguments objectForKey:@"certifyId"];
if (certifyId == nil || [certifyId length] == 0) {
NSLog(@"certifyId is nil.");
return;
}
NSLog(@"certifyId: %@.", certifyId);
NSMutableDictionary *extParams = [NSMutableDictionary new];
UIViewController *vc = [self viewControllerWithWindow:nil];
[extParams setValue:vc forKey:@"currentCtr"]; // 必须要的参数
[AliyunFaceAuthFacade verifyWith:certifyId
extParams:extParams
onCompletion:^(ZIMResponse *response) {
result([NSString stringWithFormat:@"%lu,%@", response.code, response.reason]);
}];
return;
}
result(FlutterMethodNotImplemented);
}
#pragma mark - 辅助方法
- (NSString *)convertToJsonData:(NSDictionary *) dict {
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict
options:NSJSONWritingSortedKeys
error:&error];
NSString *jsonString;
if (!jsonData) {
NSLog(@"Error: %@", error);
} else {
jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
}
return jsonString;
}
- (UIViewController *) viewControllerWithWindow:(UIWindow *)window {
UIWindow *windowToUse = window;
if(windowToUse == nil) {
for (UIWindow *windowF in [UIApplication sharedApplication].windows) {
if (windowF.isKeyWindow) {
windowToUse = windowF;
break;
}
}
}
UIViewController *topViewController = windowToUse.rootViewController;
while (topViewController.presentingViewController) {
topViewController = topViewController.presentingViewController;
}
return topViewController;
}
@end
import Flutter
import UIKit
public class AliyunFacePlugin: NSObject, FlutterPlugin {
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: "aliyun_face_plugin", binaryMessenger: registrar.messenger())
let instance = AliyunFacePlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
switch call.method {
case "getPlatformVersion":
result("iOS " + UIDevice.current.systemVersion)
default:
result(FlutterMethodNotImplemented)
}
}
}
/*
en.strings
APBToygerFacade
Created by shouyi.www on 2017/6/1.
Copyright © 2017年 DTF. All rights reserved.
*/
"APBToygerFacade:取消"="Cancel";
"APBToygerFacade:再试一次"="Try Again";
"APBToygerFacade:退出"="Quit";
"APBToygerFacade:确定"="OK";
"APBToygerFacade:继续"="Continue";
"APBToygerFacade:我知道了"="Got it";
"APBToygerFacade:其他登录方式"="Another login method";
"APBToygerFacade:刷脸失败"="Face scan failed";
"APBToygerFacade:当前设备不支持刷脸"="Face scan not supported on your device";
"APBToygerFacade:当前系统不支持刷脸"="Face scan not supported on your device system";
"APBToygerFacade:无法启动相机"="No camera permission";
"APBToygerFacade:请到\“设置-隐私-相机\”开启权限"="Please allow to access your camera in \"Settings\"-\"Privacy\"-\"Camera\"";
"APBToygerFacade:立即开启"="OK";
"APBToygerFacade:刷脸仅在iOS7及以上系统可用"="Face scan is only available on iOS8 or above";
"APBToygerFacade:系统错误"="System error";
"APBToygerFacade:确定退出吗?"="Are you sure to quit face scan?";
"APBToygerFacade:露个脸就能通过"="You can succeed by simply showing your face";
"APBToygerFacade:操作超时"="Time out";
"APBToygerFacade:正对手机,更容易成功"="Face straight at the phone and ensure you have enough light";
"APBToygerFacade:提示:正对手机,更容易成功"="Face straight at the phone and ensure you have enough light";
"APBToygerFacade:本次操作失败"="Sorry, face scan failed";
"APBToygerFacade:网络不给力"="Network connection failed";
"APBToygerFacade:登录中断"="Login interrupted";
"APBToygerFacade:验证中断"="Face scan interrupted";
"APBToygerFacade:刷脸验证"="Face Scan";
"APBToygerFacade:请把脸放入框内保持不动"="Put your face into the frame";
"APBToygerFacade:靠近一点"="Move closer";
"APBToygerFacade:没有检测到脸"="No face";
"APBToygerFacade:再清晰一点"="Face not clear";
"APBToygerFacade:脸部亮一点"="More light";
"APBToygerFacade:请正对手机"="No face";
"APBToygerFacade:把脸移入圈内"="No face";
"APBToygerFacade:离远一点"="Move farther";
"APBToygerFacade:请保持不动"="Stay still";
"APBToygerFacade:请注视屏幕"="Open your eyes";
"APBToygerFacade:眨眨眼"="Blink";
"APBToygerFacade:蚂蚁佐罗提供技术支持"="";
"APBToygerFacade:选择其他验证方式"="Use a different verification method";
"APBToygerFacade:拿起手机眨眨眼"="Blink";
"APBToygerFacade:拿起手机向左摇头"="Turn Head Left";
"APBToygerFacade:拿起手机向右摇头"="Turn Head Right";
"APBToygerFacade:正在处理"="Processing";
"APBToygerFacade:首次使用,请开通刷脸"="For the first time use, please enable Face Scan";
"APBToygerFacade:立即开通"="Enable";
"APBToygerFacade:下次再说"="Later";
"APBToygerFacade:请把手机正对面部"="Face straight at the phone";
"APBToygerFacade:即将开始人脸检测"="Get ready for face recognition";
"APBToygerFacade:没有认出你"="Face scan failed";
"APBToygerFacade:未能识别人脸"="Face not detected";
"APBToygerFacade:人脸检测中"="Face Scan";
"APBToygerFacade:刷脸失败次数过多,请稍后再试"="Too many failed attempts, please try again later";
"APBToygerFacade:取消"="Batalkan";
"APBToygerFacade:再试一次"="Harap coba lagi";
"APBToygerFacade:退出"="Keluar";
"APBToygerFacade:确定"="OK";
"APBToygerFacade:继续"="Lanjutkan";
"APBToygerFacade:我知道了"="OK";
"APBToygerFacade:其他登录方式"="Ubah Metode Logon";
"APBToygerFacade:刷脸失败"="Pengenalan wajah gagal";
"APBToygerFacade:当前设备不支持刷脸"="Perangkat Anda tidak mendukung pengenalan wajah";
"APBToygerFacade:当前系统不支持刷脸"="Sistem saat ini tidak mendukung pengenalan wajah";
"APBToygerFacade:无法启动相机"="Tidak Memiliki Izin Akses Kamera";
"APBToygerFacade:请到\“设置-隐私-相机\”开启权限"="Buka Pengaturan > Privasi > Kamera dan izinkan akses";
"APBToygerFacade:立即开启"="OK";
"APBToygerFacade:刷脸仅在iOS7及以上系统可用"="Hanya iOS 7 dan setelahnya yang mendukung pengenalan wajah";
"APBToygerFacade:系统错误"="Terjadi Kesalahan Sistem";
"APBToygerFacade:确定退出吗?"="Apakah Anda yakin ingin keluar?";
"APBToygerFacade:露个脸就能通过"="Anda hanya perlu memperlihatkan wajah Anda";
"APBToygerFacade:操作超时"="Waktu operasi habis";
"APBToygerFacade:正对手机,更容易成功"="Arahkan wajah lurus menghadap ponsel untuk membuat wajah Anda lebih mudah dipindai";
"APBToygerFacade:本次操作失败"="Operasi gagal";
"APBToygerFacade:网络不给力"="Kondisi jaringan tidak memenuhi persyaratan";
"APBToygerFacade:登录中断"="Logon Terganggu";
"APBToygerFacade:验证中断"="Verifikasi terputus";
"APBToygerFacade:刷脸验证"="Verifikasi dengan Pengenalan Wajah";
"APBToygerFacade:请把脸放入框内保持不动"="Posisikan wajah Anda di dalam bingkai dan jangan bergerak";
"APBToygerFacade:靠近一点"="Harap dekatkan wajah";
"APBToygerFacade:没有检测到脸"="Tidak ada wajah terdeteksi";
"APBToygerFacade:再清晰一点"="Perjelas wajah Anda";
"APBToygerFacade:脸部亮一点"="Terangi wajah Anda";
"APBToygerFacade:请正对手机"="Arahkan wajah lurus menghadap ponsel";
"APBToygerFacade:请露出正脸"="Tunjukkan bagian depan wajah Anda";
"APBToygerFacade:把脸移入圈内"="Posisikan wajah pada lingkaran";
"APBToygerFacade:离远一点"="Harap jauhkan wajah";
"APBToygerFacade:请保持不动"="Tetap tenang";
"APBToygerFacade:请注视屏幕"="Lihat layar";
"APBToygerFacade:眨眨眼"="Harap kedipkan mata";
"APBToygerFacade:蚂蚁佐罗提供技术支持"="";
"APBToygerFacade:选择其他验证方式"="Ubah Metode Verifikasi";
"APBToygerFacade:拿起手机眨眨眼"="Harap kedipkan mata";
"APBToygerFacade:拿起手机向左摇头"="Harap menoleh ke kiri";
"APBToygerFacade:拿起手机向右摇头"="Harap menoleh ke kanan";
"APBToygerFacade:正在处理"="Memproses";
"APBToygerFacade:首次使用,请开通刷脸"="Aktifkan pengenalan wajah untuk melanjutkan";
"APBToygerFacade:立即开通"="Aktifkan";
"APBToygerFacade:下次再说"="Lain Kali";
"APBToygerFacade:请把手机正对面部"="Arahkan wajah lurus menghadap ponsel";
"APBToygerFacade:即将开始人脸检测"="Memulai pengenalan wajah";
"APBToygerFacade:没有认出你"="Pengenalan wajah gagal";
"APBToygerFacade:未能识别人脸"="Tidak ada wajah terdeteksi";
"APBToygerFacade:人脸检测中"="Pengenalan wajah dalam proses";
"APBToygerFacade:刷脸失败次数过多,请稍后再试"="Pengenalan wajah terlalu sering dilakukan. Harap coba lagi nanti";
"APBToygerFacade:取消"="キャンセル";
"APBToygerFacade:再试一次"="もう一度お試しください";
"APBToygerFacade:退出"="終了";
"APBToygerFacade:确定"="OK";
"APBToygerFacade:继续"="続行";
"APBToygerFacade:我知道了"="OK";
"APBToygerFacade:其他登录方式"="ログイン方法を切り替え";
"APBToygerFacade:刷脸失败"="顔を認識できませんでした";
"APBToygerFacade:当前设备不支持刷脸"="お使いのデバイスは顔認識をサポートしていません";
"APBToygerFacade:当前系统不支持刷脸"="顔認識をサポートしていないシステムです";
"APBToygerFacade:无法启动相机"="カメラにアクセスできません";
"APBToygerFacade:请到\“设置-隐私-相机\”开启权限"="[設定] > [プライバシー] > [カメラ] に移動し、アクセスを許可してください";
"APBToygerFacade:立即开启"="OK";
"APBToygerFacade:刷脸仅在iOS7及以上系统可用"="顔認識は iOS 7 以降でサポートされています";
"APBToygerFacade:系统错误"="システムエラー";
"APBToygerFacade:确定退出吗?"="終了してもよろしいですか";
"APBToygerFacade:露个脸就能通过"="顔を見せるだけです";
"APBToygerFacade:操作超时"="操作がタイムアウトしました";
"APBToygerFacade:正对手机,更容易成功"="顔をスキャンしやすいように、電話の方を向いてください";
"APBToygerFacade:本次操作失败"="操作に失敗しました";
"APBToygerFacade:网络不给力"="ネットワークの状態が要件を満たしていません";
"APBToygerFacade:登录中断"="ログインが中断されました";
"APBToygerFacade:验证中断"="検証が中断されました";
"APBToygerFacade:刷脸验证"="顔認識による検証";
"APBToygerFacade:请把脸放入框内保持不动"="フレームの内側に顔が入るようにして、動かないでください";
"APBToygerFacade:靠近一点"="近づいてください";
"APBToygerFacade:没有检测到脸"="顔が検出されません";
"APBToygerFacade:再清晰一点"="顔をはっきりさせてください";
"APBToygerFacade:脸部亮一点"="顔を明るくしてください";
"APBToygerFacade:请正对手机"="電話の方を向いてください";
"APBToygerFacade:请露出正脸"="顔の正面を見せてください";
"APBToygerFacade:把脸移入圈内"="顔を円の中に入れてください";
"APBToygerFacade:离远一点"="離れてください";
"APBToygerFacade:请保持不动"="動かないでください";
"APBToygerFacade:请注视屏幕"="画面を見てください";
"APBToygerFacade:眨眨眼"="まばたきしてください";
"APBToygerFacade:蚂蚁佐罗提供技术支持"="";
"APBToygerFacade:选择其他验证方式"="検証方法を変更";
"APBToygerFacade:拿起手机眨眨眼"="まばたきしてください";
"APBToygerFacade:拿起手机向左摇头"="頭を左に";
"APBToygerFacade:拿起手机向右摇头"="頭を右に";
"APBToygerFacade:正在处理"="処理中";
"APBToygerFacade:首次使用,请开通刷脸"="顔認識を有効化して続行します";
"APBToygerFacade:立即开通"="有効化";
"APBToygerFacade:下次再说"="後で";
"APBToygerFacade:请把手机正对面部"="電話の方を向いてください";
"APBToygerFacade:即将开始人脸检测"="顔認識を開始";
"APBToygerFacade:没有认出你"="顔を認識できませんでした";
"APBToygerFacade:未能识别人脸"="顔が検出されません";
"APBToygerFacade:人脸检测中"="顔を認識中です";
"APBToygerFacade:刷脸失败次数过多,请稍后再试"="顔認識が頻繁に実行されています。後でもう一度やり直してください";
"APBToygerFacade:取消"="취소";
"APBToygerFacade:再试一次"="다시 시도하세요";
"APBToygerFacade:退出"="종료";
"APBToygerFacade:确定"="확인";
"APBToygerFacade:继续"="계속";
"APBToygerFacade:我知道了"="확인";
"APBToygerFacade:其他登录方式"="로그온 방법 전환";
"APBToygerFacade:刷脸失败"="안면 인식에 실패했습니다";
"APBToygerFacade:当前设备不支持刷脸"="귀하의 디바이스는 안면 인식을 지원하지 않습니다";
"APBToygerFacade:当前系统不支持刷脸"="현재 시스템은 안면 인식을 지원하지 않습니다";
"APBToygerFacade:无法启动相机"="카메라 권한이 없습니다";
"APBToygerFacade:请到\“设置-隐私-相机\”开启权限"="설정 > 개인 > 카메라에서 접근 권한을 부여하십시오";
"APBToygerFacade:立即开启"="OK";
"APBToygerFacade:刷脸仅在iOS7及以上系统可用"="iOS 7 및 그 이상의 버전에서만 안면 인식이 지원됩니다";
"APBToygerFacade:系统错误"="시스템 오류";
"APBToygerFacade:确定退出吗?"="정말로 종료하시겠습니까?";
"APBToygerFacade:露个脸就能通过"="얼굴만 보여주시면 됩니다";
"APBToygerFacade:操作超时"="작업 시간이 초과되었습니다";
"APBToygerFacade:正对手机,更容易成功"="얼굴을 더 쉽게 스캔할 수 있도록 휴대전화를 정면으로 바라보세요";
"APBToygerFacade:本次操作失败"="작동에 실패했습니다";
"APBToygerFacade:网络不给力"="네트워크 상태가 요구 사항을 충족하지 않습니다";
"APBToygerFacade:登录中断"="로그온이 중단되었습니다";
"APBToygerFacade:验证中断"="확인이 중단되었습니다";
"APBToygerFacade:刷脸验证"="안면 인식을 통한 인증";
"APBToygerFacade:请把脸放入框内保持不动"="얼굴이 프레임 안으로 들어오도록 위치한 다음 움직이지 말고 가만히 계십시오";
"APBToygerFacade:靠近一点"="더 가까이 움직이세요";
"APBToygerFacade:没有检测到脸"="감지된 얼굴이 없습니다";
"APBToygerFacade:再清晰一点"="얼굴을 좀더 선명하게 만드세요";
"APBToygerFacade:脸部亮一点"="얼굴을 밝게 만드세요";
"APBToygerFacade:请正对手机"="휴대전화를 정면으로 바라보세요";
"APBToygerFacade:请露出正脸"="얼굴의 정면을 보여주세요";
"APBToygerFacade:把脸移入圈内"="얼굴이 원 안에 들어오도록 움직이세요";
"APBToygerFacade:离远一点"="더 멀리 움직이세요";
"APBToygerFacade:请保持不动"="가만히 계십시오";
"APBToygerFacade:请注视屏幕"="화면을 바라보세요";
"APBToygerFacade:眨眨眼"="눈을 깜빡이세요";
"APBToygerFacade:蚂蚁佐罗提供技术支持"="";
"APBToygerFacade:选择其他验证方式"="인증 방법을 변경합니다";
"APBToygerFacade:拿起手机眨眨眼"="눈을 깜빡이세요";
"APBToygerFacade:拿起手机向左摇头"="좌측으로 고개를 돌립니다";
"APBToygerFacade:拿起手机向右摇头"="우측으로 고개를 돌립니다";
"APBToygerFacade:正在处理"="처리 중";
"APBToygerFacade:首次使用,请开通刷脸"="안면 인식을 활성화하여 계속 진행합니다";
"APBToygerFacade:立即开通"="활성화하기";
"APBToygerFacade:下次再说"="나중에 하기";
"APBToygerFacade:请把手机正对面部"="휴대전화를 정면으로 바라보세요";
"APBToygerFacade:即将开始人脸检测"="안면 인식 시작";
"APBToygerFacade:没有认出你"="안면 인식에 실패했습니다";
"APBToygerFacade:未能识别人脸"="감지된 얼굴이 없습니다";
"APBToygerFacade:人脸检测中"="얼굴 인식 중";
"APBToygerFacade:刷脸失败次数过多,请稍后再试"="안면 인식이 연속으로 실행되었습니다. 나중에 다시 시도하세요";
/*
zh-HK.strings
APBToygerFacade
Created by shouyi.www on 2017/6/1.
Copyright © 2017年 DTF. All rights reserved.
*/
"APBToygerFacade:取消"="取消";
"APBToygerFacade:再试一次"="再試一次";
"APBToygerFacade:退出"="退出";
"APBToygerFacade:确定"="確定";
"APBToygerFacade:继续"="继续";
"APBToygerFacade:我知道了"="我知道了";
"APBToygerFacade:其他登录方式"="其他登录方式";
"APBToygerFacade:刷脸失败"="刷臉失敗";
"APBToygerFacade:当前设备不支持刷脸"="目前系統不支援刷臉";
"APBToygerFacade:当前系统不支持刷脸"="目前設備不支援刷臉";
"APBToygerFacade:无法启动相机"="無法啟動相機";
"APBToygerFacade:请到\“设置-隐私-相机\”开启权限"="請到“設置-隱私-相機”開啓權限";
"APBToygerFacade:立即开启"="開通權限";
"APBToygerFacade:刷脸仅在iOS7及以上系统可用"="刷脸仅在iOS7及以上系统可用";
"APBToygerFacade:系统错误"="系統錯誤";
"APBToygerFacade:确定退出吗?"="確定退出嗎?";
"APBToygerFacade:露个脸就能通过"="露個臉就能通過";
"APBToygerFacade:操作超时"="操作超時";
"APBToygerFacade:正对手机,更容易成功"="對準手機,更容易成功";
"APBToygerFacade:本次操作失败"="本次操作失敗";
"APBToygerFacade:网络不给力"="網絡異常,請稍後再試";
"APBToygerFacade:登录中断"="登入中斷";
"APBToygerFacade:验证中断"="驗證中斷";
"APBToygerFacade:刷脸验证"="刷臉驗證";
"APBToygerFacade:请把脸放入框内保持不动"="請把臉移入圈內保持不動";
"APBToygerFacade:靠近一点"="靠近一點";
"APBToygerFacade:没有检测到脸"="沒有檢測到臉";
"APBToygerFacade:再清晰一点"="再清晰一點";
"APBToygerFacade:脸部亮一点"="光線再亮點";
"APBToygerFacade:请正对手机"="請正視手機";
"APBToygerFacade:请露出正脸"="請露出正臉";
"APBToygerFacade:把脸移入圈内"="把臉移入框內";
"APBToygerFacade:离远一点"="離遠一點";
"APBToygerFacade:请保持不动"="請保持不動";
"APBToygerFacade:请注视屏幕"="請注視屏幕";
"APBToygerFacade:眨眨眼"="眨眨眼";
"APBToygerFacade:蚂蚁佐罗提供技术支持"="";
"APBToygerFacade:选择其他验证方式"="選擇其他驗證方式";
"APBToygerFacade:拿起手机眨眨眼"="拿起手機,眨眨眼";
"APBToygerFacade:拿起手机向左摇头"="拿著手機,向左搖頭";
"APBToygerFacade:拿起手机向右摇头"="拿著手機,向右搖頭";
"APBToygerFacade:正在处理"="正在處理";
"APBToygerFacade:首次使用,请开通刷脸"="首次使用,請開通刷臉";
"APBToygerFacade:立即开通"="立即開通";
"APBToygerFacade:下次再说"="下次再說";
"APBToygerFacade:请把手机正对面部"="請把手機正對面部";
"APBToygerFacade:即将开始人脸检测"="即將開始人臉檢測";
"APBToygerFacade:没有认出你"="沒有認出你";
"APBToygerFacade:未能识别人脸"="未能識別人臉";
"APBToygerFacade:人脸检测中"="人臉檢測中";
"APBToygerFacade:刷脸失败次数过多,请稍后再试"="刷臉失敗次數過多,請稍後再試";
/*
zh-Hans.strings
APBToygerFacade
Created by shouyi.www on 2017/6/1.
Copyright © 2017年 DTF. All rights reserved.
*/
"APBToygerFacade:取消"="取消";
"APBToygerFacade:再试一次"="再试一次";
"APBToygerFacade:退出"="退出";
"APBToygerFacade:确定"="确定";
"APBToygerFacade:继续"="继续";
"APBToygerFacade:我知道了"="我知道了";
"APBToygerFacade:其他登录方式"="其他登录方式";
"APBToygerFacade:刷脸失败"="刷脸失败";
"APBToygerFacade:当前设备不支持刷脸"="当前设备不支持刷脸";
"APBToygerFacade:当前系统不支持刷脸"="当前系统不支持刷脸";
"APBToygerFacade:无法启动相机"="无法启动相机";
"APBToygerFacade:请到\“设置-隐私-相机\”开启权限"="请到“设置-隐私-相机”开启权限";
"APBToygerFacade:立即开启"="立即开启";
"APBToygerFacade:刷脸仅在iOS8及以上版本可用"="刷脸仅在iOS8及以上版本可用";
"APBToygerFacade:系统错误"="系统错误";
"APBToygerFacade:确定退出吗?"="确定退出吗?";
"APBToygerFacade:露个脸就能通过"="露个脸就能通过";
"APBToygerFacade:操作超时"="操作超时";
"APBToygerFacade:正对手机,更容易成功"="正对手机,更容易成功";
"APBToygerFacade:本次操作失败"="本次操作失败";
"APBToygerFacade:网络不给力"="网络不给力";
"APBToygerFacade:登录中断"="登录中断";
"APBToygerFacade:验证中断"="验证中断";
"APBToygerFacade:刷脸验证"="刷脸验证";
"APBToygerFacade:请把脸放入框内保持不动"="请把脸移入圈内保持不动";
"APBToygerFacade:靠近一点"="靠近一点";
"APBToygerFacade:没有检测到脸"="没有检测到脸";
"APBToygerFacade:再清晰一点"="再清晰一点";
"APBToygerFacade:脸部亮一点"="脸部亮一点";
"APBToygerFacade:请正对手机"="请正对手机";
"APBToygerFacade:请露出正脸"="请露出正脸";
"APBToygerFacade:把脸移入圈内"="把脸移入圈内";
"APBToygerFacade:离远一点"="离远一点";
"APBToygerFacade:请保持不动"="请保持不动";
"APBToygerFacade:请注视屏幕"="请注视屏幕";
"APBToygerFacade:眨眨眼"="眨眨眼";
"APBToygerFacade:蚂蚁佐罗提供技术支持"="";
"APBToygerFacade:选择其他验证方式"="选择其他验证方式";
"APBToygerFacade:拿起手机眨眨眼"="拿起手机,眨眨眼";
"APBToygerFacade:拿起手机向左摇头"="拿起手机,向左摇头";
"APBToygerFacade:拿起手机向右摇头"="拿起手机,向右摇头";
"APBToygerFacade:正在处理"="正在处理";
"APBToygerFacade:首次使用,请开通刷脸"="首次使用,请开通刷脸";
"APBToygerFacade:立即开通"="立即开通";
"APBToygerFacade:下次再说"="下次再说";
"APBToygerFacade:请把手机正对面部"="请把手机正对面部";
"APBToygerFacade:即将开始人脸检测"="即将开始人脸检测";
"APBToygerFacade:没有认出你"="没有认出你";
"APBToygerFacade:未能识别人脸"="未能识别人脸";
"APBToygerFacade:人脸检测中"="人脸检测中";
"APBToygerFacade:刷脸失败次数过多,请稍后再试"="刷脸失败次数过多,请稍后再试";
/*
zh-Hant.strings
APBToygerFacade
Created by shouyi.www on 2017/6/1.
Copyright © 2017年 DTF. All rights reserved.
*/
"APBToygerFacade:取消"="取消";
"APBToygerFacade:再试一次"="再試一次";
"APBToygerFacade:退出"="退出";
"APBToygerFacade:确定"="確定";
"APBToygerFacade:继续"="繼續";
"APBToygerFacade:我知道了"="我知道了";
"APBToygerFacade:其他登录方式"="其他登入方式";
"APBToygerFacade:刷脸失败"="刷臉失敗";
"APBToygerFacade:当前设备不支持刷脸"="目前設備不支援刷臉服務";
"APBToygerFacade:当前系统不支持刷脸"="当前系统不支持刷脸";
"APBToygerFacade:无法启动相机"="無法啟動相機";
"APBToygerFacade:请到\“设置-隐私-相机\”开启权限"="請到“設置-隱私-相機”開啓權限";
"APBToygerFacade:立即开启"="開通權限";
"APBToygerFacade:刷脸仅在iOS8及以上系统可用"="刷脸仅在iOS8及以上系统可用";
"APBToygerFacade:系统错误"="系統錯誤";
"APBToygerFacade:确定退出吗?"="確定退出嗎?";
"APBToygerFacade:露个脸就能通过"="露個臉就能通過";
"APBToygerFacade:操作超时"="操作超時";
"APBToygerFacade:正对手机,更容易成功"="對準手機,更容易成功";
"APBToygerFacade:本次操作失败"="本次操作失敗";
"APBToygerFacade:网络不给力"="網絡異常,請稍後再試";
"APBToygerFacade:登录中断"="登入中斷";
"APBToygerFacade:验证中断"="驗證中斷";
"APBToygerFacade:刷脸验证"="刷臉驗證";
"APBToygerFacade:请把脸放入框内保持不动"="請把臉移入圈內保持不動";
"APBToygerFacade:靠近一点"="靠近一點";
"APBToygerFacade:没有检测到脸"="沒有檢測到臉";
"APBToygerFacade:再清晰一点"="再清晰一點";
"APBToygerFacade:脸部亮一点"="光線再亮點";
"APBToygerFacade:请正对手机"="請正視手機";
"APBToygerFacade:请露出正脸"="請露出正臉";
"APBToygerFacade:把脸移入圈内"="把臉移入框內";
"APBToygerFacade:离远一点"="離遠一點";
"APBToygerFacade:请保持不动"="請保持不動";
"APBToygerFacade:请注视屏幕"="請注視屏幕";
"APBToygerFacade:眨眨眼"="眨眨眼";
"APBToygerFacade:蚂蚁佐罗提供技术支持"="";
"APBToygerFacade:选择其他验证方式"="選擇其他驗證方式";
"APBToygerFacade:拿起手机眨眨眼"="拿起手機,眨眨眼";
"APBToygerFacade:拿起手机向左摇头"="拿起手機,向左搖頭";
"APBToygerFacade:拿起手机向右摇头"="拿起手機,向右搖頭";
"APBToygerFacade:正在处理"="正在處理";
"APBToygerFacade:首次使用,请开通刷脸"="首次使用,請開通刷臉";
"APBToygerFacade:立即开通"="立即開通";
"APBToygerFacade:下次再说"="下次再說";
"APBToygerFacade:请把手机正对面部"="請把手機正對面部";
"APBToygerFacade:即将开始人脸检测"="即將開始人臉檢測";
"APBToygerFacade:没有认出你"="沒有認出你";
"APBToygerFacade:未能识别人脸"="未能識別人臉";
"APBToygerFacade:人脸检测中"="人臉檢測中";
"APBToygerFacade:刷脸失败次数过多,请稍后再试"="刷臉失敗次數過多,請稍後再試";
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论