diff --git a/app/android/app/src/main/AndroidManifest.xml b/app/android/app/src/main/AndroidManifest.xml index 6fd53f1..564e0db 100644 --- a/app/android/app/src/main/AndroidManifest.xml +++ b/app/android/app/src/main/AndroidManifest.xml @@ -42,6 +42,16 @@ + + + + + + + + 用户隐私政策 + + +

用户隐私政策

+ +

您在使用我们的服务时,我们可能会收集和使用您的相关信息。 +
我们希望通过本《隐私政策》向您说明,在使用我们的服务时,我们如何收集、使用、储存和分享这些信息,以及我们为您提供的访问、更新、控制和保护这些信息的方式。 +
本《隐私政策》与您所使用的服务息息相关,希望您仔细阅读,在需要时,按照本《隐私政策》的指引,作出您认为适当的选择。 +
本《隐私政策》中涉及的相关技术词汇,我们尽量以简明扼要的表述,并提供进一步说明的链接,以便您的理解。 +
您使用或继续使用我们的服务,即意味着同意我们按照本《隐私政策》收集、使用、储存和分享您的相关信息。 + 如对本《隐私政策》或相关事宜有任何问题,请通过 iHTCdevelop@gmail.com 与我们联系。

+ +

我们可能收集的信息

+

我们提供服务时,可能会收集、储存和使用下列与您有关的信息。如果您不提供相关信息,可能无法享受我们提供的某些服务,或者无法达到相关服务拟达到的效果。 +

+

您提供的信息

+ +

您在使用我们的服务时,向我们提供的相关个人信息,例如电话号码、电子邮件或银行卡号等; +
您通过我们的服务向其他方提供的共享信息,以及您使用我们的服务时所储存的信息。 +

+ +

其他方分享的您的信息

+ +

其他方使用我们的服务时所提供有关您的共享信息。 +

+ +

我们获取的您的信息

+

您使用服务时我们可能收集如下信息: +
日志信息,指您使用我们的服务时,系统可能通过cookies或其他方式自动采集的技术信息,包括: +
设备或软件信息,例如您的移动设备、网页浏览器或用于接入我们服务的其他程序所提供的配置信息、您的IP地址和移动设备所用的版本和设备识别码; +
修改系统的权限在使用我们服务时,例如您需要调节应用内的屏幕亮度时,需要访问提供修改系统的权限; +
推送的权限,只会用于番茄计时时,应用进入后台时,进行本地推送提示功能。 +

+ +

我们可能如何使用信息

+ +

我们可能将在向您提供服务的过程之中所收集的信息用作下列用途: +
1、向您提供服务; +
2、帮助我们设计新服务,改善我们现有服务; +
3、让您参与有关我们产品和服务的调查。 +
4、在我们提供服务时,用于身份验证、客户服务、安全防范、诈骗监测、存档和备份用途,确保我们向您提供的产品和服务的安全性; +

+

+ 为了让您有更好的体验、改善我们的服务或您同意的其他用途,在符合相关法律法规的前提下,我们可能将通过某一项服务所收集的信息,以汇集信息或者个性化的方式,用于我们的其他服务。例如,在您使用我们的一项服务时所收集的信息,可能在另一服务中用于向您提供特定内容,或向您展示与您相关的、非普遍推送的信息。如果我们在相关服务中提供了相应选项,您也可以授权我们将该服务所提供和储存的信息用于我们的其他服务。 +
我们将尽一切可能采取适当的技术手段,保证您可以访问、更新和更正自己的注册信息或使用我们的服务时提供的其他个人信息。在访问、更新、更正和删除前述信息时,我们可能会要求您进行身份验证,以保障账户安全。 +

+ +

信息安全

+

我们仅在本《隐私政策》所述目的所必需的期间和法律法规要求的时限内保留您的个人信息。 + 我们使用各种安全技术和程序,以防信息的丢失、不当使用、未经授权阅览或披露。例如,在某些服务中,我们将利用加密技术(例如SSL)来保护您提供的个人信息。但请您理解,由于技术的限制以及可能存在的各种恶意手段,在互联网行业,即便竭尽所能加强安全措施,也不可能始终保证信息百分之百的安全。您需要了解,您接入我们的服务所用的系统和通讯网络,有可能因我们可控范围外的因素而出现问题。 +

+ +

您分享的信息

+ +

+ 我们的多项服务,可让您不仅与自己的社交网络,也与使用该服务的所有用户公开分享您的相关信息,例如,您在我们的服务中所上传或发布的信息(包括您公开的个人信息、您建立的名单)、您对其他人上传或发布的信息作出的回应,以及包括与这些信息有关的位置数据和日志信息。使用我们服务的其他用户也有可能分享与您有关的信息(包括位置数据和日志信息)。特别是,我们的社交媒体服务,是专为使您与世界各地的用户共享信息而设计,您可以使共享信息实时、广泛地传递。只要您不删除共享信息,有关信息会一直留存在公共领域;即使您删除共享信息,有关信息仍可能由其他用户或不受我们控制的非关联第三方独立地缓存、复制或储存,或由其他用户或该等第三方在公共领域保存。 +
因此,请您谨慎考虑通过我们的服务上传、发布和交流的信息内容。在一些情况下,您可通过我们某些服务的隐私设定来控制有权浏览您共享信息的用户范围。如要求从我们的服务中删除您的相关信息,请通过该等特别服务条款提供的方式操作。 +

+ +

您分享的敏感个人信息

+ +

某些个人信息因其特殊性可能被认为是敏感个人信息,例如您的种族、宗教、个人健康和医疗信息等。相比其他个人信息,敏感个人信息受到更加严格的保护。 +
请注意,您在使用我们的服务时所提供、上传或发布的内容和信息(例如有关您社交活动的照片等信息),可能会泄露您的敏感个人信息。您需要谨慎地考虑,是否在使用我们的服务时披露相关敏感个人信息。 +
您同意按本《隐私政策》所述的目的和方式来处理您的敏感个人信息。

+ +

隐私政策的适用例外

+ +

我们的服务可能包括或链接至第三方提供的社交媒体或其他服务(包括网站)。例如: +
您利用 + “分享”键将某些内容分享到我们的服务,或您利用第三方连线服务登录我们的服务。这些功能可能会收集您的相关信息(包括您的日志信息),并可能在您的电脑装置cookies,从而正常运行上述功能; +
我们通过广告或我们服务的其他方式向您提供链接,使您可以接入第三方的服务或网站。 +
该等第三方社交媒体或其他服务可能由相关的第三方或我们运营。您使用该等第三方的社交媒体服务或其他服务(包括您向该等第三方提供的任何个人信息),须受该第三方的服务条款及隐私政策(而非《通用服务条款》或本《隐私政策》)约束,您需要仔细阅读其条款。本《隐私政策》仅适用于我们所收集的信息,并不适用于任何第三方提供的服务或第三方的信息使用规则,我们对任何第三方使用由您提供的信息不承担任何责任。 +

+ +

未成年人使用我们的服务

+ +

我们鼓励父母或监护人指导未满十八岁的未成年人使用我们的服务。我们建议未成年人鼓励他们的父母或监护人阅读本《隐私政策》,并建议未成年人在提交的个人信息之前寻求父母或监护人的同意和指导。 +

+ +

隐私政策的适用范围

+ +

+ 除某些特定服务外,我们所有的服务均适用本《隐私政策》。这些特定服务将适用特定的隐私政策。针对某些特定服务的特定隐私政策,将更具体地说明我们在该等服务中如何使用您的信息。该特定服务的隐私政策构成本《隐私政策》的一部分。如相关特定服务的隐私政策与本《隐私政策》有不一致之处,适用该特定服务的隐私政策。 +
请您注意,本《隐私政策》不适用于以下情况: +
通过我们的服务而接入的第三方服务(包括任何第三方网站)收集的信息; +
通过在我们服务中进行广告服务的其他公司或机构所收集的信息。 +

+

变更

+ +

+ 我们可能适时修订本《隐私政策》的条款,该等修订构成本《隐私政策》的一部分。如该等修订造成您在本《隐私政策》下权利的实质减少,我们将在修订生效前通过在主页上显著位置提示或向您发送电子邮件或以其他方式通知您。在该种情况下,若您继续使用我们的服务,即表示同意受经修订的本《隐私政策》的约束。 +

+ + \ No newline at end of file diff --git a/app/android/app/src/main/kotlin/com/iHTCboy/iPomodoro/AppWebviewAvtivity.kt b/app/android/app/src/main/kotlin/com/iHTCboy/iPomodoro/AppWebviewAvtivity.kt new file mode 100644 index 0000000..21d2f61 --- /dev/null +++ b/app/android/app/src/main/kotlin/com/iHTCboy/iPomodoro/AppWebviewAvtivity.kt @@ -0,0 +1,39 @@ +package com.iHTCboy.iPomodoro + +import android.os.Build +import android.os.Bundle +import android.view.WindowManager +import android.webkit.WebView +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat + +class AppWebviewAvtivity : AppCompatActivity() { + //定义变量 + private var myWebView: WebView? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.webview_layout) + myWebView = findViewById(R.id.webView) as WebView + // 设置与Js交互的权限 +// myWebView!!.settings.javaScriptEnabled = true +// //文本编码 +// myWebView!!.settings.defaultTextEncodingName = "utf-8" +// //设置DOM存储已启用(注释后文本显示变成js代码) +// myWebView!!.settings.domStorageEnabled = true + // 设置允许JS弹窗 + //myWebView.settings.javaScriptCanOpenWindowsAutomatically = true + // 先载入JS代码 + // 格式规定为:file:///android_asset/文件名.html + myWebView!!.loadUrl("file:///android_asset/privacy_policy.html") +// mWebView!!.loadData(resources.getString(R.string.privacy_policy), "text/html", "base64") + } + +// private fun setupStatusBar() { +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { +// //需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色 +// window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) +// window.statusBarColor = ContextCompat.getColor(this, R.color.colorPrimaryDark) +// } +// } +} \ No newline at end of file diff --git a/app/android/app/src/main/kotlin/com/iHTCboy/iPomodoro/MainActivity.kt b/app/android/app/src/main/kotlin/com/iHTCboy/iPomodoro/MainActivity.kt index b2b7426..44211f5 100644 --- a/app/android/app/src/main/kotlin/com/iHTCboy/iPomodoro/MainActivity.kt +++ b/app/android/app/src/main/kotlin/com/iHTCboy/iPomodoro/MainActivity.kt @@ -154,6 +154,10 @@ class MainActivity : FlutterActivity() { // } } + if ("privacy_policy" == call.method) { + val intent = Intent(this, AppWebviewAvtivity::class.java) + startActivity(intent) + } } } diff --git a/app/android/app/src/main/res/layout/webview_layout.xml b/app/android/app/src/main/res/layout/webview_layout.xml new file mode 100644 index 0000000..e191c40 --- /dev/null +++ b/app/android/app/src/main/res/layout/webview_layout.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/android/app/src/main/res/values/styles.xml b/app/android/app/src/main/res/values/styles.xml index e191c72..2d4266d 100644 --- a/app/android/app/src/main/res/values/styles.xml +++ b/app/android/app/src/main/res/values/styles.xml @@ -20,4 +20,9 @@ @color/colorAccent 20sp + diff --git a/app/ios/Flutter/flutter_export_environment.sh b/app/ios/Flutter/flutter_export_environment.sh index 4f9d0a2..1891138 100755 --- a/app/ios/Flutter/flutter_export_environment.sh +++ b/app/ios/Flutter/flutter_export_environment.sh @@ -6,7 +6,7 @@ export "FLUTTER_TARGET=/Users/HTC/Documents/Programing/Flutter/iPomodoro-Flutter export "FLUTTER_BUILD_DIR=build" export "SYMROOT=${SOURCE_ROOT}/../build/ios" export "FLUTTER_BUILD_NAME=1.0.0" -export "FLUTTER_BUILD_NUMBER=1" +export "FLUTTER_BUILD_NUMBER=210228" export "DART_DEFINES=Zmx1dHRlci5pbnNwZWN0b3Iuc3RydWN0dXJlZEVycm9ycz10cnVl,RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==" export "DART_OBFUSCATION=false" export "TRACK_WIDGET_CREATION=true" diff --git a/app/ios/Runner.xcodeproj/project.pbxproj b/app/ios/Runner.xcodeproj/project.pbxproj index 4d7a1dd..e7e8a3b 100644 --- a/app/ios/Runner.xcodeproj/project.pbxproj +++ b/app/ios/Runner.xcodeproj/project.pbxproj @@ -464,7 +464,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 2021.02.25; + CURRENT_PROJECT_VERSION = 2021.03.05; DEVELOPMENT_TEAM = 28PV6G96R7; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -480,7 +480,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 1.3.1; + MARKETING_VERSION = 1.3.2; PRODUCT_BUNDLE_IDENTIFIER = com.iHTCboy.iPomodoro; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -606,7 +606,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 2021.02.25; + CURRENT_PROJECT_VERSION = 2021.03.05; DEVELOPMENT_TEAM = 28PV6G96R7; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -622,7 +622,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 1.3.1; + MARKETING_VERSION = 1.3.2; PRODUCT_BUNDLE_IDENTIFIER = com.iHTCboy.iPomodoro; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -640,7 +640,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 2021.02.25; + CURRENT_PROJECT_VERSION = 2021.03.05; DEVELOPMENT_TEAM = 28PV6G96R7; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -656,7 +656,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 1.3.1; + MARKETING_VERSION = 1.3.2; PRODUCT_BUNDLE_IDENTIFIER = com.iHTCboy.iPomodoro; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; diff --git a/app/lib/common/channel/native_method_channel.dart b/app/lib/common/channel/native_method_channel.dart index c1d2172..17671c5 100644 --- a/app/lib/common/channel/native_method_channel.dart +++ b/app/lib/common/channel/native_method_channel.dart @@ -4,6 +4,17 @@ import 'package:iPomodoro/config/app_config.dart'; //调用原生方法 class NativeChannel { + static Future invokeMethod(String method) async { + const platform = const MethodChannel('iPomodoro'); + var result; + try { + result = await platform.invokeMethod(method); + return Future.value(result); + } on PlatformException catch (e) { + return Future.error(e.toString()); + } + } + static Future requestReview() async { const platform = const MethodChannel('iPomodoro'); var result; diff --git a/app/lib/config/app_config.dart b/app/lib/config/app_config.dart index 40152e5..2a056c2 100644 --- a/app/lib/config/app_config.dart +++ b/app/lib/config/app_config.dart @@ -12,7 +12,7 @@ class AppConfig { static const AppShareText = "Hello, ${AppName}! 这是一款番茄时间管理规划的App,不再分心!不再拖延!高效!专注!学习必备的好工具哦!iOS下载链接:${AppAppStoreUrl}"; static const kiHTCboyUrl = "https://ihtcboy.com"; static const kiHTCboyer = "https://apps.apple.com/cn/developer/iHTCboy/id914453386"; - static const kEmail = "iHTCTeam@gmail.com"; + static const kEmail = "iHTCdevelop@gmail.com"; static const kAppDesc = "番茄时间管理和学习规划,妈妈再也不用担心我的学习啦!不再分心!不再拖延!高效!专注!,让大家在学习时可以更加专注也可以快速和简单的学习get! \n \n" "1、番茄学习模式,使用番茄工作法学习,让你劳逸结合!\n2、计时学习模式,按照设定的时长学习,想学多久就学多久!\n3、定时任务模式,倒数日、任务记录,每日学习任务!杜绝学习没有目标!满足你对学习的求知欲望!"; } \ No newline at end of file diff --git a/app/lib/ui/page/me_page.dart b/app/lib/ui/page/me_page.dart index 3d486da..c01f784 100644 --- a/app/lib/ui/page/me_page.dart +++ b/app/lib/ui/page/me_page.dart @@ -15,6 +15,7 @@ class MePage extends StatelessWidget { SliverAppBar( pinned: true, centerTitle: true, + brightness: Brightness.dark, backgroundColor: AppColors.ME_SUB_COLOR, expandedHeight: DeviceUtils.get_size(context, 200, 220, 300), flexibleSpace: FlexibleSpaceBar( @@ -187,7 +188,11 @@ class MePage extends StatelessWidget { NativeChannel.emailConnect(); break; case 6: - openURL(AppConfig.AppLicenseUrl); + if (is_iOS(context)) { + openURL(AppConfig.AppLicenseUrl); + } else { + NativeChannel.invokeMethod('privacy_policy'); + } break; case 7: openURL(AppConfig.AppGitHubUrl); diff --git a/app/lib/ui/page/pomodoro_settings.dart b/app/lib/ui/page/pomodoro_settings.dart index e055fb9..4411e90 100644 --- a/app/lib/ui/page/pomodoro_settings.dart +++ b/app/lib/ui/page/pomodoro_settings.dart @@ -55,6 +55,7 @@ class _PomodoroSettingsPageState extends State { appBar: AppBar( title: Text('番茄设置'), brightness: Brightness.dark, + backgroundColor: AppColors.PRIMARY_MAIN_COLOR, ), body: ListView( children: [