diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 993ccd0..eb6ce3e 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -72,19 +72,19 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/webview_flutter/ios" SPEC CHECKSUMS: - device_info: 3ebad48f726348f69abd802f3334a8d1ed795fbd + device_info: cbf09d2ec12aa7110e0b09fabe54b5bd6c8efe74 Flutter: 0e3d915762c693b495b44d77113d4970485de6ec flutter_webview_plugin: ed9e8a6a96baf0c867e90e1bce2673913eeac694 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a launch_review: 75d5a956ba8eaa493e9c9d4bf4c05e505e8d5ed0 open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d - package_info: 78cabb3c322943c55d39676f4a5bfc748c01d055 - path_provider: f96fff6166a8867510d2c25fdcc346327cc4b259 + package_info: 48b108e75b8802c2d5e126f208ef540561c98aef + path_provider: fb74bd0465e96b594bb3b5088ee4a4e7bb1f2a9d share: 7d22fe8baedfe93aefd864bf0b73f29711fbb0a3 shared_preferences: 430726339841afefe5142b9c1f50cb6bd7793e01 sqflite: ff1d9da63c06588cc8d1faf7256d741f16989d5a - url_launcher: 0067ddb8f10d36786672aa0722a21717dba3a298 - webview_flutter: 1aa7604e6cdb451a9b7ed2c37d5454c0b440246b + url_launcher: a1c0cc845906122c4784c542523d8cacbded5626 + webview_flutter: db3aba222b23e4dc432e0c5882834123dc50ff9f PODFILE CHECKSUM: 7fb83752f59ead6285236625b82473f90b1cb932 diff --git a/lib/config/app_store.dart b/lib/config/app_store.dart new file mode 100644 index 0000000..092c218 --- /dev/null +++ b/lib/config/app_store.dart @@ -0,0 +1,51 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:fun_android/utils/platform_utils.dart'; + +import 'net/lean_cloud_api.dart'; + +var isReviewing = true; + +/// 是否在审核期间 +bool get appStoreReview { + return Platform.isIOS ? isReviewing : false; +} + +/// 或者正在审核字段 1:正在审核 +Future fetchReviewState() async { + if (!Platform.isIOS) { + isReviewing = false; + return; + } + // 该日期后不再审核 + if (DateTime.now().isAfter(DateTime(2019, 10, 20, 9, 30))) { + isReviewing = false; + return; + } + // 设置过审核结束后,就无需再进入了 + if (!isReviewing) return; + var version = await PlatformUtils.getAppVersion(); + var response = await http.get('classes/appVersion', queryParameters: { + 'where': '{"platform": "appStore", "version": "$version"}' + }); + if (response.data.length > 0) { + var result = response.data[0]['url']; + isReviewing = result == '1'; + } + debugPrint('是否正在review:$isReviewing'); +} + +/// 替换android字符 +String replaceAndroid(String str) { + if (appStoreReview) { + return str + .replaceAll(RegExp(r'wanandroid', caseSensitive: false), '学iOS') + .replaceAll(RegExp(r'android', caseSensitive: false), 'iOS') + .replaceAll('安卓', '苹果'); + } + return str; +} + +const String appleBannerUrl = + 'https://www.wanandroid.com/blogimgs/90c6cc12-742e-4c9f-b318-b912f163b8d0.png'; diff --git a/lib/config/net/lean_cloud_api.dart b/lib/config/net/lean_cloud_api.dart new file mode 100644 index 0000000..b999c78 --- /dev/null +++ b/lib/config/net/lean_cloud_api.dart @@ -0,0 +1,68 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/foundation.dart'; + +import 'api.dart'; + +final Http http = Http(); + +class Http extends BaseHttp { + @override + void init() { + options.baseUrl = 'https://funandroid.phoenixsky.cn/1.1/'; + interceptors.add(LeanCloudApiInterceptor()); + } +} + +/// App相关 API +class LeanCloudApiInterceptor extends InterceptorsWrapper { + @override + onRequest(RequestOptions options) async { + options.headers['X-LC-Id'] = 'z3J5KBtLrbmeMAyo6D2uXobV-9Nh9j0Va'; + options.headers['X-LC-Key'] = 'nxHpvHda10VYhx7fIUv5sqFo'; + options.headers['Content-Type'] = 'application/json'; + + debugPrint('---api-request--->url--> ${options.baseUrl}${options.path}' + + ' queryParameters: ${options.queryParameters}'); + return options; + } + + @override + onResponse(Response response) { + RespData respData = RespData.fromJson(response.data); + if (respData.success) { + response.data = respData.data; + return http.resolve(response); + } else { + return http.reject(respData.message); + } + } +} + +class RespData { + dynamic data; + int code; + String message; + + bool get success => code == null; + + RespData({this.data, this.code, this.message}); + + @override + String toString() { + return 'RespData{data: $data, status: $code, message: $message}'; + } + + Map toJson() { + final Map data = new Map(); + data['code'] = this.code; + data['error'] = this.message; + data['result'] = this.data; + return data; + } + + RespData.fromJson(Map json) { + code = json['code']; + message = json['error']; + data = json['results']; + } +} diff --git a/lib/model/article.dart b/lib/model/article.dart index d4392ef..08c66bf 100644 --- a/lib/model/article.dart +++ b/lib/model/article.dart @@ -1,3 +1,4 @@ +import 'package:fun_android/config/app_store.dart'; import 'package:fun_android/utils/string_utils.dart'; class Article { @@ -59,7 +60,7 @@ class Article { articleBean.superChapterName = StringUtils.urlDecoder(map["superChapterName"]); articleBean.tags = List() ..addAll((map['tags'] as List ?? []).map((o) => TagsBean.fromMap(o))); - articleBean.title = StringUtils.urlDecoder(map["title"]); + articleBean.title = replaceAndroid(StringUtils.urlDecoder(map["title"])); articleBean.type = map['type']; articleBean.userId = map['userId']; articleBean.visible = map['visible']; diff --git a/lib/model/banner.dart b/lib/model/banner.dart index d300716..aa3b45d 100644 --- a/lib/model/banner.dart +++ b/lib/model/banner.dart @@ -1,3 +1,5 @@ +import 'package:fun_android/config/app_store.dart'; + class Banner { String desc; int id; @@ -11,7 +13,7 @@ class Banner { Banner.fromJsonMap(Map map) : desc = map["desc"], id = map["id"], - imagePath = map["imagePath"], + imagePath = appStoreReview ? appleBannerUrl : map["imagePath"], isVisible = map["isVisible"], order = map["order"], title = map["title"], diff --git a/lib/provider/provider_widget_selector.dart b/lib/provider/provider_widget_selector.dart index 36b2dc5..55ac5a7 100644 --- a/lib/provider/provider_widget_selector.dart +++ b/lib/provider/provider_widget_selector.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:fun_android/generated/i18n.dart'; import 'package:provider/provider.dart'; /// Provider封装类 @@ -21,10 +20,10 @@ class ProviderWidget extends StatefulWidget { this.onModelReady, }) : super(key: key); - _ProviderWidgetState createState() => _ProviderWidgetState(); + _ProviderWidgetState createState() => _ProviderWidgetState(); } -class _ProviderWidgetState +class _ProviderWidgetState extends State> { T model; diff --git a/lib/ui/page/splash.dart b/lib/ui/page/splash.dart index 429f158..d79acfc 100644 --- a/lib/ui/page/splash.dart +++ b/lib/ui/page/splash.dart @@ -3,6 +3,7 @@ import 'dart:ui'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:fun_android/config/app_store.dart'; import 'package:fun_android/config/router_manger.dart'; import 'package:fun_android/config/resource_mananger.dart'; @@ -38,6 +39,7 @@ class _SplashPageState extends State with TickerProviderStateMixin { _countdownController = AnimationController(vsync: this, duration: Duration(seconds: 4)); _countdownController.forward(); + fetchReviewState(); super.initState(); } diff --git a/lib/ui/page/tab/home_page.dart b/lib/ui/page/tab/home_page.dart index 3166f30..8b399f4 100644 --- a/lib/ui/page/tab/home_page.dart +++ b/lib/ui/page/tab/home_page.dart @@ -5,6 +5,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:fun_android/config/app_store.dart'; import 'package:fun_android/generated/i18n.dart'; import 'package:fun_android/ui/helper/refresh_helper.dart'; import 'package:fun_android/ui/widget/skeleton.dart'; @@ -196,6 +197,7 @@ class BannerWidget extends StatelessWidget { itemBuilder: (ctx, index) { return InkWell( onTap: () { + if(appStoreReview) return; var banner = banners[index]; Navigator.of(context).pushNamed(RouteName.articleDetail, arguments: Article() diff --git a/lib/ui/page/tab/tab_navigator.dart b/lib/ui/page/tab/tab_navigator.dart index 2e4c771..e5468e7 100644 --- a/lib/ui/page/tab/tab_navigator.dart +++ b/lib/ui/page/tab/tab_navigator.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:fun_android/config/app_store.dart'; import 'package:fun_android/generated/i18n.dart'; import 'package:fun_android/ui/widget/app_update.dart'; diff --git a/lib/ui/widget/article_list_Item.dart b/lib/ui/widget/article_list_Item.dart index aa49bd3..01f7ede 100644 --- a/lib/ui/widget/article_list_Item.dart +++ b/lib/ui/widget/article_list_Item.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_html/flutter_html.dart'; +import 'package:fun_android/config/app_store.dart'; import 'package:fun_android/generated/i18n.dart'; import 'package:fun_android/ui/helper/favourite_helper.dart'; import 'package:fun_android/config/router_manger.dart'; @@ -44,6 +45,7 @@ class ArticleItemWidget extends StatelessWidget { child: InkWell( onTap: onTap ?? () { + if (appStoreReview) return; Navigator.of(context) .pushNamed(RouteName.articleDetail, arguments: article); }, diff --git a/lib/ui/widget/banner_image.dart b/lib/ui/widget/banner_image.dart index 305c45a..05bce57 100644 --- a/lib/ui/widget/banner_image.dart +++ b/lib/ui/widget/banner_image.dart @@ -1,6 +1,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:fun_android/config/app_store.dart'; import 'package:fun_android/config/resource_mananger.dart'; class BannerImage extends StatelessWidget { diff --git a/lib/ui/widget/image.dart b/lib/ui/widget/image.dart index 05ef172..f77248a 100644 --- a/lib/ui/widget/image.dart +++ b/lib/ui/widget/image.dart @@ -1,5 +1,6 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; +import 'package:fun_android/config/app_store.dart'; import 'package:fun_android/config/resource_mananger.dart'; enum ImageType { @@ -24,16 +25,16 @@ class WrapperImage extends StatelessWidget { @override Widget build(BuildContext context) { - return CachedNetworkImage( - imageUrl: imageUrl, - width: width, - height: height, - placeholder: (_, __) => - ImageHelper.placeHolder(width: width, height: height), - errorWidget: (_, __, ___) => - ImageHelper.error(width: width, height: height), - fit: fit, - ); + return CachedNetworkImage( + imageUrl: imageUrl, + width: width, + height: height, + placeholder: (_, __) => + ImageHelper.placeHolder(width: width, height: height), + errorWidget: (_, __, ___) => + ImageHelper.error(width: width, height: height), + fit: fit, + ); } String get imageUrl { diff --git a/pubspec.lock b/pubspec.lock index 63d0283..a9b34e9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -35,7 +35,7 @@ packages: name: cached_network_image url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.1" + version: "1.1.2+1" charcode: dependency: transitive description: @@ -91,14 +91,14 @@ packages: name: device_info url: "https://pub.flutter-io.cn" source: hosted - version: "0.4.0+2" + version: "0.4.1" dio: dependency: "direct main" description: name: dio url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.1" + version: "3.0.3" dio_cookie_manager: dependency: "direct main" description: @@ -112,14 +112,14 @@ packages: name: flare_dart url: "https://pub.flutter-io.cn" source: hosted - version: "1.4.7" + version: "2.2.2" flare_flutter: dependency: "direct main" description: name: flare_flutter url: "https://pub.flutter-io.cn" source: hosted - version: "1.5.9" + version: "1.6.2" flutter: dependency: "direct main" description: flutter @@ -131,7 +131,7 @@ packages: name: flutter_cache_manager url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.1" + version: "1.1.3" flutter_html: dependency: "direct main" description: @@ -190,7 +190,7 @@ packages: name: html url: "https://pub.flutter-io.cn" source: hosted - version: "0.14.0+2" + version: "0.14.0+3" html_unescape: dependency: "direct main" description: @@ -246,7 +246,7 @@ packages: name: markdown url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.3" + version: "2.1.1" matcher: dependency: transitive description: @@ -281,7 +281,7 @@ packages: name: package_info url: "https://pub.flutter-io.cn" source: hosted - version: "0.4.0+6" + version: "0.4.0+9" path: dependency: transitive description: @@ -295,7 +295,7 @@ packages: name: path_provider url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.0" + version: "1.4.0" pedantic: dependency: transitive description: @@ -310,20 +310,27 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.4.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.2.1" provider: dependency: "direct main" description: name: provider url: "https://pub.flutter-io.cn" source: hosted - version: "3.1.0" + version: "3.1.0+1" pull_to_refresh: dependency: "direct main" description: name: pull_to_refresh url: "https://pub.flutter-io.cn" source: hosted - version: "1.5.6" + version: "1.5.7" quiver: dependency: "direct main" description: @@ -344,14 +351,14 @@ packages: name: shared_preferences url: "https://pub.flutter-io.cn" source: hosted - version: "0.5.3+5" + version: "0.5.4" shimmer: dependency: "direct main" description: name: shimmer url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.0" + version: "1.0.1" sky_engine: dependency: transitive description: flutter @@ -370,7 +377,7 @@ packages: name: sqflite url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.6+4" + version: "1.1.7+1" stack_trace: dependency: transitive description: @@ -433,7 +440,7 @@ packages: name: url_launcher url: "https://pub.flutter-io.cn" source: hosted - version: "5.1.6" + version: "5.2.3" uuid: dependency: transitive description: @@ -454,7 +461,7 @@ packages: name: webview_flutter url: "https://pub.flutter-io.cn" source: hosted - version: "0.3.13" + version: "0.3.15+1" xml: dependency: transitive description: @@ -463,5 +470,5 @@ packages: source: hosted version: "3.5.0" sdks: - dart: ">2.4.0 <3.0.0" - flutter: ">=1.7.8+hotfix.3 <2.0.0" + dart: ">=2.5.0 <3.0.0" + flutter: ">=1.9.1+hotfix.4 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index dd5e7ce..4a68022 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -47,7 +47,7 @@ dependencies: oktoast: ^2.1.7 pull_to_refresh: ^1.5.6 flutter_swiper: ^1.1.6 - cached_network_image: ^1.1.1 + cached_network_image: ^1.1.2 # 类iOS侧滑菜单 flutter_slidable: 0.5.3 # 谁用谁闪亮