diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.editorconfig @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml new file mode 100644 index 0000000..ccc76b8 --- /dev/null +++ b/.github/workflows/nodejs.yml @@ -0,0 +1,22 @@ +# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created +# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages +name: npm-publish +on: + push: + branches: + - master # Change this to your default branch +jobs: + npm-publish: + name: npm-publish + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@master + - name: Set up Node.js + uses: actions/setup-node@master + with: + node-version: 10.0.0 + registry-url: https://registry.npmjs.org/ + - run: npm publish + env: # More info about the environment variables in the README + NODE_AUTH_TOKEN: ${{secrets.NPM_AUTH_TOKEN}} # You need to set this in your repo settings diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e77d958 --- /dev/null +++ b/.gitignore @@ -0,0 +1,210 @@ +### Android template +# Built application files +*.apk +*.ap_ + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/dictionaries +.idea/libraries + +# Keystore files +# Uncomment the following line if you do not want to check your keystore files in. +#*.jks + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ +cmake-build-release/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### VisualStudioCode template +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +### Xcode template +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +### Node template +# Logs +logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# next.js build output +.next + +### Customize +package-lock.json +yarn.lock +*.qshell +*.DS_Store + +*.gitattributes +.idea +index.android.bundle diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..681f41a --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,116 @@ + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+
+
\ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.npmignore b/.npmignore index 025ce37..5a789f3 100644 --- a/.npmignore +++ b/.npmignore @@ -1,30 +1,2 @@ -# Xcode -# -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate - example/ - -README.md - -## Build generated -document/ -node_modules/ -.idea/ -.gradle/ -.DS_Store -/**/build/ \ No newline at end of file +.github/ \ No newline at end of file diff --git "a/API\350\257\246\347\273\206\350\257\264\346\230\216.md" "b/API\350\257\246\347\273\206\350\257\264\346\230\216.md" new file mode 100644 index 0000000..036bb07 --- /dev/null +++ "b/API\350\257\246\347\273\206\350\257\264\346\230\216.md" @@ -0,0 +1,548 @@ + +# JVerification React Native API + +## 引用方式 +```javascript +import React from 'react'; +import JVerification from 'jverification-react-native'; +``` + +## 设置 debug 模式 + +### API -setLoggerEnable(enable) +开启 debug 模式,请在初始化前调用 +#### 接口定义 +```javascript +static setLoggerEnable(enable) { + if (Platform.OS == 'android') { + JVerificationModule.setDebugMode(enable); + } else { + JVerificationModule.setDebug(enable); + } +} +``` + +#### 参数说明 +- true - 开启,false - 关闭 + +#### 示例 +```javascript +JVerification.setLoggerEnable(true); +``` + +## 初始化 + +### API - init(params, callback) +初始化接口 +#### 接口定义 +```javascript +static init(params, callback) { + if (Platform.OS == 'android') { + JVerificationModule.init(params, callback); + } else { + JVerificationModule.setupWithConfig(params, callback); + } +} +``` + +#### 参数说明 +- params 字典 +{'time':int,'appkey':String,'channel':String,'advertisingId':String,'isProduction':boolean} + +|参数名称|参数类型|参数说明| +|:-----:|:----:|:-----:| +|time|int|设置初始化超时时间,单位毫秒,合法范围是(0,30000],推荐设置为 5000-10000,默认值为 10000。| +|isProduction|boolean|是否生产环境。如果为开发状态,设置为 false;如果为生产状态,应改为 true。可选,默认为 false。(仅作用与 iOS)| +|channel |string|应用发布渠道,可选 (仅作用与 iOS)| +|advertisingId|string|广告标识符,可选。(仅作用与 iOS)| + +- callback 回调 类型字典 {"code":int,'content':String} +|参数名称|参数类型|参数说明| +|:-----:|:----:|:-----:| +|code|int| 错误码| +|content|string| 详细信息说明| + +#### 示例 +```javascript +const initParams = { + 'time': 5000, + 'appKey': 'a0e6ace8d5b3e0247e3f58db', //仅iOS + 'channel': 'channel', //仅iOS + 'advertisingId': 'advertisingId', //仅iOS + 'isProduction': false, //仅iOS +}; + +JVerification.init(initParams, result => { + console.log('init:' + JSON.stringify(result)); +}) + +``` + +## 获取初始化状态 + +### API - isInitSuccess(callback) +初始化是否成功 +#### 接口定义 +```javascript +static isInitSuccess(callback) { + if (Platform.OS == 'android') { + JVerificationModule.isInitSuccess(callback); + } else { + JVerificationModule.isSetupClient(callback); + } +} +``` +#### 参数说明 +callback = (result) => {"enable":boolean} + +#### 示例 +```javascript +JVerification.isInitSuccess(result => + console.log('isInitSuccess:' + JSON.stringify(result)) +) +``` + +## 判断网络环境是否支持 + +### API - checkLoginEnable(callback) +判断当前网络环境是否可以发起认证 +#### 接口定义 +```javascript +static checkLoginEnable(callback) { + if (Platform.OS == 'android') { + JVerificationModule.checkVerifyEnable(callback); + } else { + JVerificationModule.checkVerifyEnable(callback); + } +} +``` +#### 参数说明 +callback = (result) => {"enable":boolean} + +#### 示例 +```javascript +JVerification.checkLoginEnable(result => + console.log('checkLoginEnable:' + JSON.stringify(result)) +) +``` + +## SDK获取号码认证token + +### API - getToken(time, callback) + 获取手机号校验token +#### 接口定义 +```javascript +static getToken(time, callback) { + JVerificationModule.getToken(time, callback); +} +``` + +#### 参数说明 +- time:设置初始化超时时间,单位毫秒,合法范围是(0,10000],推荐设置为 5000-10000,默认值为 5000。 + +#### 示例 +```javascript +JVerification.getToken(5000, result => { + console.log('getToken:' + JSON.stringify(result)); +}) +``` + +## 登录预取号 + +### API - preLogin(time, callback) +验证当前运营商网络是否可以进行一键登录操作,该方法会缓存取号信息,提高一键登录效率。建议发起一键登录前先调用此方法。 +#### 接口定义 +```javascript +static preLogin(time, callback) { + JVerificationModule.preLogin(time, callback); +} +``` + +#### 参数说明 +- time:设置初始化超时时间,单位毫秒,合法范围是(0,30000],推荐设置为 5000-10000,默认值为 10000。 +- callback = (result) => {"code":int,'content':String} code:返回码,7000代表获取成功,其他为失败,详见错误码描述; content:调用结果信息描述 + +#### 示例 +```javascript +JVerification.preLogin(5000, result => { + console.log('preLogin:' + JSON.stringify(result)); +}) + +``` + + +## 清除预取号缓存 + +### API - clearPreLoginCache( ) +清除预取号缓存。 + +#### 接口定义 +```javascript +static clearPreLoginCache() { + JVerificationModule.clearPreLoginCache(); +} +``` + +#### 示例 +```javascript + JVerification.clearPreLoginCache() +``` + +## 请求授权一键登录 +注意项说明 +- 一键登录需要依赖预取号结果,如果没有预取号,一键登录时会自动预取号。 +- 建议拉起授权页前,比如在开屏页或者业务入口页预先调用此接口进行预取号,可以提升授权页拉起速度,优化体验。 +- 一键登录请求成功后,不要频繁重复调用。运营商会限制单位时间内请求次数。 +- 不要在一键登录回调中重复调用预取号或者拉起授权页接口。 + +### API - login(enable) +调起一键登录授权页面,在用户授权后获取 loginToken,同时支持授权页事件监听。 +#### 接口定义 +```javascript +static login(enable) { + if (Platform.OS == 'android') { + JVerificationModule.loginAuth(enable); + } else { + JVerificationModule.getAuthorizationWithController(enable); + } +} +``` +#### 参数说明 +- enable: boolean, 是否自动关闭授权页,true - 是,false - 否;若此字段设置为false,请在收到一键登录回调后调用SDK提供的关闭授权页面方法 + +#### 示例 +```javascript + JVerification.login(true); +``` +## 一键登录事件监听 +### API - addLoginEventListener(callback) +#### 接口定义 + ```javascript + //添加一键登录事件监听 + static addLoginEventListener(callback) { + listeners[callback] = DeviceEventEmitter.addListener( + LoginEvent, result => { + callback(result); + }); + } + + //移除事件 + static removeListener(callback) { + if (!listeners[callback]) { + return; + } + listeners[callback].remove(); + listeners[callback] = null; + } + ``` + #### 参数说明 + - 参数 callback = result => {'code':int,'content':String,'operator':String} + + #### 示例 + ``` + this.LoginListener = result => { + console.log('LoginListener:' + JSON.stringify(result)); + }; + JVerification.addLoginEventListener(this.LoginListener); + ``` + + +## API - dismissLoginPage( ) +隐藏登录页.当授权页被拉起以后,可调用此接口隐藏授权页。当一键登录自动隐藏授权页时,不建议调用此接口。 +#### 接口定义 +```javascript +static dismissLoginPage() { + if (Platform.OS == 'android') { + JVerificationModule.dismissLoginAuthActivity(); + } + else { + JVerificationModule.dismissLoginController(); + } +} +``` +#### 示例 +```javascript + JVerification.dismissLoginPage() +``` + +## 获取短信验证码 + +### API - getVerifyCode(params,callback) +- 获取短信验证码,使用此功能需要在Portal控制台中极光短信模块添加短信签名和验证码短信模版,或者使用默认的签名或模版。详见:[操作指南](https://docs.jiguang.cn//jsms/guideline/JSMS_consoleguide/#_3) +- 通过此接口获得到短信验证码后,需要调用极光验证码验证API来进行验证,详见:[验证码验证 API](https://docs.jiguang.cn//jsms/server/rest_api_jsms/#api_3) + +#### 接口定义 +```javascript + static getVerifyCode(params,callback) { + JVerificationModule.getSmsCode(params,callback); + } +``` +#### 参数说明 +- params = {'phoneNumber':String,'signID':String,'templateID':String} + +|参数名称|参数类型|参数说明| +|:-----:|:----:|:-----:| +|phoneNumber|string|电话号码| +|signID|string|短信签名ID,如果为nil,则为默认短信签名ID| +|templateID|string|短信模板ID,如果为nil,则为默认短信模板ID| + +#### 示例 +```javascript +const codeConfig = { + phoneNumber : "18925241111", //在此替换你的phoneNumber + signID : "1", //在此替换你的signID + templateID : "1" //在此替换你的templateID +}; + +JVerification.getVerifyCode(codeConfig, result => { + console.log('获取验证码:' + JSON.stringify(result)); +})} +``` + +## 设置前后两次获取验证码的时间间隔 + +### API - setCodeTime(time) +设置前后两次获取验证码的时间间隔。 +#### 接口定义 +```javascript +static setCodeTime(time) { + JVerificationModule.setTimeWithConfig(time); +} +``` + +#### 参数说明 +- time:默认30000ms,有效范围(0,300000)。 + +#### 示例 +```javascript +JVerification.setCodeTime(10000); +``` + +## 自定义认证SDK授权页面UI样式布局 +iOS 页面和 Android页面可以分开设置,详细API文档 参考[授权页面元素配置说明](认证SDK授权页面元素配置API说明.md) + +### API - addLoginCustomConfig 统一设置授权页面元素配置,需在 login 接口之前调用。 + +#### 接口定义 + +```javascript +static addLoginCustomConfig(customConfigParams, customViewParams) { + if (Platform.OS == 'android') { + JVerificationModule.setCustomUIWithConfig(customConfigParams, customViewParams); + } else { + JVerificationModule.customUIWithConfig(customConfigParams, customViewParams); + } +} +``` +#### 参数说明 ++ customConfigParams 授权页元素设置,详细使用参考[授权页面元素配置说明](认证SDK授权页面元素配置API说明.md) ++ customViewParams 自定义RN 视图元素,时候参考demo + +#### 示例 +``` +//一键登录页面自定义配置,需要在调用login之前设置,全屏模式 +const customConfigParams = { + backgroundImage: '', //背景图 + + statusBarHidden: false, //状态栏是否隐藏 + statusBarMode: 'light', //状态栏模式 light,dark + + navHidden: false, //导航栏是否隐藏 + navColor: -16777216, //导航栏颜色 + + navTitle: 'RN-JVerification', //导航栏标题 + navTitleSize: 16, //导航栏标题文字字体大小(单位:sp) + navTitleColor: -1, //导航栏标题文字颜色 + + navReturnHidden: false, //导航栏返回按钮是否隐藏 + navReturnImage: 'close', //导航栏左侧返回按钮图标 + //为保障显示效果,请同时设置x,y,w,h + // navReturnX: 10, //导航栏左侧返回按钮图标距屏幕上端偏移(仅Android) + // navReturnY: 10, //导航栏左侧返回按钮图标距屏幕左侧偏移(仅Android) + // navReturnW: 30, //导航栏左侧返回按钮图标宽度(仅Android) + // navReturnH: 30, //导航栏左侧返回按钮图标高度(仅Android) + + logoHidden: false, //logo是否隐藏 + logoImage: 'umcsdk_mobile_logo', //logo(android默认为应用图标;ios默认无) + //为保障显示效果,请同时设置x,y,w,h + //logoX: 50, //logo相对于屏幕左边x轴偏移 + //logoY: 50, //logo相对于标题栏下边缘y偏移 + //logoW: 250, //logo宽 + //logoH: 25, //logo高 + + numberSize: 16, //手机号码字体大小(单位:sp) + numberColor: -16777216, //手机号码字体颜色 + //为保障显示效果,请同时设置x,y,w,h + //numberX: 50, //号码栏相对于屏幕左边x轴偏移 + //numberY: 100, //号码栏相对于标题栏下边缘y偏移 + //numberW: 250, //号码栏宽度 + //numberH: 25, //号码栏高度 + + sloganHidden: false, //slogan是否隐藏 + sloganTextSize: 16, //slogan字体大小 + sloganTextColor: -16777216, //slogan文字颜色 + //为保障显示效果,请同时设置x,y,w,h + //sloganX: 50, //slogan相对于屏幕左边x轴偏移 + //sloganY: 150, //slogan相对于标题栏下边缘y偏移 + //sloganW: 250, //slogan宽度 (仅iOS) + //sloganH: 25, //slogan高度 (仅iOS) + + loginBtnText: '登录按钮', //登录按钮文字 + loginBtnTextSize: 16, //登录按钮字体大小 + loginBtnTextColor: -16777216, //登录按钮文字颜色 + + loginBtnImage: 'login_btn_selector', //登录按钮selector选择样式 (仅android) + loginBtnNormalImage: 'loginBtn_Nor', //登录按钮正常图片 (仅ios,三个同时设置生效) + loginBtnDisabledImage: 'loginBtn_Dis', //登录按钮失效图片 (仅ios,三个同时设置生效) + loginBtnSelectedImage: 'loginBtn_Hig', //登录按钮按下图片 (仅ios,三个同时设置生效) + //为保障显示效果,请同时设置x,y,w,h + //loginBtnX: 50, //登录按钮相对于屏幕左边x轴偏移 + //loginBtnY: 200, //登录按钮相对于标题栏下边缘y偏移 + //loginBtnW: 250, //登录按钮宽度 + //loginBtnH: 25, //登录按钮高度 + + privacyOne: ['隐私条款一', 'https://www.jiguang.cn/about'], //隐私条款一(显示名称和url,请严格按照格式) + privacyTwo: ['隐私条款二', 'https://www.jiguang.cn/about'], //隐私条款二(显示名称和url,请严格按照格式) + privacyColor: [-16777216, -65536], //隐私条款颜色 (显示名称和url的颜色,请严格按照格式) + privacyText: ['登录即同意', '和', '、', '并使用本机号码登录'], //隐私条款名称外的文字 + privacyTextSize: 15, //隐私条款文字字体大小 + privacyTextGravityMode: 'left', //隐私条款文本对齐方式,目前仅支持 left、center + privacyBookSymbolEnable: false, //隐私条款是否显示书名号,默认不显示 + //为保障显示效果,请同时设置x,y,w,h + // privacyX:50, //隐私条款相对于屏幕左边x轴偏移 + // privacyY:20, //隐私条款相对于授权页面底部下边缘y偏移 + // privacyW:200, //隐私条款宽度 + // privacyH:100, //隐私条款高度 + + privacyCheckboxHidden: false, //checkBox是否隐藏,默认不隐藏 + privacyCheckEnable: false, //checkBox默认状态 默认:NO + privacyCheckedImage: 'checkbox_selected', //checkBox选中时图片 + privacyUncheckedImage: 'checkbox_unSelected', //checkBox未选中时图片 + privacyCheckboxSize:10, //设置隐私条款checkbox尺寸 默认是10, 仅android + + privacyWebNavColor: -16777216, //协议页导航栏背景颜色 + privacyWebNavTitle: '服务条款', //协议页导航栏标题(仅iOS) + privacyWebNavTitleSize: 16, //协议页导航栏标题字体大小 + privacyWebNavTitleColor: -1, //协议页导航栏标题字体颜色 + privacyWebNavReturnImage: 'close', //协议页导航栏返回按钮图片 +}; +const customViewParams = [ + {customViewName: 'customView1', customViewPoint: [20, 200, 150, 30]}, + {customViewName: 'customView2', customViewPoint: [20, 300, 150, 30]}, + {customViewName: 'customView3', customViewPoint: [20, 400, 150, 30]}, +]; + +JVerification.addLoginCustomConfig(customConfigParams, customViewParams) + + +//弹窗模式: +const iosDialogConfig = { + navHidden:true, //导航栏是否隐藏 + logoImage: 'umcsdk_mobile_logo', //logo(android默认为应用图标;ios默认无) + logoConstraints:[0,-100,60,60], //LOGO图片布局对象 + logoHidden: false, //logo是否隐藏 + numberConstraints:[0,-42,200,14], //号码栏布局对象 + sloganConstraints:[0,-20,200,14], //slogan布局对象 + logBtnConstraints:[0,20,220,40], + loginBtnText: '登录按钮', //登录按钮文字 + loginBtnTextSize: 16, //登录按钮字体大小 + loginBtnTextColor: -16777216, //登录按钮文字颜色 + privacyConstraints:[0,100,200,40], //隐私条款布局对象 + checkViewConstraints:[-108,100,10,10], //checkBox布局对象 + loadingConstraints:[0,0,20,20], + showWindow:true, // 是否弹窗,默认no + windowBackgroundImage:"bg", // 弹框内部背景图片 + windowBackgroundAlpha: 0.3, //弹窗外侧 透明度 0~1.0 + windowCornerRadius:10, //弹窗圆角数值 + windowConstraints:[0,0,500,500], //弹窗布局对象 + windowCloseBtnImgs:["windowClose","windowClose"],//弹窗close按钮图片 @[普通状态图片,高亮状态图片] + windowCloseBtnConstraints:[0,-135,20,20],//弹窗close按钮布局, +} + +//安卓授权页弹窗模式 +const androidDialogConfig = { + privacyNeedClose:true, //弹窗是否需要关闭按钮 + privacyCloseTheme:[10, 60, 0, 0], //弹窗关闭按钮偏移量 privacyNeedClose为true时,必须设置它的偏移量 + privacyDialogTheme: [300, 400, 0, 0, false], //授权页弹窗模式 + privacyNeedStartAnim: true, //设置拉起授权页时是否需要显示默认动画 默认展示 + privacyNeedCloseAnim: true, //设置关闭授权页时是否需要显示默认动画 默认展示 + navColor:0xff000000, + loginBtnText:" 极光认证测试 ", + privacyCheckEnable:false, + privacyColor:[0xff00f000,0xff000000], + loginBtnWidth:40, + privacyOne: ['隐私条款一', 'https://www.jiguang.cn/about'], //隐私条款一(显示名称和url,请严格按照格式) + privacyColor: [-16777216, -65536], //隐私条款颜色 (显示名称和url的颜色,请严格按照格式) + privacyText: ['登录即同意', '和', '、', '并使用本机号码登录'], //隐私条款名称外的文字 + privacyTextSize: 12, +} + +if(Platform.OS == 'android'){ + JVerification.addLoginCustomConfig(androidDialogConfig, undefined); + } else { + JVerification.addLoginCustomConfig(iosDialogConfig, []); +} + + +``` + +#### API - addCustomViewsClickCallback +添加自定义 view 回调。配合 setCustomUIWithConfigAndroid 的 addCustomViews 属性一起使用 + +##### 示例 +```javascript +jv.addCustomViewsClickCallback(id=>{ + +}) +``` + + +## 错误码 + +|code|message|备注| +|:-----:|:----:|:-----:| +|1000|verify consistent|手机号验证一致| +|1001|verify not consistent|手机号验证不一致| +|1002|unknown result|未知结果| +|1003|token expired|token失效| +|1004|sdk verify has been closed|SDK 发起认证未开启| +|1005|包名和 AppKey 不匹配|请检查客户端配置的包名与官网对应 Appkey 应用下配置的包名是否一致| +|1006|frequency of verifying single number is beyond the maximum limit|同一号码自然日内认证消耗超过限制| +|1007|beyond daily frequency limit|appKey 自然日认证消耗超过限制| +|1008|AppKey 非法|请到官网检查此应用信息中的 appkey,确认无误| +|1009||请到官网检查此应用的应用详情;更新应用中集成的极光 SDK 至最新| +|1010|verify interval is less than the minimum limit|同一号码连续两次提交认证间隔过短| +|1011|appSign invalid|应用签名错误,检查签名与 Portal 设置的是否一致| +|2000|内容为token|获取 token 成功| +|2001|fetch token failed|获取 token 失败| +|2002|init failed|SDK 初始化失败| +|2003|network not reachable|网络连接不通| +|2004|get uid failed|极光服务注册失败| +|2005|request timeout|请求超时| +|2006|fetch config failed|获取应用配置失败| +|2007|内容为异常信息|验证遇到代码异常| +|2008|Token requesting, please try again later|正在获取 token 中,稍后再试| +|2009|verifying, please try again later|正在认证中,稍后再试 | +|2010|don't have READ_PHONE_STATE permission|未开启读取手机状态权限| +|2011|内容为异常信息|获取配置时代码异常| +|2012|内容为异常信息|获取 token 时代码异常| +|2013|内容为具体错误原因|网络发生异常| +|2014|internal error while requesting token|请求 token 时发生内部错误| +|2016|network type not supported|当前网络环境不支持认证| +|4001|parameter invalid|参数错误。请检查参数,比如是否手机号格式不对| +|4018||没有足够的余额| +|4031||不是认证 SDK 用户| +|4032||获取不到用户配置| +|4033|appkey is not support login|不是一键登录用户| +|5000|bad server|服务器未知错误| +|6000|内容为token|获取 loginToken 成功| +|6001|fetch loginToken failed|获取 loginToken 失败| +|6002|fetch loginToken canceled|用户取消获取 loginToken| +|6003|UI 资源加载异常|未正常添加 sdk 所需的资源文件| +|6004|authorization requesting, please try again later|正在登录中,稍后再试| +|7000|preLogin success|sdk 预取号成功| +|7001|preLogin failed|sdk 预取号失败| +|7002|preLogin requesting, please try again later|正在预取号中,稍后再试| +|-994|网络连接超时| | +|-996|网络连接断开| | +|-997|注册失败/登录失败|(一般是由于没有网络造成的)如果确保设备网络正常,还是一直遇到此问题,则还有另外一个原因:JPush 服务器端拒绝注册。而这个的原因一般是:你当前 App 的 Android 包名以及 AppKey,与你在 Portal 上注册的应用的 Android 包名与 AppKey 不相同。| diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d9c2c2f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,33 @@ +### v 2.4.8 +- android 更新到 2.7.2,iOS sdk更新到2.7.1 。 + +### v 2.4.7 +- 修复android偶现的崩溃问题。 + +### v 2.4.6 +- 1、修复android弹窗模式透明度问题。 +- 2、修复其他bug。 + +### v 2.4.5 +- android和iOS sdk更新到2.6.7 ,支持cheockBox未选中回调。补充相关认证授权页API说明文档。 + +### v 2.4.4 +- android增加弹窗自定义关闭按钮 + +### v 2.4.3 +- iOS、android增加弹窗登录 + +### v 2.4.2 +- 修复bug,优化体验 + +### v 2.4.1 +- 修复了安卓设置隐私文字大小无效 + +### v 2.4.0 +- 更新了原生sdk版本 +- 增加获取验证码,设置前后两次获取验证码时间间隔的功能 + +### v 2.3.0 +1.由于RN-JCore1.6.0存在编译问题,从RN-JCore1.7.0开始,还是需要在AndroidManifest.xml中添加配置代码,具体参考 配置-2.1 Android + +2.修复添加自定义布局问题 diff --git a/LICENSE b/LICENSE index 421628d..3ca19ec 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 极光开发者 +Copyright (c) 2019 极光开发者 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index a1f43b7..1119d9b 100644 --- a/README.md +++ b/README.md @@ -1,77 +1,95 @@ -# jverification-react-native +# JVerification-React-Native -极光官方开发的[极光认证](https://docs.jiguang.cn/jverification/guideline/intro/) react-native 插件,为开发者提供了快速验证用户输入的手机号码和本机 SIM 卡号码一致性的功能,提高用户体验和安全性。 - -## 安装 +## 1. 安装 ``` npm install jverification-react-native --save -npm install jcore-react-native --save -``` -## 链接 - -##### 通过脚手架生成的项目(react-native init): - -如果工程不是通过 Cocoapods 来集成 ReactNative 的可以直接使用下面代码来 link 插件。 - -``` -react-native link -``` - -##### 通过 Cocoapods 集成的 react-native 项目: - -如果想使用 Cocoapods 来集成这个项目,可以在 Podfile 中加入如下配置(如果没听过 Cocoapods 下面配置不用管。):**注意: (jverification-react-native@1.2.3+ 才支持该集成方式)** - -``` -pod 'JVerificationRN', :path => '../node_modules/jverification-react-native' ``` +* 注意:如果项目里没有jcore-react-native,需要安装 + ``` + npm install jcore-react-native --save + ``` -## 配置 +## 2. 配置 -#### iOS +### 2.1 Android -##### 通过 Cocoapods 方式集成不需要下列配置。 +* build.gradle -- 打开工程,进入 Build Settings -> Framework search paths 添加 framework 搜索路径 + ``` + android { + defaultConfig { + applicationId "yourApplicationId" //在此替换你的应用包名 + ... + manifestPlaceholders = [ + JPUSH_APPKEY: "yourAppKey", //在此替换你的APPKey + JPUSH_CHANNEL: "yourChannel" //在此替换你的channel + ] + } + } + ``` ``` - $(SRCROOT)/../node_modules/jverification-react-native/ios/RCTJVerificationModule + dependencies { + ... + implementation project(':jverification-react-native') // 添加 jverification 依赖 + implementation project(':jcore-react-native') // 添加 jcore 依赖 + } ``` -- 打开工程,进入 Build Settings -> Other Link Flag 添加一行编译选项 +* setting.gradle ``` - -framework "TYRZNoUISDK" - -framework "account_verify_sdk_core" + include ':jverification-react-native' + project(':jverification-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/jverification-react-native/android') + include ':jcore-react-native' + project(':jcore-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/jcore-react-native/android') ``` -#### Android - -- [Checkout settings.gradle and build.gradle](./docs/AndroidConfig.md) +### 2.2 iOS -- [Add JVerificationPackage, don't forget parameters!](./docs/JVerificationPackage.md) +### 2.2.1 pod -## API +``` +pod install +``` -#### Usage: +* 注意:如果项目里使用pod安装过,请先执行命令 -```javascript -import JVerification from 'jverification-react-native' + ``` + pod deintegrate + ``` + +### 2.2.2 配置AppKey -JVerification.init({ - appKey: '替换成极光官网注册的应用 appKey', - channel: 'the optional channel' - }); +* App.js ``` +const initParams = { + 'time': 5000, + 'appKey': 'yourAppKey', //仅iOS + 'channel': 'channel', //仅iOS + 'advertisingId': 'advertisingId', //仅iOS + 'isProduction': false, //仅iOS +}; +``` + +## 3. 引用 +参考:[App.js](https://github.com/jpush/jverification-react-native/tree/master/example/App.js) -> 注意: 需要先调用 JVerification.init 方法其他功能才能正常使用。 +## 4. API ++ API详细说明:[API详细说明.md](https://github.com/jpush/jverification-react-native/blob/master/API%E8%AF%A6%E7%BB%86%E8%AF%B4%E6%98%8E.md) ++ 授权页面元素配置说明:[认证SDK授权页面元素配置API说明.md](https://github.com/jpush/jverification-react-native/blob/master/%E8%AE%A4%E8%AF%81SDK%E6%8E%88%E6%9D%83%E9%A1%B5%E9%9D%A2%E5%85%83%E7%B4%A0%E9%85%8D%E7%BD%AEAPI%E8%AF%B4%E6%98%8E.md) ++ 示例详见:[index.js](https://github.com/jpush/jverification-react-native/tree/master/index.js) -接口说明参考: [index.js](./index.js) +## 5. 其他 -用法参考: [demo](./example/App.js) +* 集成前务必将example工程跑通 +* JVerification2.2.0属于重构版本,如有紧急需求请前往[极光社区](https://community.jiguang.cn/c/question) +* 上报问题还麻烦先调用JVerification.setLoggerEnable( true),拿到debug日志 + diff --git a/android/.gitignore b/android/.gitignore deleted file mode 100644 index e8fa30f..0000000 --- a/android/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build -*.iml diff --git a/android/.idea/.gitignore b/android/.idea/.gitignore new file mode 100644 index 0000000..0e40fe8 --- /dev/null +++ b/android/.idea/.gitignore @@ -0,0 +1,3 @@ + +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/android/.idea/codeStyles/Project.xml b/android/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..681f41a --- /dev/null +++ b/android/.idea/codeStyles/Project.xml @@ -0,0 +1,116 @@ + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+
+
\ No newline at end of file diff --git a/android/.idea/gradle.xml b/android/.idea/gradle.xml new file mode 100644 index 0000000..94873a8 --- /dev/null +++ b/android/.idea/gradle.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/android/.idea/modules.xml b/android/.idea/modules.xml new file mode 100644 index 0000000..9dddca5 --- /dev/null +++ b/android/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/.idea/vcs.xml b/android/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/android/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index e9f1558..6a9602e 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -5,36 +5,18 @@ def safeExtGet(prop, fallback) { } android { - compileSdkVersion safeExtGet('compileSdkVersion', 27) - buildToolsVersion safeExtGet('buildToolsVersion', '26.0.2') - - - + compileSdkVersion safeExtGet('compileSdkVersion', 29) + buildToolsVersion safeExtGet('buildToolsVersion', '29.0.0') defaultConfig { minSdkVersion safeExtGet('minSdkVersion', 16) - targetSdkVersion safeExtGet('targetSdkVersion', 27) - versionCode 1 - versionName "1.0" - - } - - lintOptions { - abortOnError false - warning 'InvalidPackage' + targetSdkVersion safeExtGet('targetSdkVersion', 29) } - sourceSets.main { jniLibs.srcDirs = ['libs'] } - -} - -repositories { - mavenCentral() } dependencies { -// api fileTree(include: ['*.jar'], dir: 'libs') - implementation "com.facebook.react:react-native:${safeExtGet('reactNativeVersion', '+')}" - implementation 'cn.jiguang.sdk:jverification:2.1.0' + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.facebook.react:react-native:+' } diff --git a/android/libs/arm64-v8a/libCtaApiLib.so b/android/libs/arm64-v8a/libCtaApiLib.so new file mode 100644 index 0000000..c490132 Binary files /dev/null and b/android/libs/arm64-v8a/libCtaApiLib.so differ diff --git a/android/libs/armeabi-v7a/libCtaApiLib.so b/android/libs/armeabi-v7a/libCtaApiLib.so new file mode 100644 index 0000000..5e1e0be Binary files /dev/null and b/android/libs/armeabi-v7a/libCtaApiLib.so differ diff --git a/android/libs/armeabi/libCtaApiLib.so b/android/libs/armeabi/libCtaApiLib.so new file mode 100644 index 0000000..0018d68 Binary files /dev/null and b/android/libs/armeabi/libCtaApiLib.so differ diff --git a/android/libs/jverification-android-release-2.7.2.jar b/android/libs/jverification-android-release-2.7.2.jar new file mode 100644 index 0000000..b1e747d Binary files /dev/null and b/android/libs/jverification-android-release-2.7.2.jar differ diff --git a/android/libs/x86/libCtaApiLib.so b/android/libs/x86/libCtaApiLib.so new file mode 100644 index 0000000..a311387 Binary files /dev/null and b/android/libs/x86/libCtaApiLib.so differ diff --git a/android/libs/x86_64/libCtaApiLib.so b/android/libs/x86_64/libCtaApiLib.so new file mode 100644 index 0000000..426c7fd Binary files /dev/null and b/android/libs/x86_64/libCtaApiLib.so differ diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 1280afc..a038bd6 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,19 +1,40 @@ - + package="cn.jiguang.plugins.verification"> + - - - - + + + + - + - + + + + + + + + + + + + + diff --git a/android/src/main/java/cn/jiguang/plugins/verification/JVerificationModule.java b/android/src/main/java/cn/jiguang/plugins/verification/JVerificationModule.java new file mode 100644 index 0000000..a8a4a87 --- /dev/null +++ b/android/src/main/java/cn/jiguang/plugins/verification/JVerificationModule.java @@ -0,0 +1,524 @@ +package cn.jiguang.plugins.verification; + +import android.app.Activity; +import android.text.TextUtils; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.ImageButton; +import android.view.ViewGroup; + +import com.facebook.react.ReactApplication; +import com.facebook.react.ReactRootView; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.Callback; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.WritableMap; +import com.facebook.react.modules.core.DeviceEventManagerModule; + +import java.lang.reflect.Field; + +import cn.jiguang.plugins.verification.common.JConstans; +import cn.jiguang.plugins.verification.common.JLogger; +import cn.jiguang.verifysdk.api.AuthPageEventListener; +import cn.jiguang.verifysdk.api.JVerificationInterface; +import cn.jiguang.verifysdk.api.JVerifyUIConfig; +import cn.jiguang.verifysdk.api.PreLoginListener; +import cn.jiguang.verifysdk.api.RequestCallback; +import cn.jiguang.verifysdk.api.VerifyListener; + +public class JVerificationModule extends ReactContextBaseJavaModule { + + private ReactApplicationContext reactContext; + private JVerifyUIConfig.Builder builder; + + public JVerificationModule(ReactApplicationContext reactContext) { + super(reactContext); + this.reactContext = reactContext; + } + + @Override + public String getName() { + return "JVerificationModule"; + } + + @ReactMethod + public void setDebugMode(boolean enable){ + JVerificationInterface.setDebugMode(enable); + JLogger.setLoggerEnable(enable); + } + + @ReactMethod + public void init(){ + JVerificationInterface.init(reactContext); + } + + @ReactMethod + public void init(ReadableMap readableMap, final Callback callback){ + int time = 10000; + if(readableMap!=null){ + time = readableMap.hasKey(JConstans.TIME)?readableMap.getInt(JConstans.TIME):5000; + } + JVerificationInterface.init(reactContext,time, new RequestCallback() { + @Override + public void onResult(int code, String content) { + if(callback==null)return; + callback.invoke(convertToResult(code,content)); + } + }); + } + + @ReactMethod + public void isInitSuccess(Callback callback){ + if(callback==null)return; + callback.invoke(convertToResult(JVerificationInterface.isInitSuccess())); + } + + @ReactMethod + public void checkVerifyEnable(Callback callback){ + if(callback==null)return; + callback.invoke(convertToResult(JVerificationInterface.checkVerifyEnable(reactContext))); + } + + @ReactMethod + public void getToken(int time, final Callback callback){ + JVerificationInterface.getToken(reactContext, time, new VerifyListener() { + @Override + public void onResult(int code, String content, String operator) { + if(callback==null)return; + callback.invoke(convertToResult(code,content,operator)); + } + }); + } + + @ReactMethod + public void preLogin(int time,final Callback callback){ + JVerificationInterface.preLogin(reactContext, time, new PreLoginListener() { + @Override + public void onResult(int code, String content) { + if(callback==null)return; + callback.invoke(convertToResult(code,content)); + } + }); + } + + @ReactMethod + public void clearPreLoginCache(){ + JVerificationInterface.clearPreLoginCache(); + } + + @ReactMethod + public void loginAuth(boolean enable){ + if(builder==null){ + builder = new JVerifyUIConfig.Builder(); + } + JVerificationInterface.setCustomUIWithConfig(builder.build()); + JVerificationInterface.loginAuth(reactContext, enable, new VerifyListener() { + @Override + public void onResult(int code, String content, String operator) { + sendEvent(JConstans.LOGIN_EVENT,convertToResult(code,content,operator)); + } + }, new AuthPageEventListener() { + @Override + public void onEvent(int code, String content) { + sendEvent(JConstans.LOGIN_EVENT,convertToResult(code,content)); + } + }); + } + + @ReactMethod + public void dismissLoginAuthActivity(){ + reactContext.runOnUiQueueThread(new Runnable() { + @Override + public void run() { + JVerificationInterface.dismissLoginAuthActivity(); + } + }); + + } + + @ReactMethod + public void setCustomUIWithConfig(final ReadableMap readableMap, final ReadableArray readableArray){ + builder = null; + System.out.println("readableMap>>>:"+readableMap); + convertToConfig(readableMap); + reactContext.runOnUiQueueThread(new Runnable() { + @Override + public void run() { + if(readableArray==null){ + JLogger.w(JConstans.PARAMS_NULL); + return; + } + for (int i = 0;i() { + @Override + public void onResult(int code, String msg) { + if (jsCallback == null) return; + WritableMap result = Arguments.createMap(); + result.putInt("code", code); + if(code == 3000) { + result.putString("uuid", msg); + result.putString("msg", ""); + } else { + result.putString("uuid", ""); + result.putString("msg", msg); + } + jsCallback.invoke(result); + } + }); + } + // 设置前后两次获取验证码的时间间隔 + @ReactMethod + public void setTimeWithConfig(int time){ + JVerificationInterface.setSmsIntervalTime(time); + } + + private void sendEvent(String eventName, WritableMap params) { + try { + reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName, params); + }catch (Throwable throwable){ + JLogger.e("sendEvent error:"+throwable.getMessage()); + } + } + + private WritableMap convertToResult(boolean enable){ + WritableMap writableMap = Arguments.createMap(); + writableMap.putBoolean(JConstans.ENABLE,enable); + return writableMap; + } + + private WritableMap convertToResult(int code,String content){ + WritableMap writableMap = Arguments.createMap(); + writableMap.putInt(JConstans.CODE,code); + writableMap.putString(JConstans.CONTENT,content); + return writableMap; + } + + private WritableMap convertToResult(int code,String content,String operator){ + WritableMap writableMap = Arguments.createMap(); + writableMap.putInt(JConstans.CODE,code); + writableMap.putString(JConstans.CONTENT,content); + writableMap.putString(JConstans.OPERATOR,operator); + return writableMap; + } + + private void convertToConfig(ReadableMap readableMap){ + if(builder==null){ + builder = new JVerifyUIConfig.Builder(); + } + //背景图 + if(readableMap.hasKey(JConstans.BACK_GROUND_IMAGE)){ + builder.setAuthBGImgPath(readableMap.getString(JConstans.BACK_GROUND_IMAGE)); + } + //状态栏 + if(readableMap.hasKey(JConstans.STATUS_BAR_HIDDEN)){ + builder.setStatusBarHidden(readableMap.getBoolean(JConstans.STATUS_BAR_HIDDEN)); + } + if(readableMap.hasKey(JConstans.STATUS_BAR_MODE)){ + if(readableMap.getString(JConstans.STATUS_BAR_MODE).equals(JConstans.STATUS_BAR_MODE_LIGHT)){ + builder.setStatusBarDarkMode(false); + }else if(readableMap.getString(JConstans.STATUS_BAR_MODE).equals(JConstans.STATUS_BAR_MODE_DARK)){ + builder.setStatusBarDarkMode(true); + }else { + builder.setStatusBarColorWithNav(true); + } + } + //导航栏 + if(readableMap.hasKey(JConstans.NAV_HIDDEN)){ + builder.setNavHidden(readableMap.getBoolean(JConstans.NAV_HIDDEN)); + } + if(readableMap.hasKey(JConstans.NAV_COLOR)){ + builder.setNavColor(readableMap.getInt(JConstans.NAV_COLOR)); + } + if(readableMap.hasKey(JConstans.NAV_TITLE)){ + builder.setNavText(readableMap.getString(JConstans.NAV_TITLE)); + } + if(readableMap.hasKey(JConstans.NAV_TITLE_SIZE)){ + builder.setNavTextSize(readableMap.getInt(JConstans.NAV_TITLE_SIZE)); + } + if(readableMap.hasKey(JConstans.NAV_TITLE_COLOR)){ + builder.setNavTextColor(readableMap.getInt(JConstans.NAV_TITLE_COLOR)); + } + if(readableMap.hasKey(JConstans.NAV_RETURN_BTN_HIDDEN)){ + builder.setNavReturnBtnHidden(readableMap.getBoolean(JConstans.NAV_RETURN_BTN_HIDDEN)); + } + if(readableMap.hasKey(JConstans.NAV_RETURN_BTN_IMAGE)){ + builder.setNavReturnImgPath(readableMap.getString(JConstans.NAV_RETURN_BTN_IMAGE)); + } + if(readableMap.hasKey(JConstans.NAV_RETURN_BTN_X)){ + builder.setNavReturnBtnOffsetX(dp2Pix(readableMap.getInt(JConstans.NAV_RETURN_BTN_X))); + } + if(readableMap.hasKey(JConstans.NAV_RETURN_BTN_Y)){ + builder.setNavReturnBtnOffsetY(dp2Pix(readableMap.getInt(JConstans.NAV_RETURN_BTN_Y))); + } + if(readableMap.hasKey(JConstans.NAV_RETURN_BTN_W)){ + builder.setNavReturnBtnWidth(dp2Pix(readableMap.getInt(JConstans.NAV_RETURN_BTN_W))); + } + if(readableMap.hasKey(JConstans.NAV_RETURN_BTN_H)){ + builder.setNavReturnBtnHeight(dp2Pix(readableMap.getInt(JConstans.NAV_RETURN_BTN_H))); + } + //logo + if(readableMap.hasKey(JConstans.LOGO_HIDDEN)){ + builder.setLogoHidden(readableMap.getBoolean(JConstans.LOGO_HIDDEN)); + } + if(readableMap.hasKey(JConstans.LOGO_IMAGE)){ + builder.setLogoImgPath(readableMap.getString(JConstans.LOGO_IMAGE)); + } + if(readableMap.hasKey(JConstans.LOGO_X)){ + builder.setLogoOffsetX(dp2Pix(readableMap.getInt(JConstans.LOGO_X))); + } + if(readableMap.hasKey(JConstans.LOGO_Y)){ + builder.setLogoOffsetY(dp2Pix(readableMap.getInt(JConstans.LOGO_Y))); + } + if(readableMap.hasKey(JConstans.LOGO_W)){ + builder.setLogoWidth(dp2Pix(readableMap.getInt(JConstans.LOGO_W))); + } + if(readableMap.hasKey(JConstans.LOGO_H)){ + builder.setLogoHeight(dp2Pix(readableMap.getInt(JConstans.LOGO_H))); + } + //号码 + if(readableMap.hasKey(JConstans.NUMBER_SIZE)){ + builder.setNumberSize(readableMap.getInt(JConstans.NUMBER_SIZE)); + } + if(readableMap.hasKey(JConstans.NUMBER_COLOR)){ + builder.setNumberColor(readableMap.getInt(JConstans.NUMBER_COLOR)); + } + if(readableMap.hasKey(JConstans.NUMBER_X)){ + builder.setNumFieldOffsetX(dp2Pix(readableMap.getInt(JConstans.NUMBER_X))); + } + if(readableMap.hasKey(JConstans.NUMBER_Y)){ + builder.setNumFieldOffsetY(dp2Pix(readableMap.getInt(JConstans.NUMBER_Y))); + } + if(readableMap.hasKey(JConstans.NUMBER_W)){ + builder.setNumberFieldWidth(dp2Pix(readableMap.getInt(JConstans.NUMBER_W))); + } + if(readableMap.hasKey(JConstans.NUMBER_H)){ + builder.setNumberFieldHeight(dp2Pix(readableMap.getInt(JConstans.NUMBER_H))); + } + //slogan + if(readableMap.hasKey(JConstans.SLOGAN_HIDDEN)){ + builder.setSloganHidden(readableMap.getBoolean(JConstans.SLOGAN_HIDDEN)); + } + if(readableMap.hasKey(JConstans.SLOGAN_TEXT_SIZE)){ + builder.setSloganTextSize(readableMap.getInt(JConstans.SLOGAN_TEXT_SIZE)); + } + if(readableMap.hasKey(JConstans.SLOGAN_TEXT_COLOR)){ + builder.setSloganTextColor(readableMap.getInt(JConstans.SLOGAN_TEXT_COLOR)); + } + if(readableMap.hasKey(JConstans.SLOGAN_X)){ + builder.setSloganOffsetX(dp2Pix(readableMap.getInt(JConstans.SLOGAN_X))); + } + if(readableMap.hasKey(JConstans.SLOGAN_Y)){ + builder.setSloganOffsetY(dp2Pix(readableMap.getInt(JConstans.SLOGAN_Y))); + } + //登录按钮 + if(readableMap.hasKey(JConstans.LOGIN_BTN_TEXT)){ + builder.setLogBtnText(readableMap.getString(JConstans.LOGIN_BTN_TEXT)); + } + if(readableMap.hasKey(JConstans.LOGIN_BTN_TEXT_SIZE)){ + builder.setLogBtnTextSize(readableMap.getInt(JConstans.LOGIN_BTN_TEXT_SIZE)); + } + if(readableMap.hasKey(JConstans.LOGIN_BTN_TEXT_COLOR)){ + builder.setLogBtnTextColor(readableMap.getInt(JConstans.LOGIN_BTN_TEXT_COLOR)); + } + if(readableMap.hasKey(JConstans.LOGIN_BTN_IMAGE_SELECTOR)){ + // TODO: + JLogger.w("setLogBtnImgPath:"+readableMap.getString(JConstans.LOGIN_BTN_IMAGE_SELECTOR)); + builder.setLogBtnImgPath(readableMap.getString(JConstans.LOGIN_BTN_IMAGE_SELECTOR)); + } + if(readableMap.hasKey(JConstans.LOGIN_BTN_X)){ + builder.setLogBtnOffsetX(dp2Pix(readableMap.getInt(JConstans.LOGIN_BTN_X))); + } + if(readableMap.hasKey(JConstans.LOGIN_BTN_Y)){ + builder.setLogBtnOffsetY(dp2Pix(readableMap.getInt(JConstans.LOGIN_BTN_Y))); + } + if(readableMap.hasKey(JConstans.LOGIN_BTN_W)){ + builder.setLogBtnWidth(dp2Pix(readableMap.getInt(JConstans.LOGIN_BTN_W))); + } + if(readableMap.hasKey(JConstans.LOGIN_BTN_H)){ + builder.setLogBtnHeight(dp2Pix(readableMap.getInt(JConstans.LOGIN_BTN_H))); + } + //协议 + if(readableMap.hasKey(JConstans.PRIVACY_ONE)){ + ReadableArray array = readableMap.getArray(JConstans.PRIVACY_ONE); + builder.setAppPrivacyOne(array.getString(0),array.getString(1)); + } + if(readableMap.hasKey(JConstans.PRIVACY_TWO)){ + ReadableArray array = readableMap.getArray(JConstans.PRIVACY_TWO); + builder.setAppPrivacyTwo(array.getString(0),array.getString(1)); + } + if(readableMap.hasKey(JConstans.PRIVACY_COLOR)){ + ReadableArray array = readableMap.getArray(JConstans.PRIVACY_COLOR); + builder.setAppPrivacyColor(array.getInt(0),array.getInt(1)); + } + if(readableMap.hasKey(JConstans.PRIVACY_TEXT)){ + ReadableArray array = readableMap.getArray(JConstans.PRIVACY_TEXT); + builder.setPrivacyText(array.getString(0),array.getString(1),array.getString(2),array.getString(3)); + } + if(readableMap.hasKey(JConstans.PRIVACY_TEXT_SIZE)){ + builder.setPrivacyTextSize(readableMap.getInt(JConstans.PRIVACY_TEXT_SIZE)); + } + if(readableMap.hasKey(JConstans.PRIVACY_W)){ + builder.setPrivacyTextWidth(dp2Pix(readableMap.getInt(JConstans.PRIVACY_W))); + } + if(readableMap.hasKey(JConstans.PRIVACY_TEXT_GRAVITY_MODE)){ + if(readableMap.getString(JConstans.PRIVACY_TEXT_GRAVITY_MODE).equals(JConstans.PRIVACY_TEXT_GRAVITY_CENTER)){ + builder.setPrivacyTextCenterGravity(true); + }else if(readableMap.getString(JConstans.PRIVACY_TEXT_GRAVITY_MODE).equals(JConstans.PRIVACY_TEXT_GRAVITY_LEFT)){ + builder.setPrivacyTextCenterGravity(false); + }else { + builder.setPrivacyTextCenterGravity(false); + } + } + if (readableMap.hasKey(JConstans.EnableHintToast)){ + boolean show = readableMap.getBoolean(JConstans.EnableHintToast); + if (show == true) { + builder.enableHintToast(true,null); + } + } + + + if(readableMap.hasKey(JConstans.PRIVACY_X)){ + builder.setPrivacyOffsetX(dp2Pix(readableMap.getInt(JConstans.PRIVACY_X))); + } + if(readableMap.hasKey(JConstans.PRIVACY_Y)){ + builder.setPrivacyOffsetY(dp2Pix(readableMap.getInt(JConstans.PRIVACY_Y))); + } + if(readableMap.hasKey(JConstans.PRIVACY_CHECKBOX_HIDDEN)){ + builder.setPrivacyCheckboxHidden(readableMap.getBoolean(JConstans.PRIVACY_CHECKBOX_HIDDEN)); + } + if(readableMap.hasKey(JConstans.PRIVACY_CHECKBOX_SIZE)){ + builder.setPrivacyCheckboxSize(readableMap.getInt(JConstans.PRIVACY_CHECKBOX_SIZE)); + } + if(readableMap.hasKey(JConstans.PRIVACY_CHECK_ENABLE)){ + builder.setPrivacyState(readableMap.getBoolean(JConstans.PRIVACY_CHECK_ENABLE)); + } + if(readableMap.hasKey(JConstans.PRIVACY_CHECKBOX_IMAGE)){ + builder.setCheckedImgPath(readableMap.getString(JConstans.PRIVACY_CHECKBOX_IMAGE)); + } + if(readableMap.hasKey(JConstans.PRIVACY_UNCHECKED_IMAGE)){ + builder.setUncheckedImgPath(readableMap.getString(JConstans.PRIVACY_UNCHECKED_IMAGE)); + } + if(readableMap.hasKey(JConstans.PRIVACY_BOOK_SYMBOL_ENABLE)){ + builder.setPrivacyWithBookTitleMark(readableMap.getBoolean(JConstans.PRIVACY_BOOK_SYMBOL_ENABLE)); + } + if(readableMap.hasKey(JConstans.PRIVACY_WEB_NAV_COLOR)){ + builder.setPrivacyNavColor(readableMap.getInt(JConstans.PRIVACY_WEB_NAV_COLOR)); + } + if(readableMap.hasKey(JConstans.PRIVACY_WEB_NAV_TITLE_SIZE)){ + builder.setPrivacyNavTitleTextSize(readableMap.getInt(JConstans.PRIVACY_WEB_NAV_TITLE_SIZE)); + } + if(readableMap.hasKey(JConstans.PRIVACY_WEB_NAV_TITLE_COLOR)){ + builder.setPrivacyNavTitleTextColor(readableMap.getInt(JConstans.PRIVACY_WEB_NAV_TITLE_COLOR)); + } + if(readableMap.hasKey(JConstans.PRIVACY_WEB_NAV_RETURN_IMAGE)){ + try { + String imageString = readableMap.getString(JConstans.PRIVACY_WEB_NAV_RETURN_IMAGE); + Class drawable = R.drawable.class; + Field field =drawable.getField(imageString); + int imageID = field.getInt(field.getName()); + ImageView view = new ImageView(reactContext); + view.setImageResource(imageID); + builder.setPrivacyNavReturnBtn(view); + }catch (Exception e){ + JLogger.e("setPrivacyWebNavReturnBtnImage error:"+e.getMessage()); + } + } + // 授权页动画 + if (readableMap.hasKey(JConstans.PRIVACY_NEED_START_ANIM)) { + builder.setNeedStartAnim(readableMap.getBoolean(JConstans.PRIVACY_NEED_START_ANIM)); + } + if (readableMap.hasKey(JConstans.PRIVACY_NEED_CLOSE_ANIM)) { + builder.setNeedCloseAnim(readableMap.getBoolean(JConstans.PRIVACY_NEED_CLOSE_ANIM)); + } + // 授权页弹窗模式 + if (readableMap.hasKey(JConstans.PRIVACY_DIALOG_THEME)) { + ReadableArray array = readableMap.getArray(JConstans.PRIVACY_DIALOG_THEME); + builder.setDialogTheme(array.getInt(0), array.getInt(1),array.getInt(2), array.getInt(3), array.getBoolean(4)); + } + // 弹窗是否需要关闭 + if (readableMap.hasKey(JConstans.PRIVACY_NEED_CLOSE) && readableMap.hasKey(JConstans.PRIVACY_CLOSE_THEME)) { + boolean needClose = readableMap.getBoolean(JConstans.PRIVACY_NEED_CLOSE); + if(needClose) { + //自定义返回按钮示例 + ImageButton sampleReturnBtn = new ImageButton(reactContext); + sampleReturnBtn.setImageResource(R.drawable.umcsdk_return_bg); + RelativeLayout.LayoutParams returnLP = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + // 返回按钮样式 + ReadableArray array = readableMap.hasKey(JConstans.PRIVACY_CLOSE_THEME) ? readableMap.getArray(JConstans.PRIVACY_CLOSE_THEME) : null; + returnLP.setMargins(array.getInt(0), array.getInt(1),array.getInt(2), array.getInt(3)); + sampleReturnBtn.setLayoutParams(returnLP); + builder.addCustomView(sampleReturnBtn,true,null); + } + } + + } + + private ReactRootView convertToView(ReadableMap readableMap){ + String viewName = readableMap.hasKey(JConstans.CUSTOM_VIEW_NAME) ? readableMap.getString(JConstans.CUSTOM_VIEW_NAME) : ""; + ReadableArray viewPoint = readableMap.hasKey(JConstans.CUSTOM_VIEW_POINT) ? readableMap.getArray(JConstans.CUSTOM_VIEW_POINT) : null; + JLogger.w("convertToView: viewName="+viewName); + if (TextUtils.isEmpty(viewName)) { + JLogger.e("viewName is null"); + return null; + } + ReactRootView reactView = new ReactRootView(reactContext); + Activity currentActivity = getCurrentActivity(); + if (currentActivity == null){ + JLogger.e("currentActivity is null"); + return null; + } + ReactApplication application = (ReactApplication)currentActivity.getApplication(); + if (application == null){ + JLogger.e("application is null"); + return null; + } + reactView.startReactApplication(application.getReactNativeHost().getReactInstanceManager(), viewName); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); + if (viewPoint != null) { + int x = dp2Pix(viewPoint.getInt(0)); + int y = dp2Pix(viewPoint.getInt(1)); + int w = dp2Pix(viewPoint.getInt(2)); + int h = dp2Pix(viewPoint.getInt(3)); + layoutParams.setMargins(x, y, 0, 0); + layoutParams.width = w; + layoutParams.height = h; + } + reactView.setLayoutParams(layoutParams); + return reactView; + } + + private int dp2Pix(float dp) { + try { + float density = reactContext.getApplicationContext().getResources().getDisplayMetrics().density; + return (int) (dp * density + 0.5F); + } catch (Exception e) { + return (int) dp; + } + } + +} diff --git a/android/src/main/java/cn/jpush/reactnativejvrification/JVerificationPackage.java b/android/src/main/java/cn/jiguang/plugins/verification/JVerificationPackage.java similarity index 73% rename from android/src/main/java/cn/jpush/reactnativejvrification/JVerificationPackage.java rename to android/src/main/java/cn/jiguang/plugins/verification/JVerificationPackage.java index bd4164d..7e3db07 100644 --- a/android/src/main/java/cn/jpush/reactnativejvrification/JVerificationPackage.java +++ b/android/src/main/java/cn/jiguang/plugins/verification/JVerificationPackage.java @@ -1,7 +1,9 @@ -package cn.jpush.reactnativejvrification; + +package cn.jiguang.plugins.verification; + +import android.graphics.Color; import com.facebook.react.ReactPackage; -import com.facebook.react.bridge.JavaScriptModule; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; @@ -12,16 +14,14 @@ public class JVerificationPackage implements ReactPackage { - @Override public List createNativeModules(ReactApplicationContext reactContext) { - return Arrays.asList(new NativeModule[]{ - new JVerificationModule(reactContext), - }); + return Arrays.asList(new JVerificationModule(reactContext)); } @Override public List createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } -} + +} \ No newline at end of file diff --git a/android/src/main/java/cn/jiguang/plugins/verification/common/JConstans.java b/android/src/main/java/cn/jiguang/plugins/verification/common/JConstans.java new file mode 100644 index 0000000..a25b919 --- /dev/null +++ b/android/src/main/java/cn/jiguang/plugins/verification/common/JConstans.java @@ -0,0 +1,115 @@ +package cn.jiguang.plugins.verification.common; + +public class JConstans { + + public static final String CODE = "code"; + public static final String TIME = "time"; + public static final String ENABLE = "enable"; + public static final String CONTENT = "content"; + public static final String OPERATOR = "operator"; + + public static final String LOGIN_EVENT = "LoginEvent"; + + public static final String PARAMS_NULL = "params cant be null"; + + //*******************************自定义登录页面******************************* + + public static final String BACK_GROUND_IMAGE = "backgroundImage"; //背景图 + + public static final String STATUS_BAR_HIDDEN = "statusBarHidden"; //状态栏是否隐藏 + public static final String STATUS_BAR_MODE = "statusBarMode"; //状态栏模式。light和dark + public static final String STATUS_BAR_MODE_LIGHT = "light"; //状态栏暗色模式。 + public static final String STATUS_BAR_MODE_DARK = "dark"; //状态栏暗色模式。仅在android 6.0以上设备生效。 + + public static final String NAV_HIDDEN = "navHidden"; //导航栏是否隐藏 + public static final String NAV_COLOR = "navColor"; //导航栏颜色 + + public static final String NAV_TITLE = "navTitle"; //导航栏标题 + public static final String NAV_TITLE_SIZE = "navTitleSize"; //导航栏标题文字字体大小(单位:sp) + public static final String NAV_TITLE_COLOR = "navTitleColor"; //导航栏标题文字颜色 + + public static final String NAV_RETURN_BTN_HIDDEN = "navReturnHidden"; //导航栏返回按钮是否隐藏 + public static final String NAV_RETURN_BTN_IMAGE = "navReturnImage"; //导航栏左侧返回按钮图标 + public static final String NAV_RETURN_BTN_X = "navReturnX"; //导航栏返回按钮距屏幕左侧偏移 + public static final String NAV_RETURN_BTN_Y = "navReturnY"; //导航栏返回按钮距上端偏移 + public static final String NAV_RETURN_BTN_W = "navReturnW"; //导航栏返回按钮宽度 + public static final String NAV_RETURN_BTN_H = "navReturnH"; //导航栏返回按钮高度 + + public static final String LOGO_HIDDEN = "logoHidden"; //logo是否隐藏 + public static final String LOGO_IMAGE = "logoImage"; //logo(android默认为应用图标;ios默认无) + public static final String LOGO_X = "logoX"; //logo相对于屏幕左边x轴偏移 + public static final String LOGO_Y = "logoY"; //logo相对于标题栏下边缘y偏移 + public static final String LOGO_W = "logoW"; //logo宽 + public static final String LOGO_H = "logoH"; //logo高 + + public static final String NUMBER_SIZE = "numberSize"; //手机号码字体大小(单位:sp) + public static final String NUMBER_COLOR = "numberColor"; //手机号码字体颜色 + public static final String NUMBER_X = "numberX"; //号码栏相对于屏幕左边x轴偏移 + public static final String NUMBER_Y = "numberY"; //号码栏相对于标题栏下边缘y偏移 + public static final String NUMBER_W = "numberW"; //号码栏宽度 + public static final String NUMBER_H = "numberH"; //号码栏高度 + + public static final String SLOGAN_HIDDEN = "sloganHidden"; //slogan是否隐藏 + public static final String SLOGAN_TEXT_SIZE = "sloganTextSize"; //slogan字体大小 + public static final String SLOGAN_TEXT_COLOR = "sloganTextColor"; //slogan文字颜色 + public static final String SLOGAN_X = "sloganX"; //slogan相对于屏幕左边x轴偏移 + public static final String SLOGAN_Y = "sloganY"; //slogan相对于标题栏下边缘y偏移 + + public static final String LOGIN_BTN_TEXT = "loginBtnText"; //登录按钮文字 + public static final String LOGIN_BTN_TEXT_SIZE = "loginBtnTextSize"; //登录按钮字体大小 + public static final String LOGIN_BTN_TEXT_COLOR = "loginBtnTextColor"; //登录按钮文字颜色 + public static final String LOGIN_BTN_IMAGE_SELECTOR = "loginBtnImageSelector"; //登录按钮selector选择样式 (仅android) + public static final String LOGIN_BTN_NORMAL_IMAGE = "loginBtnNormalImage"; //登录按钮正常图片 (仅ios,三个同时设置生效) + public static final String LOGIN_BTN_DISABLED_IMAGE = "loginBtnDisabledImage"; //登录按钮失效图片 (仅ios,三个同时设置生效 + public static final String LOGIN_BTN_SELECTED_IMAGE = "loginBtnSelectedImage"; //登录按钮按下图片 (仅ios,三个同时设置生效) + public static final String LOGIN_BTN_X = "loginBtnOffsetX"; //登录按钮相对于屏幕左边x轴偏移 + public static final String LOGIN_BTN_Y = "loginBtnOffsetY"; //登录按钮相对于标题栏下边缘y偏移 + public static final String LOGIN_BTN_W = "loginBtnWidth"; //登录按钮宽度 + public static final String LOGIN_BTN_H = "loginBtnHeight"; //登录按钮高度 + + public static final String PRIVACY_ONE = "privacyOne"; //隐私条款一 + public static final String PRIVACY_TWO = "privacyTwo"; //隐私条款二 + public static final String PRIVACY_COLOR = "privacyColor"; //隐私条款颜色 + public static final String PRIVACY_TEXT = "privacyText"; //隐私条款名称外的文字 + public static final String PRIVACY_TEXT_SIZE = "privacyTextSize"; //隐私条款文字字体大小 + public static final String PRIVACY_TEXT_GRAVITY_MODE = "privacyTextGravityMode"; //隐私条款文字是否居中对齐(默认左对齐) + public static final String PRIVACY_TEXT_GRAVITY_LEFT = "left"; //隐私条款文字是否居中对齐(默认左对齐) + public static final String PRIVACY_TEXT_GRAVITY_CENTER = "center"; //隐私条款文字是否居中对齐(默认左对齐) + public static final String PRIVACY_X = "privacyOffsetX"; //隐私条款相对于屏幕左边x轴偏移 + public static final String PRIVACY_Y = "privacyOffsetY"; //隐私条款相对于授权页面底部下边缘y偏移 + public static final String PRIVACY_W = "privacyW"; //隐私条款名称外的文字栏宽度(单位:dp) + public static final String PRIVACY_H = "privacyH"; //隐私条款名称外的文字栏高度度(单位:dp) + public static final String PRIVACY_BOOK_SYMBOL_ENABLE = "privacyBookSymbolEnable"; //隐私条款运营商协议名是否加书名号 + public static final String EnableHintToast = "unAgreePrivacyHintToast"; //导航栏颜色 + + public static final String PRIVACY_CHECKBOX_HIDDEN = "privacyCheckboxHidden"; //隐私条款checkbox是否隐藏 + public static final String PRIVACY_CHECKBOX_SIZE = "privacyCheckboxSize"; //设置隐私条款checkbox尺寸 + public static final String PRIVACY_CHECK_ENABLE = "privacyCheckEnable"; //隐私条款默认选中状态。默认不选中 + public static final String PRIVACY_CHECKBOX_IMAGE = "privacyCheckedImage"; //隐私条款复选框选中图片 + public static final String PRIVACY_UNCHECKED_IMAGE = "privacyUncheckedImage"; //隐私条款复选框未选中图片 + + public static final String PRIVACY_WEB_NAV_COLOR = "privacyWebNavColor"; //协议展示web页面导航栏背景颜色 + public static final String PRIVACY_WEB_NAV_TITLE = "privacyWebNavTitle"; //协议展示web页面导航栏标题(仅iOS) + public static final String PRIVACY_WEB_NAV_TITLE_SIZE = "privacyWebNavTitleSize"; //协议展示web页面导航栏标题文字大小 + public static final String PRIVACY_WEB_NAV_TITLE_COLOR = "privacyWebNavTitleColor"; //协议展示web页面导航栏标题文字颜色 + public static final String PRIVACY_WEB_NAV_RETURN_IMAGE = "privacyWebNavReturnImage"; //协议展示web页面导航栏返回按钮图标 + + public static final String CUSTOM_VIEW_NAME = "customViewName"; + public static final String CUSTOM_VIEW_POINT = "customViewPoint"; + + //*******************************验证码******************************* + public static final String PHONE_NUMBER = "phoneNumber"; + public static final String SING_ID = "signID"; + public static final String TEMPLATE_ID = "templateID"; + + // 授权页动画 + public static final String PRIVACY_NEED_START_ANIM = "privacyNeedStartAnim"; + public static final String PRIVACY_NEED_CLOSE_ANIM = "privacyNeedCloseAnim"; + // 授权页弹窗模式 + public static final String PRIVACY_DIALOG_THEME = "privacyDialogTheme"; + // 弹窗是否需要配置关闭按钮 + public static final String PRIVACY_NEED_CLOSE = "privacyNeedClose"; + // 弹窗关闭按钮模式 + public static final String PRIVACY_CLOSE_THEME = "privacyCloseTheme"; + +} diff --git a/android/src/main/java/cn/jiguang/plugins/verification/common/JLogger.java b/android/src/main/java/cn/jiguang/plugins/verification/common/JLogger.java new file mode 100644 index 0000000..f5fca7d --- /dev/null +++ b/android/src/main/java/cn/jiguang/plugins/verification/common/JLogger.java @@ -0,0 +1,48 @@ +package cn.jiguang.plugins.verification.common; + + +import android.util.Log; + +public class JLogger { + + public static final String TAG = "RN-JVerification"; + + private static boolean isLoggerEnable = false; + + public static void setLoggerEnable(boolean loggerEnable) { + Log.d(TAG, "setLoggerEnable:" + loggerEnable); + isLoggerEnable = loggerEnable; + } + + public static void i(String msg) { + if (isLoggerEnable) { + Log.i(TAG, msg); + } + } + + public static void d(String msg) { + if (isLoggerEnable) { + Log.d(TAG, msg); + } + } + + public static void v(String msg) { + if (isLoggerEnable) { + Log.v(TAG, msg); + } + } + + public static void w(String msg) { + if (isLoggerEnable) { + Log.w(TAG, msg); + } + } + + public static void e(String error) { + if (isLoggerEnable) { + Log.e(TAG, error); + } + } + +} + diff --git a/android/src/main/java/cn/jpush/reactnativejvrification/JVerificationConstant.java b/android/src/main/java/cn/jpush/reactnativejvrification/JVerificationConstant.java deleted file mode 100644 index 24c88bd..0000000 --- a/android/src/main/java/cn/jpush/reactnativejvrification/JVerificationConstant.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.jpush.reactnativejvrification; - -class JVerificationConstant { - //导航栏 - static final String NAV_COLOR = "navColor"; - static final String NAV_TEXT = "navText"; - static final String NAV_TEXT_COLOR = "navTextColor"; - static final String NAV_RETURN_IMAGE = "navReturnImage"; - //logo - static final String LOGO_HIDDEN = "logoHidden"; - static final String LOGO_Width = "logoWidth"; - static final String LOGO_Height = "logoHeight"; - static final String LOGO_Image = "logoImage"; - static final String LOGO_OFFSET_Y = "logoOffsetY"; - //手机号码 - static final String NUM_COLOR = "numColor"; - static final String NUM_OFFSET_Y = "numOffsetY"; - //slogan - static final String SLOGAN_TEXT_COLOR = "sloganTextColor"; - static final String SLOGAN_OFFSET_Y = "sloganOffsetY"; - //登录按钮 - static final String LOGIN_BTN_TEXT = "loginBtnText"; - static final String LOGIN_BTN_TEXT_COLOR = "loginBtnTextColor"; - static final String LOGIN_BTN_IMAGE = "loginBtnImage"; - static final String LOGIN_BTN_OFFSET_Y = "loginBtnOffsetY"; - //隐私条款 - static final String PRIVACY_ONE_NAME = "privacyOneName"; - static final String PRIVACY_ONE_URL = "privacyOneUrl"; - static final String PRIVACY_TWO_NAME = "privacyTwoName"; - static final String PRIVACY_TWO_URL = "privacyTwoUrl"; - static final String PRIVACY_BASIC_COLOR = "privacyBasicColor"; - static final String PRIVACY_PROTOCOL_COLOR = "privacyProtocolColor"; - static final String PRIVACY_CHECK_IMAGE = "privacyCheckImage"; - static final String PRIVACY_UNCHECK_IMAGE = "privacyUncheckImage"; - static final String PRIVACY_OFFSET_Y = "privacyOffsetY"; -} diff --git a/android/src/main/java/cn/jpush/reactnativejvrification/JVerificationModule.java b/android/src/main/java/cn/jpush/reactnativejvrification/JVerificationModule.java deleted file mode 100644 index debcf1e..0000000 --- a/android/src/main/java/cn/jpush/reactnativejvrification/JVerificationModule.java +++ /dev/null @@ -1,217 +0,0 @@ -package cn.jpush.reactnativejvrification; - -import android.Manifest; - -import com.facebook.react.bridge.Arguments; -import com.facebook.react.bridge.Callback; -import com.facebook.react.bridge.LifecycleEventListener; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; -import com.facebook.react.bridge.ReadableMap; -import com.facebook.react.bridge.WritableMap; - -import cn.jiguang.verifysdk.api.JVerificationInterface; -import cn.jiguang.verifysdk.api.JVerifyUIConfig; -import cn.jiguang.verifysdk.api.VerifyListener; -import cn.jpush.reactnativejvrification.utils.AndroidUtils; - -public class JVerificationModule extends ReactContextBaseJavaModule implements LifecycleEventListener { - - private static String TAG = "JVerificationModule"; - - private static final int CODE_PERMISSION_GRANTED = 0; - private static final String MSG_PERMISSION_GRANTED = "Permission is granted"; - private static final int ERR_CODE_PERMISSION = 1; - private static final String ERR_MSG_PERMISSION = "Permission not granted"; - - //"android.permission.READ_PHONE_STATE" - private static final String[] REQUIRED_PERMISSIONS = new String[]{Manifest.permission.READ_PHONE_STATE}; - - private boolean requestPermissionSended; - private Callback permissionCallback; - - public JVerificationModule(ReactApplicationContext reactContext) { - super(reactContext); - reactContext.addLifecycleEventListener(this); - } - - @Override - public boolean canOverrideExistingModule() { - return true; - } - - @Override - public String getName() { - return "JVerificationModule"; - } - - @Override - public void initialize() { - super.initialize(); - } - - @ReactMethod - public void requestPermission(Callback permissionCallback) { - if (AndroidUtils.checkPermission(getCurrentActivity(), REQUIRED_PERMISSIONS)) { - doCallback(permissionCallback, CODE_PERMISSION_GRANTED, MSG_PERMISSION_GRANTED); - return; - } - this.permissionCallback = permissionCallback; - try { - AndroidUtils.requestPermission(getCurrentActivity(), REQUIRED_PERMISSIONS); - requestPermissionSended = true; - } catch (Exception e) { - e.printStackTrace(); - } - } - - @ReactMethod - public void setDebugMode(boolean enable) { - JVerificationInterface.setDebugMode(enable); - } - - @ReactMethod - public void init() { - JVerificationInterface.init(getCurrentActivity()); - } - - @ReactMethod - public void checkVerifyEnable(Callback callback) { - boolean isVerifyEnable = JVerificationInterface.checkVerifyEnable(getCurrentActivity()); - WritableMap map = Arguments.createMap(); - map.putBoolean("enable", isVerifyEnable); - callback.invoke(map); - } - - @ReactMethod - public void getToken(final Callback callback) { - JVerificationInterface.getToken(getCurrentActivity(), new VerifyListener() { - @Override - public void onResult(int code, String content, String operator) { - doCallback(callback, code, content, operator); - } - }); - } - - @ReactMethod - public void verifyNumber(ReadableMap map, final Callback callback) { - String number = map.getString("number"); - String token = map.getString("token"); - - JVerificationInterface.verifyNumber(getCurrentActivity(), token, number, new VerifyListener() { - @Override - public void onResult(int code, String content, String operator) { - doCallback(callback, code, content, operator); - } - }); - } - - @ReactMethod - public void loginAuth(final Callback callback) { - JVerificationInterface.loginAuth(getCurrentActivity(), new VerifyListener() { - @Override - public void onResult(int code, String token, String operator) { - doCallback(callback, code, token, operator); - } - }); - } - - @ReactMethod - public void setCustomUIWithConfig(ReadableMap map) { - JVerifyUIConfig uiConfig = convertMapToConfig(map); - JVerificationInterface.setCustomUIWithConfig(uiConfig); - } - - private JVerifyUIConfig convertMapToConfig(ReadableMap map) { - int navColor = map.hasKey(JVerificationConstant.NAV_COLOR) ? map.getInt(JVerificationConstant.NAV_COLOR) : -16742704; - String navText = map.hasKey(JVerificationConstant.NAV_TEXT) ? map.getString(JVerificationConstant.NAV_TEXT) : "登录"; - int navTextColor = map.hasKey(JVerificationConstant.NAV_TEXT_COLOR) ? map.getInt(JVerificationConstant.NAV_TEXT_COLOR) : -1; - String navReturnImage = map.hasKey(JVerificationConstant.NAV_RETURN_IMAGE) ? map.getString(JVerificationConstant.NAV_RETURN_IMAGE) : "umcsdk_return_bg"; - boolean isLogoHidden = map.hasKey(JVerificationConstant.LOGO_HIDDEN) && map.getBoolean(JVerificationConstant.LOGO_HIDDEN); - String logoImage = map.hasKey(JVerificationConstant.LOGO_Image) ? map.getString(JVerificationConstant.LOGO_Image) : null; - int logoWidth = map.hasKey(JVerificationConstant.LOGO_Width) ? map.getInt(JVerificationConstant.LOGO_Width) : 70; - int logoHeight = map.hasKey(JVerificationConstant.LOGO_Height) ? map.getInt(JVerificationConstant.LOGO_Height) : 70; - int logoOffsetY = map.hasKey(JVerificationConstant.LOGO_OFFSET_Y) ? map.getInt(JVerificationConstant.LOGO_OFFSET_Y) : 50; - int numColor = map.hasKey(JVerificationConstant.NUM_COLOR) ? map.getInt(JVerificationConstant.NUM_COLOR) : -16742704; - int numOffsetY = map.hasKey(JVerificationConstant.NUM_OFFSET_Y) ? map.getInt(JVerificationConstant.NUM_OFFSET_Y) : 184; - int sloganTextColor = map.hasKey(JVerificationConstant.SLOGAN_TEXT_COLOR) ? map.getInt(JVerificationConstant.SLOGAN_TEXT_COLOR) : -1; - int sloganOffsetY = map.hasKey(JVerificationConstant.SLOGAN_OFFSET_Y) ? map.getInt(JVerificationConstant.SLOGAN_OFFSET_Y) : 224; - String loginBtnText = map.hasKey(JVerificationConstant.LOGIN_BTN_TEXT) ? map.getString(JVerificationConstant.LOGIN_BTN_TEXT) : "本机号码一键登录"; - int loginBtnTextColor = map.hasKey(JVerificationConstant.LOGIN_BTN_TEXT_COLOR) ? map.getInt(JVerificationConstant.LOGIN_BTN_TEXT_COLOR) : -1; - String loginBtnImage = map.hasKey(JVerificationConstant.LOGIN_BTN_IMAGE) ? map.getString(JVerificationConstant.LOGIN_BTN_IMAGE) : "umcsdk_login_btn_bg"; - int loginBtnOffsetY = map.hasKey(JVerificationConstant.LOGIN_BTN_OFFSET_Y) ? map.getInt(JVerificationConstant.LOGIN_BTN_OFFSET_Y) : 254; - String privacyOneName = map.hasKey(JVerificationConstant.PRIVACY_ONE_NAME) ? map.getString(JVerificationConstant.PRIVACY_ONE_NAME) : null; - String privacyOneUrl = map.hasKey(JVerificationConstant.PRIVACY_ONE_URL) ? map.getString(JVerificationConstant.PRIVACY_ONE_URL) : null; - String privacyTwoName = map.hasKey(JVerificationConstant.PRIVACY_TWO_NAME) ? map.getString(JVerificationConstant.PRIVACY_TWO_NAME) : null; - String privacyTwoUrl = map.hasKey(JVerificationConstant.PRIVACY_TWO_URL) ? map.getString(JVerificationConstant.PRIVACY_TWO_URL) : null; - int privacyBasicColor = map.hasKey(JVerificationConstant.PRIVACY_BASIC_COLOR) ? map.getInt(JVerificationConstant.PRIVACY_BASIC_COLOR) : -10066330; - int privacyProtocolColor = map.hasKey(JVerificationConstant.PRIVACY_PROTOCOL_COLOR) ? map.getInt(JVerificationConstant.PRIVACY_PROTOCOL_COLOR) : -16007674; - int privacyOffsetY = map.hasKey(JVerificationConstant.PRIVACY_OFFSET_Y) ? map.getInt(JVerificationConstant.PRIVACY_OFFSET_Y) : 30; - String checkImage = map.hasKey(JVerificationConstant.PRIVACY_CHECK_IMAGE) ? map.getString(JVerificationConstant.PRIVACY_CHECK_IMAGE) : "umcsdk_check_image"; - String unCheckImage = map.hasKey(JVerificationConstant.PRIVACY_UNCHECK_IMAGE) ? map.getString(JVerificationConstant.PRIVACY_UNCHECK_IMAGE) : "umcsdk_uncheck_image"; - - return new JVerifyUIConfig.Builder() - .setNavColor(navColor) - .setNavText(navText) - .setNavTextColor(navTextColor) - .setNavReturnImgPath(navReturnImage) - .setLogoHidden(isLogoHidden) - .setLogoImgPath(logoImage) - .setLogoWidth(logoWidth) - .setLogoHeight(logoHeight) - .setLogoOffsetY(logoOffsetY) - .setNumberColor(numColor) - .setNumFieldOffsetY(numOffsetY) - .setSloganTextColor(sloganTextColor) - .setSloganOffsetY(sloganOffsetY) - .setLogBtnText(loginBtnText) - .setLogBtnTextColor(loginBtnTextColor) - .setLogBtnImgPath(loginBtnImage) - .setLogBtnOffsetY(loginBtnOffsetY) - .setAppPrivacyOne(privacyOneName, privacyOneUrl) - .setAppPrivacyTwo(privacyTwoName, privacyTwoUrl) - .setAppPrivacyColor(privacyBasicColor, privacyProtocolColor) - .setPrivacyOffsetY(privacyOffsetY) - .setCheckedImgPath(checkImage) - .setUncheckedImgPath(unCheckImage) - .build(); - } - - @Override - public void onHostResume() { - if (requestPermissionSended) { - if (AndroidUtils.checkPermission(getCurrentActivity(), REQUIRED_PERMISSIONS)) { - doCallback(permissionCallback, CODE_PERMISSION_GRANTED, MSG_PERMISSION_GRANTED); - } else { - doCallback(permissionCallback, ERR_CODE_PERMISSION, ERR_MSG_PERMISSION); - } - } - requestPermissionSended = false; - } - - @Override - public void onHostPause() { - - } - - @Override - public void onHostDestroy() { - - } - - private void doCallback(Callback callback, int code, String content) { - WritableMap map = Arguments.createMap(); - map.putInt("code", code); - map.putString("content", content); - callback.invoke(map); - } - - private void doCallback(Callback callback, int code, String content, String operator) { - WritableMap map = Arguments.createMap(); - map.putInt("code", code); - map.putString("content", content); - map.putString("operator", operator); - callback.invoke(map); - } -} diff --git a/android/src/main/java/cn/jpush/reactnativejvrification/utils/AndroidUtils.java b/android/src/main/java/cn/jpush/reactnativejvrification/utils/AndroidUtils.java deleted file mode 100644 index 660a64b..0000000 --- a/android/src/main/java/cn/jpush/reactnativejvrification/utils/AndroidUtils.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.jpush.reactnativejvrification.utils; - - - -import android.app.Activity; -import android.content.Context; -import android.content.pm.PackageManager; -import android.os.Build; -import android.util.Log; -import java.lang.reflect.Method; - -public class AndroidUtils { - - public static final String TAG = AndroidUtils.class.getSimpleName(); - - public static boolean checkPermission(Context context, String[] permissions) { - PackageManager packageManager = context.getPackageManager(); - String packageName = context.getPackageName(); - - for (String permission : permissions) { - int per = packageManager.checkPermission(permission, packageName); - if (PackageManager.PERMISSION_DENIED == per) { - Log.w(TAG, "required permission not granted . permission = " + permission); - return false; - } - } - return true; - } - - public static void requestPermission(Activity activity, String[] permissions) throws Exception { - if (Build.VERSION.SDK_INT >= 23) { - Class activityClass = Class.forName("android.app.Activity"); - Method requestPermissionsMethod = activityClass.getMethod("requestPermissions", String[].class, int.class); - requestPermissionsMethod.invoke(activity, permissions, 0); - } else { - Log.w(TAG, "缺少必要权限,请检查Manifest文件,并在设置中打开对应权限"); - } - } -} - - diff --git a/android/src/main/res/anim/umcsdk_anim_loading.xml b/android/src/main/res/anim/umcsdk_anim_loading.xml new file mode 100755 index 0000000..e91a600 --- /dev/null +++ b/android/src/main/res/anim/umcsdk_anim_loading.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/android/src/main/res/drawable-xxhdpi/umcsdk_check_image.png b/android/src/main/res/drawable-xxhdpi/umcsdk_check_image.png new file mode 100755 index 0000000..81f3b47 Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/umcsdk_check_image.png differ diff --git a/android/src/main/res/drawable-xxhdpi/umcsdk_exception_bg.9.png b/android/src/main/res/drawable-xxhdpi/umcsdk_exception_bg.9.png new file mode 100755 index 0000000..faf1b6e Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/umcsdk_exception_bg.9.png differ diff --git a/android/src/main/res/drawable-xxhdpi/umcsdk_exception_icon.png b/android/src/main/res/drawable-xxhdpi/umcsdk_exception_icon.png new file mode 100755 index 0000000..b428484 Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/umcsdk_exception_icon.png differ diff --git a/android/src/main/res/drawable-xxhdpi/umcsdk_load_complete_w.png b/android/src/main/res/drawable-xxhdpi/umcsdk_load_complete_w.png new file mode 100755 index 0000000..095c3a3 Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/umcsdk_load_complete_w.png differ diff --git a/android/src/main/res/drawable-xxhdpi/umcsdk_load_dot_white.png b/android/src/main/res/drawable-xxhdpi/umcsdk_load_dot_white.png new file mode 100755 index 0000000..b8c0161 Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/umcsdk_load_dot_white.png differ diff --git a/android/src/main/res/drawable-xxhdpi/umcsdk_login_btn_normal.png b/android/src/main/res/drawable-xxhdpi/umcsdk_login_btn_normal.png new file mode 100755 index 0000000..4467ae9 Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/umcsdk_login_btn_normal.png differ diff --git a/android/src/main/res/drawable-xxhdpi/umcsdk_login_btn_press.png b/android/src/main/res/drawable-xxhdpi/umcsdk_login_btn_press.png new file mode 100755 index 0000000..65f8929 Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/umcsdk_login_btn_press.png differ diff --git a/example/ios/example/JVerificationResource.bundle/loginBtn_Dis@3x.png b/android/src/main/res/drawable-xxhdpi/umcsdk_login_btn_unable.png similarity index 86% rename from example/ios/example/JVerificationResource.bundle/loginBtn_Dis@3x.png rename to android/src/main/res/drawable-xxhdpi/umcsdk_login_btn_unable.png index b845bba..02943da 100755 Binary files a/example/ios/example/JVerificationResource.bundle/loginBtn_Dis@3x.png and b/android/src/main/res/drawable-xxhdpi/umcsdk_login_btn_unable.png differ diff --git a/example/ios/example/JVerificationResource.bundle/umcsdk_mobile_logo.png b/android/src/main/res/drawable-xxhdpi/umcsdk_mobile_logo.png old mode 100644 new mode 100755 similarity index 100% rename from example/ios/example/JVerificationResource.bundle/umcsdk_mobile_logo.png rename to android/src/main/res/drawable-xxhdpi/umcsdk_mobile_logo.png diff --git a/android/src/main/res/drawable-xxhdpi/umcsdk_return_bg.png b/android/src/main/res/drawable-xxhdpi/umcsdk_return_bg.png new file mode 100755 index 0000000..85818f2 Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/umcsdk_return_bg.png differ diff --git a/android/src/main/res/drawable-xxhdpi/umcsdk_shape_input.png b/android/src/main/res/drawable-xxhdpi/umcsdk_shape_input.png new file mode 100755 index 0000000..0843382 Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/umcsdk_shape_input.png differ diff --git a/android/src/main/res/drawable-xxhdpi/umcsdk_sms_normal.png b/android/src/main/res/drawable-xxhdpi/umcsdk_sms_normal.png new file mode 100755 index 0000000..a247699 Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/umcsdk_sms_normal.png differ diff --git a/android/src/main/res/drawable-xxhdpi/umcsdk_sms_press.png b/android/src/main/res/drawable-xxhdpi/umcsdk_sms_press.png new file mode 100755 index 0000000..cfbe43d Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/umcsdk_sms_press.png differ diff --git a/android/src/main/res/drawable-xxhdpi/umcsdk_sms_unable.png b/android/src/main/res/drawable-xxhdpi/umcsdk_sms_unable.png new file mode 100755 index 0000000..6ce97ba Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/umcsdk_sms_unable.png differ diff --git a/android/src/main/res/drawable-xxhdpi/umcsdk_toast_bg.png b/android/src/main/res/drawable-xxhdpi/umcsdk_toast_bg.png new file mode 100755 index 0000000..230593a Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/umcsdk_toast_bg.png differ diff --git a/android/src/main/res/drawable-xxhdpi/umcsdk_uncheck_image.png b/android/src/main/res/drawable-xxhdpi/umcsdk_uncheck_image.png new file mode 100755 index 0000000..d9c7fac Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/umcsdk_uncheck_image.png differ diff --git a/android/src/main/res/drawable/dialog_bg.xml b/android/src/main/res/drawable/dialog_bg.xml new file mode 100644 index 0000000..884ac35 --- /dev/null +++ b/android/src/main/res/drawable/dialog_bg.xml @@ -0,0 +1,4 @@ + + + + diff --git a/android/src/main/res/drawable/umcsdk_get_smscode_btn_bg.xml b/android/src/main/res/drawable/umcsdk_get_smscode_btn_bg.xml new file mode 100755 index 0000000..bb38d30 --- /dev/null +++ b/android/src/main/res/drawable/umcsdk_get_smscode_btn_bg.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/src/main/res/drawable/umcsdk_login_btn_bg.xml b/android/src/main/res/drawable/umcsdk_login_btn_bg.xml new file mode 100755 index 0000000..5721764 --- /dev/null +++ b/android/src/main/res/drawable/umcsdk_login_btn_bg.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml deleted file mode 100644 index 2a4cbc1..0000000 --- a/android/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - JVerifivationRN - diff --git a/android/src/main/res/values/styles.xml b/android/src/main/res/values/styles.xml new file mode 100644 index 0000000..1367968 --- /dev/null +++ b/android/src/main/res/values/styles.xml @@ -0,0 +1,15 @@ + + + + \ No newline at end of file diff --git a/docs/AndroidConfig.md b/docs/AndroidConfig.md deleted file mode 100644 index 64fbc31..0000000 --- a/docs/AndroidConfig.md +++ /dev/null @@ -1,40 +0,0 @@ -# Android Configure Part - -## Checkout settings.gradle - -> your project/android/settings.gradle - -``` -include ':app', 'jverification-react-native, 'jcore-react-native' -project(':jverification-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/jverification-react-native/android') -project(':jcore-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/jcore-react-native/android') -``` - -## Checkout module's build.gradle, add configuration - -> your project/android/app/build.gradle - -``` -android { - ... - defaultConfig { - applicationId "your application id" - ... - manifestPlaceholders = [ - JPUSH_APPKEY: "your app key", //在此替换你的APPKey - JPUSH_CHANNEL: "developer-default", //应用渠道号, 默认即可 - ] - } -} -... -dependencies { - implementation project(':jverification-react-native') - implementation project(':jcore-react-native') -} -``` - -​ - - - - diff --git a/docs/JVerificationPackage.md b/docs/JVerificationPackage.md deleted file mode 100644 index 18f9496..0000000 --- a/docs/JVerificationPackage.md +++ /dev/null @@ -1,50 +0,0 @@ -# Add JVerificationPackage - -> your project/android/app/src…/MainApplication.java - -``` -// 需要 import JVerificationInterface 和 JVerificationPackage -import cn.jiguang.verifysdk.api.JVerificationInterface; -import cn.jpush.reactnativejvrification.JVerificationPackage; - -public class MainApplication extends Application implements ReactApplication { - - - private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { - - @Override - public boolean getUseDeveloperSupport() { - return BuildConfig.DEBUG; - } - - - @Override - protected List getPackages() { - return Arrays.asList( - new MainReactPackage(), - new JVerificationPackage() - ); - } - }; - - @Override - public ReactNativeHost getReactNativeHost() { - return mReactNativeHost; - } - - @Override - public void onCreate() { - super.onCreate(); - SoLoader.init(this, false); -// 在 Init 之前调用,设置为 true,则会打印 debug 级别日志,否则只会打印 warning 级别以上的日志 -// JVerificationInterface.setDebugMode(true); -// SDK 初始化建议在这进行 - JVerificationInterface.init(this); - } -} -``` - - - - - diff --git a/example/.babelrc b/example/.babelrc deleted file mode 100644 index d4b74b5..0000000 --- a/example/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["module:metro-react-native-babel-preset"] -} diff --git a/example/.eslintrc.js b/example/.eslintrc.js new file mode 100644 index 0000000..40c6dcd --- /dev/null +++ b/example/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: '@react-native-community', +}; diff --git a/example/.flowconfig b/example/.flowconfig index 1043c82..1319ea1 100644 --- a/example/.flowconfig +++ b/example/.flowconfig @@ -11,20 +11,26 @@ ; Ignore duplicate module providers ; For RN Apps installed via npm, "Libraries" folder is inside ; "node_modules/react-native" but in the source repo it is in the root -.*/Libraries/react-native/React.js +node_modules/react-native/Libraries/react-native/React.js ; Ignore polyfills -.*/Libraries/polyfills/.* +node_modules/react-native/Libraries/polyfills/.* -; Ignore metro -.*/node_modules/metro/.* +; These should not be required directly +; require from fbjs/lib instead: require('fbjs/lib/warning') +node_modules/warning/.* + +; Flow doesn't support platforms +.*/Libraries/Utilities/HMRLoadingView.js + +[untyped] +.*/node_modules/@react-native-community/cli/.*/.* [include] [libs] node_modules/react-native/Libraries/react-native/react-native-interface.js node_modules/react-native/flow/ -node_modules/react-native/flow-github/ [options] emoji=true @@ -32,6 +38,10 @@ emoji=true esproposal.optional_chaining=enable esproposal.nullish_coalescing=enable +module.file_ext=.js +module.file_ext=.json +module.file_ext=.ios.js + module.system=haste module.system.haste.use_name_reducers=true # get basename @@ -44,27 +54,46 @@ module.system.haste.name_reducers='^\(.*\)\.android$' -> '\1' module.system.haste.name_reducers='^\(.*\)\.native$' -> '\1' module.system.haste.paths.blacklist=.*/__tests__/.* module.system.haste.paths.blacklist=.*/__mocks__/.* -module.system.haste.paths.blacklist=/node_modules/react-native/Libraries/Animated/src/polyfills/.* module.system.haste.paths.whitelist=/node_modules/react-native/Libraries/.* +module.system.haste.paths.whitelist=/node_modules/react-native/RNTester/.* +module.system.haste.paths.whitelist=/node_modules/react-native/IntegrationTests/.* +module.system.haste.paths.blacklist=/node_modules/react-native/Libraries/react-native/react-native-implementation.js +module.system.haste.paths.blacklist=/node_modules/react-native/Libraries/Animated/src/polyfills/.* munge_underscores=true module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' -module.file_ext=.js -module.file_ext=.jsx -module.file_ext=.json -module.file_ext=.native.js - suppress_type=$FlowIssue suppress_type=$FlowFixMe suppress_type=$FlowFixMeProps suppress_type=$FlowFixMeState -suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ -suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy +suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\) +suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\)?:? #[0-9]+ suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError +[lints] +sketchy-null-number=warn +sketchy-null-mixed=warn +sketchy-number=warn +untyped-type-import=warn +nonstrict-import=warn +deprecated-type=warn +unsafe-getters-setters=warn +inexact-spread=warn +unnecessary-invariant=warn +signature-verification-failure=warn +deprecated-utility=error + +[strict] +deprecated-type +nonstrict-import +sketchy-null +unclear-type +unsafe-getters-setters +untyped-import +untyped-type-import + [version] -^0.78.0 +^0.98.0 diff --git a/example/.gitignore b/example/.gitignore index 5d64756..828cc88 100644 --- a/example/.gitignore +++ b/example/.gitignore @@ -54,3 +54,6 @@ buck-out/ # Bundle artifact *.jsbundle + +# CocoaPods +/ios/Pods/ diff --git a/example/.prettierrc.js b/example/.prettierrc.js new file mode 100644 index 0000000..5c4de1a --- /dev/null +++ b/example/.prettierrc.js @@ -0,0 +1,6 @@ +module.exports = { + bracketSpacing: false, + jsxBracketSameLine: true, + singleQuote: true, + trailingComma: 'all', +}; diff --git a/example/App.js b/example/App.js index 6b89e7e..9ad77bd 100644 --- a/example/App.js +++ b/example/App.js @@ -1,177 +1,323 @@ import React from 'react'; -import { StyleSheet, Text, View, TouchableHighlight, ScrollView, TextInput, Alert ,Platform } from 'react-native'; -import JVerification from 'jverification-react-native' - -var styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - backgroundColor: '#F5FCFF', - }, - setBtnStyle: { - width: 280, - justifyContent: 'center', - alignItems: 'center', - marginTop: 10, - borderWidth: 1, - borderColor: '#3e83d7', - borderRadius: 8, - backgroundColor: '#3e83d7', - padding: 10 - }, - textStyle: { - textAlign: 'center', - fontSize: 25, - color: '#ffffff' - }, - inputText: { - width: 180, - fontSize: 15, - marginLeft: 5, - marginRight: 5, - color: '#000000', - padding: 10, - textAlign: 'left' - } -}) +import {StyleSheet, Text, View,Alert, TouchableHighlight, Platform} from 'react-native'; +import JVerification from 'jverification-react-native'; + + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: '#F5FCFF', + }, + setBtnStyle: { + width: 320, + justifyContent: 'center', + alignItems: 'center', + marginTop: 10, + borderWidth: 1, + borderColor: '#3e83d7', + borderRadius: 8, + backgroundColor: '#3e83d7', + padding: 10, + }, + textStyle: { + textAlign: 'center', + fontSize: 25, + color: '#ffffff', + }, +}); class Button extends React.Component { - render() { - return - - {this.props.title} - - - } + render() { + return + + + {this.props.title} + + + ; + } } + +const initParams = { + 'time': 5000, + 'appKey': 'a0e6ace8d5b3e0247e3f58db', //仅iOS + 'channel': 'channel', //仅iOS + 'advertisingId': 'advertisingId', //仅iOS + 'isProduction': false, //仅iOS +}; + //一键登录页面自定义配置,需要在调用login之前设置 -var config = { - navColor:-16742704, //导航栏颜色 - navText: "一键登录", //导航栏标题 - navTextColor:-1, //导航栏标题文字颜色 - navReturnImage:"自定义返回按钮图片", //导航栏左侧返回按钮 - - logoHidden:false, //logo是否隐藏 - logoImage:"umcsdk_mobile_logo", //logo(android默认为应用图标;ios默认无) - logoWidth:100, //logo宽 - logoHeight:100, //logo高 - logoOffsetY:75, //logo相对导航栏向下偏移量 - - numberColor:-16742704, //手机号码文字颜色 - numOffsetY:200, //手机号码相对导航栏向下偏移量 - - sloganTextColor:-16742704, //slogan文字颜色 - sloganOffsetY:250, //slogan相对导航栏向下偏移量 - - loginBtnText:"本机号码登录", //登录按钮文字 - loginBtnTextColor:-1, //登录按钮文字颜色 - loginBtnImageStyle:"自定义登录按钮样式", //登录按钮selector选择样式 (仅android) - loginBtnNormalImage:"自定义登录按钮正常图片", //登录按钮正常图片 (仅ios,三个同时设置生效) - loginBtnUnableImage:"自定义登录按钮失效图片", //登录按钮失效图片 (仅ios,三个同时设置生效) - loginBtnPressedImage:"自定义登录按钮按下图片", //登录按钮按下图片 (仅ios,三个同时设置生效) - - loginBtnOffsetY:280, //登录按钮相对导航栏向下偏移量 - - privacyOneName:"自定义隐私条款一", //隐私条款一 - privacyOneUrl:"https://www.jiguang.cn", //隐私条款一链接 - privacyTwoName:"自定义隐私条款二", //隐私条款二 - privacyTwoUrl:"https://www.jiguang.cn", //隐私条款二链接 - privacyBasicColor:-16742704, //隐私条款基础文字颜色 - privacyProtocolColor:-16777216, //隐私条款文字颜色 - privacyCheckImage:"自定义选择图片", //隐私条款复选框选中图片 - privacyUncheckImage:"自定义未选择图片", //隐私条款复选框未选中图片 - privacyOffsetY:20 //隐私条款相对底部向上偏移量 + + +const customUIWithConfigiOS = { + showWindow:false, + navReturnHidden:false, + //logo + logoImage: 'umcsdk_mobile_logo', + logoConstraints:[0,-200,60,60], + //number + numberConstraints:[0,-132,200,14], + //slogn + sloganConstraints:[0,-112,200,14], + //登录按钮 + logBtnConstraints:[0,-80,220,40], + loginBtnText:"一键登录", + loginBtnTextColor:0x0000FF, + privacyConstraints:[0,180,200,60], + checkViewConstraints:[-108,180,10,10], + unAgreePrivacyCallBack:true, + + privacyOne: ['隐私条款一', 'https://www.jiguang.cn/about'], //隐私条款一(显示名称和url,请严格按照格式) + privacyTwo: ['隐私条款二', 'https://www.jiguang.cn/about'], //隐私条款二(显示名称和url,请严格按照格式) + privacyColor: [-16777216, -65536], //隐私条款颜色 (显示名称和url的颜色,请严格按照格式) + privacyText: ['登录即同意', '和', '、', '并使用本机号码登录'], //隐私条款名称外的文字 + privacyTextSize: 15, //隐私条款文字字体大小 + privacyTextGravityMode: 'left', //隐私条款文本对齐方式,目前仅支持 left、center + privacyBookSymbolEnable: false, //隐私条款是否显示书名号,默认不显示 + +} +const customUIWithConfigAndroid = { + backgroundImage: '', //背景图 + + statusBarHidden: false, //状态栏是否隐藏 + statusBarMode: 'light', //状态栏模式 light,dark + + navHidden: false, //导航栏是否隐藏 + navColor: -16777216, //导航栏颜色 + + navTitle: 'RN-JVerification', //导航栏标题 + navTitleSize: 16, //导航栏标题文字字体大小(单位:sp) + navTitleColor: -1, //导航栏标题文字颜色 + + navReturnHidden: false, //导航栏返回按钮是否隐藏 + navReturnImage: 'close', //导航栏左侧返回按钮图标 + //为保障显示效果,请同时设置x,y,w,h + navReturnX: 5, //导航栏左侧返回按钮图标距屏幕上端偏移(仅Android) + navReturnY: 5, //导航栏左侧返回按钮图标距屏幕左侧偏移(仅Android) + navReturnW: 25, //导航栏左侧返回按钮图标宽度(仅Android) + navReturnH: 25, //导航栏左侧返回按钮图标高度(仅Android) + + logoHidden: false, //logo是否隐藏 + logoImage: 'umcsdk_mobile_logo', //logo(android默认为应用图标;) + //为保障显示效果,请同时设置x,y,w,h + // logoX: 50, //logo相对于屏幕左边x轴偏移 + // logoY: 50, //logo相对于标题栏下边缘y偏移 + // logoW: 100, //logo宽 + // logoH: 100, //logo高 + + numberSize: 16, //手机号码字体大小(单位:sp) + numberColor: -16777216, //手机号码字体颜色 + //为保障显示效果,请同时设置x,y,w,h + // numberX: 50, //号码栏相对于屏幕左边x轴偏移 + // numberY: 100, //号码栏相对于标题栏下边缘y偏移 + // numberW: 250, //号码栏宽度 + // numberH: 25, //号码栏高度 + + sloganHidden: false, //slogan是否隐藏 + sloganTextSize: 16, //slogan字体大小 + sloganTextColor: -16777216, //slogan文字颜色 + + //为保障显示效果,请同时设置x,y,w,h + // sloganX: 50, //slogan相对于屏幕左边x轴偏移 + // sloganY: 150, //slogan相对于标题栏下边缘y偏移 + + loginBtnText: '登录按钮', //登录按钮文字 + loginBtnTextSize: 16, //登录按钮字体大小 + loginBtnTextColor: -16777216, //登录按钮文字颜色 + + loginBtnImage: 'login_btn_selector', //登录按钮selector选择样式 (仅android) + loginBtnNormalImage: 'loginBtn_Nor', //登录按钮正常图片 (仅ios,三个同时设置生效) + loginBtnDisabledImage: 'loginBtn_Dis', //登录按钮失效图片 (仅ios,三个同时设置生效) + loginBtnSelectedImage: 'loginBtn_Hig', //登录按钮按下图片 (仅ios,三个同时设置生效) + //为保障显示效果,请同时设置x,y,w,h + // loginBtnX: 50, //登录按钮相对于屏幕左边x轴偏移 + // loginBtnY: 200, //登录按钮相对于标题栏下边缘y偏移 + // loginBtnW: 250, //登录按钮宽度 + // loginBtnH: 40, //登录按钮高度 + + privacyOne: ['隐私条款一', 'https://www.jiguang.cn/about'], //隐私条款一(显示名称和url,请严格按照格式) + privacyTwo: ['隐私条款二', 'https://www.jiguang.cn/about'], //隐私条款二(显示名称和url,请严格按照格式) + privacyColor: [-16777216, -65536], //隐私条款颜色 (显示名称和url的颜色,请严格按照格式) + privacyText: ['登录即同意11111', '和', '、', '并使用本机号码登录'], //隐私条款名称外的文字 + privacyTextSize: 15, //隐私条款文字字体大小 + privacyTextGravityMode: 'left', //隐私条款文本对齐方式,目前仅支持 left、center + privacyBookSymbolEnable: false, //隐私条款是否显示书名号,默认不显示 + //为保障显示效果,请同时设置x,y,w,h + // privacyX:50, //隐私条款相对于屏幕左边x轴偏移 + // privacyY:20, //隐私条款相对于授权页面底部下边缘y偏移 + // privacyW:200, //隐私条款宽度 + // privacyH:100, //隐私条款高度 + + privacyCheckboxHidden: false, //checkBox是否隐藏,默认不隐藏 + privacyCheckEnable: false, //checkBox默认状态 默认:NO + privacyCheckedImage: 'checkbox_selected', //checkBox选中时图片 + privacyUncheckedImage: 'checkbox_unSelected', //checkBox未选中时图片 + privacyCheckboxSize:10, //设置隐私条款checkbox尺寸 默认是10 + unAgreePrivacyHintToast: true, + + privacyWebNavColor: -16777216, //协议页导航栏背景颜色 + privacyWebNavTitle: '服务条款', //协议页导航栏标题(仅iOS) + privacyWebNavTitleSize: 16, //协议页导航栏标题字体大小 + privacyWebNavTitleColor: -1, //协议页导航栏标题字体颜色 + privacyWebNavReturnImage: 'close', //协议页导航栏返回按钮图片 +}; + +const customViewParams = [ + {customViewName: 'customView1', customViewPoint: [20, 200, 150, 30]}, + {customViewName: 'customView2', customViewPoint: [20, 300, 150, 30]}, + {customViewName: 'customView3', customViewPoint: [20, 400, 150, 30]}, +]; + +const codeConfig = { + phoneNumber : "18925241111", //在此替换你的phoneNumber + signID : "1", //在此替换你的signID + templateID : "1" //在此替换你的templateID +}; +//安卓授权页弹窗模式 +const androidDialogConfig = { + privacyNeedClose:true, //弹窗是否需要关闭按钮 + privacyCloseTheme:[10, 60, 0, 0], //弹窗关闭按钮偏移量 privacyNeedClose为true时,必须设置它的偏移量 + privacyDialogTheme: [300, 400, 0, 0, false], //授权页弹窗模式 + privacyNeedStartAnim: true, //设置拉起授权页时是否需要显示默认动画 默认展示 + privacyNeedCloseAnim: true, //设置关闭授权页时是否需要显示默认动画 默认展示 + navColor:0xff000000, + loginBtnText:" 极光认证测试 ", + privacyCheckEnable:false, + privacyColor:[0xff00f000,0xff000000], + loginBtnWidth:40, + privacyOne: ['隐私条款一', 'https://www.jiguang.cn/about'], //隐私条款一(显示名称和url,请严格按照格式) + privacyColor: [-16777216, -65536], //隐私条款颜色 (显示名称和url的颜色,请严格按照格式) + privacyText: ['登录即同意', '和', '、', '并使用本机号码登录'], //隐私条款名称外的文字 + privacyTextSize: 12, +} +//ios授权页弹窗模式 +const iosDialogConfig = { + navHidden:true, //导航栏是否隐藏 + logoImage: 'umcsdk_mobile_logo', //logo(android默认为应用图标;ios默认无) + logoConstraints:[0,-100,60,60], //LOGO图片布局对象 + logoHidden: false, //logo是否隐藏 + numberConstraints:[0,-42,200,14], //号码栏布局对象 + sloganConstraints:[0,-20,200,14], //slogan布局对象 + logBtnConstraints:[0,20,220,40], + loginBtnText: '登录按钮', //登录按钮文字 + loginBtnTextSize: 16, //登录按钮字体大小 + loginBtnTextColor: -16777216, //登录按钮文字颜色 + privacyConstraints:[0,100,200,60], //隐私条款布局对象 + checkViewConstraints:[-108,100,10,10], //checkBox布局对象 + + loadingConstraints:[0,0,20,20], + showWindow:true, // 是否弹窗,默认no + //windowBackgroundImage:"bg", // 弹框内部背景图片 + windowBackgroundAlpha: 0.3, //弹窗外侧 透明度 0~1.0 + windowCornerRadius:10, //弹窗圆角数值 + windowConstraints:[0,0,300,300], //弹窗布局对象 + windowCloseBtnImgs:["windowClose","windowClose"],//弹窗close按钮图片 @[普通状态图片,高亮状态图片] + windowCloseBtnConstraints:[-135,-135,20,20],//弹窗close按钮布局, } export default class App extends React.Component { - constructor(props){ - super(props) - this.state = {token:''} - } - - render() { - return ( - -