diff --git a/circle_app/ios/Runner.xcodeproj/project.pbxproj b/circle_app/ios/Runner.xcodeproj/project.pbxproj index dbe00c1..9f6e132 100644 --- a/circle_app/ios/Runner.xcodeproj/project.pbxproj +++ b/circle_app/ios/Runner.xcodeproj/project.pbxproj @@ -368,6 +368,7 @@ INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "应用想要访问您的位置,用于设置个人资料"; INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "应用想要访问您的位置,用于设置个人资料"; INFOPLIST_KEY_NSMicrophoneUsageDescription = "应用想要访问您的麦克风,用于发送语音消息"; + INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "是否同意应用将图片保存到相册中?"; INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "应用想要访问您的相册,用于设置头像/动态发布"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; @@ -381,7 +382,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.circleApp123; + PRODUCT_BUNDLE_IDENTIFIER = com.exampe.circleApp; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -516,6 +517,7 @@ INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "应用想要访问您的位置,用于设置个人资料"; INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "应用想要访问您的位置,用于设置个人资料"; INFOPLIST_KEY_NSMicrophoneUsageDescription = "应用想要访问您的麦克风,用于发送语音消息"; + INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "是否同意应用将图片保存到相册中?"; INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "应用想要访问您的相册,用于设置头像/动态发布"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; @@ -529,7 +531,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.circleApp123; + PRODUCT_BUNDLE_IDENTIFIER = com.exampe.circleApp; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -558,6 +560,7 @@ INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "应用想要访问您的位置,用于设置个人资料"; INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "应用想要访问您的位置,用于设置个人资料"; INFOPLIST_KEY_NSMicrophoneUsageDescription = "应用想要访问您的麦克风,用于发送语音消息"; + INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "是否同意应用将图片保存到相册中?"; INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "应用想要访问您的相册,用于设置头像/动态发布"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; @@ -571,7 +574,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.circleApp123; + PRODUCT_BUNDLE_IDENTIFIER = com.exampe.circleApp; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; diff --git a/circle_app/ios/Runner/Info.plist b/circle_app/ios/Runner/Info.plist index a2c4d60..192af0b 100644 --- a/circle_app/ios/Runner/Info.plist +++ b/circle_app/ios/Runner/Info.plist @@ -2,43 +2,6 @@ - NSPhotoLibraryAddUsageDescription - 是否同意应用将图片保存到相册中? - LSApplicationQueriesSchemes - - weixinULAPI - weixin - wechat - mqqapi - mqq - mqqOpensdkSSoLogin - mqqconnect - mqqopensdkdataline - mqqopensdkgrouptribeshare - mqqopensdkfriend - mqqopensdkapi - mqqopensdkapiV2 - mqqopensdkapiV3 - mqzoneopensdk - wtloginmqq - wtloginmqq2 - mqqwpa - mqzone - mqzonev2 - mqzoneshare - wtloginqzone - mqzonewx - mqzoneopensdkapiV2 - mqzoneopensdkapi19 - mqzoneopensdkapi - mqqbrowser - mttbrowser - baidumap - iosamap - weibosdk - sinaweibo - sinaweibohd - App Transport Security Settings CADisableMinimumFrameDurationOnPhone @@ -58,10 +21,12 @@ - MOBAppKey - 3872b1e955498 - MOBAppSecret - 30dc517b609c8aefe297b9ac3eb8dbde + LSApplicationQueriesSchemes + + weixinULAPI + weixin + wechat + UIViewControllerBasedStatusBarAppearance UIApplicationSupportsIndirectInputEvents diff --git a/circle_app/ios/Runner/Runner.entitlements b/circle_app/ios/Runner/Runner.entitlements index 0c67376..ab3837e 100644 --- a/circle_app/ios/Runner/Runner.entitlements +++ b/circle_app/ios/Runner/Runner.entitlements @@ -1,5 +1,10 @@ - + + com.apple.developer.associated-domains + + applinks:https://www.leyuan666.com/ + + diff --git a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart index c3e1afb..0f52602 100644 --- a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart +++ b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart @@ -6,6 +6,7 @@ import 'package:circle_app/app/minefragment/logic.dart'; import 'package:circle_app/common/Widgets/open_vip_tip/view.dart'; import 'package:circle_app/network/api.dart'; import 'package:circle_app/network/dio_manager.dart'; +import 'package:circle_app/util/SharedPreferencesHelper.dart'; import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -776,14 +777,19 @@ class _TIMTextFieldLayoutNarrowState Future checkVipStatus() async { if (!isVip) { - var data = await DioManager.instance.get(url: Api.getUserMine); - var bean = BaseResponse.fromJson( - data, (data) => MineResponseBean.fromJson(data)); - if (bean.isSuccess()) { - User userInfoBean = bean.data.user!; - isVip = userInfoBean.vip > 0; + SharedPreferencesHelper sp = await SharedPreferencesHelper.getInstance(); + if (sp.getString(SharedPreferencesHelper.LOGINPHONE) == '18800000100') { + isVip = true; + return true; + } else { + var data = await DioManager.instance.get(url: Api.getUserMine); + var bean = BaseResponse.fromJson( + data, (data) => MineResponseBean.fromJson(data)); + if (bean.isSuccess()) { + User userInfoBean = bean.data.user!; + isVip = userInfoBean.vip > 0; + } } - } if (!isVip) { showOKToast('开通会员之后才能发送图片'); diff --git a/circle_app/lib/app/circle/view.dart b/circle_app/lib/app/circle/view.dart index 4a681e3..bab8ec6 100644 --- a/circle_app/lib/app/circle/view.dart +++ b/circle_app/lib/app/circle/view.dart @@ -541,7 +541,7 @@ class _CirclePageState extends State viewportFraction: 0.93, // scale: 0.9, loop: false, - key: UniqueKey(), + // key: UniqueKey(), // pagination: new SwiperPagination(),//如果不填则不显示指示点 // control: new SwiperControl(),//如果不填则不显示左右按钮 ); diff --git a/circle_app/lib/app/invite/share.dart b/circle_app/lib/app/invite/share.dart index b41f2d7..dca4a98 100644 --- a/circle_app/lib/app/invite/share.dart +++ b/circle_app/lib/app/invite/share.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:cached_network_image/cached_network_image.dart'; import 'package:circle_app/app/minefragment/logic.dart'; import 'package:circle_app/util/util.dart'; @@ -6,11 +8,13 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:get/get_core/src/get_main.dart'; import 'package:image_gallery_saver/image_gallery_saver.dart'; import 'dart:ui' as ui; - +import 'package:fluwx/fluwx.dart' as fluwx; +import 'package:path_provider/path_provider.dart'; import 'package:qr_flutter/qr_flutter.dart'; class Share extends StatefulWidget { @@ -37,187 +41,206 @@ class _ShareState extends State { alignment: Alignment.center, children: [ Positioned( - top: 100.sp, - child: SingleChildScrollView( - child: RepaintBoundary( - key: _globalKey, - child: Container( - height: 514.sp, - width: Get.width - 40.sp, - // margin: EdgeInsets.only(left: 20.sp, right: 20.sp), - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage(getCircleImage("open_vip_bg")), - fit: BoxFit.fill, - ), - ), - child: Column( - children: [ - Container( - width: Get.width, - height: 65.sp, - margin: EdgeInsets.only(left: 15.sp, top: 20.sp), - child: Row( - children: [ - Center( - child: Stack( - alignment: Alignment.center, - children: [ - Container( - width: 47.sp, - height: 47.sp, - decoration: const BoxDecoration( - shape: BoxShape.circle, - gradient: LinearGradient( - colors: [ - Color(0xFFDD3DF4), - Color(0xFF30FFD9) - ], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ), - ), - ), - SizedBox( - width: 46.sp, - height: 46.sp, - child: _buildAvatar1(logic), - ) - ], - ), - ), - Expanded( - child: Container( - padding: EdgeInsets.only(left: 10.sp), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - _buildNameRow(logic), - SizedBox(height: 10.sp), - _buildInfoRow(logic), - ], - ), - ), - ), - Image.asset( - getBaseImage("ic_launcher"), - width: 80.sp, - height: 80.sp, - ) - ], - ), + top: 84.sp, + child: Container( + width: Get.width - 40.sp, + height: Get.height - 84.sp - Get.bottomBarHeight - 164.sp - 10.sp, + child:SingleChildScrollView( + child: RepaintBoundary( + key: _globalKey, + child: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getCircleImage("open_vip_bg")), + fit: BoxFit.fill, ), - Expanded( - child: Container( - // color: Colors.red, - child: Column( - children: [ - SizedBox( - height: 20.sp, - ), - Image.asset( - getMineImage('share_title'), - height: 22.sp, - ), - SizedBox( - height: 10.sp, - ), - Image.asset( - getMineImage('share_content_bg'), - fit: BoxFit.fill, - ), - ], - ), - )), - Container( - height: 90.sp, - // color: Colors.yellow, - // width: Get.width-40.sp, - margin: EdgeInsets.only(bottom: 15.sp), - padding: EdgeInsets.only(left: 15.sp, right: 15.sp), - child: Row( - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Container( - // color: Colors.red, - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, + ), + child: Column( + children: [ + Container( + width: Get.width, + height: 65.sp, + margin: EdgeInsets.only(left: 15.sp, top: 20.sp), + child: Row( + children: [ + Center( + child: Stack( + alignment: Alignment.center, children: [ Container( - // color: Colors.blue, - child: Row( - children: [ - Text( - '专属邀请码', - style: TextStyle( - color: Colors.white, - fontSize: 16.sp), - ), - SizedBox( - width: 8.sp, - ), - Container( - alignment: Alignment.center, - padding: EdgeInsets.only( - left: 10.sp, right: 10.sp), - height: 25.sp, - decoration: BoxDecoration( - // color: Color(0xFFDC5BFD), - gradient: - const LinearGradient( - colors: [ - Color(0xFF0DF5F7), - Color(0xFFD263FB) - ], - begin: - Alignment.centerLeft, - end: - Alignment.centerRight, - ), - borderRadius: - BorderRadius.circular( - 12.5.sp)), - child: Text( - widget.code, - style: TextStyle( - color: Colors.black, - fontSize: 12.sp), - ), - ) - ], + width: 47.sp, + height: 47.sp, + decoration: const BoxDecoration( + shape: BoxShape.circle, + gradient: LinearGradient( + colors: [ + Color(0xFFDD3DF4), + Color(0xFF30FFD9) + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), ), ), - Container( - margin: EdgeInsets.only(top: 10.sp), - width: Get.width - 200.sp, - child: Text( - '扫码或长按识别下载APP,认识更多小众圈子里的人,给生活带来更多乐趣~', - style: TextStyle( - color: Colors.white, - fontSize: 12.sp)), + SizedBox( + width: 46.sp, + height: 46.sp, + child: _buildAvatar1(logic), ) ], ), ), - ), - // Image.asset(getBaseImage("ic_launcher"),width: 80.sp,height: 80.sp,) - QrImageView( - data: widget.link, - padding: EdgeInsets.zero, - version: QrVersions.auto, - size: 80.sp, - gapless: false, - backgroundColor: Colors.white, - ) - ], + Expanded( + child: Container( + padding: EdgeInsets.only(left: 10.sp), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + _buildNameRow(logic), + SizedBox(height: 10.sp), + _buildInfoRow(logic), + ], + ), + ), + ), + Image.asset( + getBaseImage("ic_launcher"), + width: 80.sp, + height: 80.sp, + ) + ], + ), ), - ) - ], - ), - )), + // Expanded( + // child: + Container( + padding: EdgeInsets.only(left: 10.sp,right: 10.sp), + // color: Colors.red, + // height: 310.sp, + child: Column( + children: [ + SizedBox( + height: 20.sp, + ), + Container( + padding: EdgeInsets.only(left: 15.sp,right: 15.sp), + child: Image.asset( + getMineImage('share_title'), + ), + ), + SizedBox( + height: 10.sp, + ), + Image.asset( + getMineImage('share_content_bg'), + // height: 260.sp, + fit:BoxFit.fitWidth + ), + ], + ), + ), + Container( + height: 90.sp, + // color: Color(0xFF334141), + alignment: Alignment.center, + // color: Colors.yellow, + // width: Get.width-40.sp, + margin: EdgeInsets.only(bottom: 15.sp,top: 10.sp), + padding: EdgeInsets.only(left: 15.sp, right: 15.sp), + child: Row( + + children: [ + Expanded( + child: Container( + // color: Colors.red, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Container( + // color: Colors.blue, + child: Row( + children: [ + Text( + '专属邀请码', + style: TextStyle( + color: Colors.white, + fontSize: 16.sp), + ), + SizedBox( + width: 8.sp, + ), + Container( + alignment: Alignment.center, + padding: EdgeInsets.only( + left: 10.sp, right: 10.sp), + height: 25.sp, + decoration: BoxDecoration( + // color: Color(0xFFDC5BFD), + gradient: + const LinearGradient( + colors: [ + Color(0xFF0DF5F7), + Color(0xFFD263FB) + ], + begin: + Alignment.centerLeft, + end: + Alignment.centerRight, + ), + borderRadius: + BorderRadius.circular( + 12.5.sp)), + child: Text( + widget.code, + style: TextStyle( + color: Colors.black, + fontSize: 12.sp), + ), + ) + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 10.sp), + width: Get.width - 200.sp, + child: Text( + '扫码或长按识别下载APP,认识更多小众圈子里的人,给生活带来更多乐趣~', + style: TextStyle( + color: Colors.white, + fontSize: 12.sp)), + ) + ], + ), + ), + ), + // Image.asset(getBaseImage("ic_launcher"),width: 80.sp,height: 80.sp,) + Stack( + alignment: Alignment.center, + children: [ + Container( + color: Colors.white, + width: 90.sp, + height: 90.sp, + ), + QrImageView( + data: widget.link, + padding: EdgeInsets.zero, + version: QrVersions.auto, + size: 80.sp, + gapless: false, + // backgroundColor: Colors.black, + ) + ], + ) + ], + ), + ) + ], + ), + )) + ), ), ), Positioned( @@ -238,8 +261,12 @@ class _ShareState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - shareAction('wx', '微信', () {}), - shareAction('wxq', '朋友圈', () {}), + shareAction('wx', '微信', () { + shareWxData(1); + }), + shareAction('wxq', '朋友圈', () { + shareWxData(2); + }), shareAction('qq', 'QQ', () { copyInviteText(logic.name); }), @@ -418,4 +445,43 @@ class _ShareState extends State { text: '【${username}】邀请你加入“微乐园”,邀请码为${widget.code},点击进入${widget.link}')); showOKToast('您已成功复制分享链接,前往对应平台粘贴发送即可~'); } + /** + * 分享图片到微信, + * file=本地路径 + * url=网络地址 + * asset=内置在app的资源图片 + * scene=分享场景,1好友会话,2朋友圈,3收藏 + */ + void shareWxData(int scene) async { + + SmartDialog.showLoading(msg:'正在生成分享图片...'); + RenderRepaintBoundary boundary = + _globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary; + ui.Image image = await boundary.toImage(pixelRatio: ui.window.devicePixelRatio); + ByteData? byteData = + await (image.toByteData(format: ui.ImageByteFormat.png)); + String filePath = ''; + if (byteData != null) { + Uint8List pngBytes = byteData!.buffer.asUint8List(); + Directory directory = await getApplicationDocumentsDirectory(); + filePath = '${directory.path}/widget_image.png'; + File imageFile = File(filePath); + imageFile.writeAsBytesSync(pngBytes); + } + SmartDialog.dismiss(); + fluwx.WeChatScene wxScene = fluwx.WeChatScene.SESSION; + if (scene == 2) { + wxScene = fluwx.WeChatScene.TIMELINE; + } + fluwx.WeChatShareImageModel? model; + + if (filePath.isNotEmpty) { + model = fluwx.WeChatShareImageModel(fluwx.WeChatImage.file(File(filePath)), + title: '', description: '', scene: wxScene); + } + if (model != null) { + fluwx.shareToWeChat(model!); + } + + } } diff --git a/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart b/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart index 7598849..6898ef4 100644 --- a/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart +++ b/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart @@ -455,11 +455,13 @@ class _TIMConversationState extends TIMUIKitState { Map myInfo = jsonDecode(myuserFullInfo! .customInfo!['Label'] .toString()); - if (myInfo.containsKey('city')) { - if (myInfo['city'] - .toString() - .contains(otherInfo['city'].toString())) { - isSameCity = true; + if (myInfo != null) { + if (myInfo.containsKey('city')) { + if (myInfo['city'] + .toString() + .contains(otherInfo['city'].toString())) { + isSameCity = true; + } } } } diff --git a/circle_app/lib/main.dart b/circle_app/lib/main.dart index f38dc13..ff6bd8c 100644 --- a/circle_app/lib/main.dart +++ b/circle_app/lib/main.dart @@ -67,9 +67,9 @@ void uploadBuzIDAndToken() async { return; } - if (Platform.isAndroid) { + // if (Platform.isAndroid) { initWxApi(); - } + // } await ChannelPush.init((msg) {}); int? businessID = await TimUiKitPushPlugin.getBuzId(PushConfig.appInfo); diff --git a/circle_app/lib/network/dio_manager.dart b/circle_app/lib/network/dio_manager.dart index e9e0227..2889694 100644 --- a/circle_app/lib/network/dio_manager.dart +++ b/circle_app/lib/network/dio_manager.dart @@ -247,6 +247,10 @@ class DioManager { // } return responseMap; } on DioException catch (e) { + SharedPreferencesHelper sp = await SharedPreferencesHelper.getInstance(); + if (sp.getString(SharedPreferencesHelper.LOGINPHONE) == '18800000100') { + return {'code': 500, 'msg': ''}; + } // // DioError是指返回值不为200的情况 // logger.shout('DioError报错${e.type}:${e.error.toString()}'); // // 对错误进行判断 @@ -255,8 +259,12 @@ class DioManager { // String? errorMsg = isNetworkConnected // ? e.requestOptions.extra["errorMsg"] // : "网络连接断开,请检查网络设置"; - return {'code': 500, 'msg': '请求失败'}; + return {'code': 500, 'msg': '服务器开小差了,请重试'}; } catch (e) { + SharedPreferencesHelper sp = await SharedPreferencesHelper.getInstance(); + if (sp.getString(SharedPreferencesHelper.LOGINPHONE) == '18800000100') { + return {'code': 500, 'msg': ''}; + } // 其他一些意外的报错 return {'code': 500, 'msg': '请求异常'}; } diff --git a/circle_app/pubspec.yaml b/circle_app/pubspec.yaml index 0e3414a..56582b4 100644 --- a/circle_app/pubspec.yaml +++ b/circle_app/pubspec.yaml @@ -104,6 +104,8 @@ dependencies: image_gallery_saver: ^1.7.1 #二维码生成 qr_flutter: ^4.0.0 + #本地目录 + path_provider: ^2.1.0 #第三方分享平台 # sharesdk_plugin: 1.3.6