JunnySoft Dev Kit
企业级Flutter开发工具包,提供统计分析、数据库管理、多语言翻译等完整解决方案。
📚 文档中心
📖 查看完整文档 - 包含API参考、最佳实践、示例代码、故障排除等完整文档
🚀 核心功能
- 📊 统计分析系统 - 企业级用户行为追踪和性能监控
- 🗄️ 数据库管理 - 高性能多实例数据库解决方案
- 🌐 多语言翻译 - 动态国际化和本地化支持
- 🔧 开发工具 - ISpect Console集成的调试和监控工具
Getting Started
dependencies:
junny_dev_kit: ^latest_version // 替换成最新的版本号
导入开发包
import 'package:junny_dev_kit/junny_dev_kit.dart';
🚀 快速使用
统计分析
// 页面访问统计
AnalyticsUtils.instance.trackPageView(pageName: '/home');
// 按钮点击统计
AnalyticsUtils.instance.trackButtonClick(buttonName: 'submit');
// 性能监控
AnalyticsUtils.instance.trackPerformance(
operationType: 'api_call',
duration: Duration(milliseconds: 200),
);
ISpect Console 调试
在ISpect Console中新增了统计功能:
- 📊 统计导出 - 支持JSON、CSV、报告格式
- 🧪 统计测试 - 一键测试所有统计功能
更多功能
查看 📖 完整文档 了解数据库、翻译等更多功能的使用方法。
安卓的权限依赖
<!-- 访问网络状态-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 外置存储存取权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
<!-- For android 13/API33 -->
<!-- Add this if you need to take photos. -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<!--Starting with API 33. this permission is needed for notifications-->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<!-- 控制呼吸灯,振动器等,用于新消息提醒 -->
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<queries>
<!-- Place inside the <queries> element. -->
<intent>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
</intent>
<!-- If your app checks for SMS support -->
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="sms" />
</intent>
<!-- If your app checks for call support -->
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="tel" />
</intent>
</queries>
一些依赖包需要在项目做的各种配置
background_downloader
Android
No setup is required if you don't use notifications. If you do:
- Starting with API 33, you need to
add
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
to your app'sAndroidManifest.xml
- If needed, localize the button text by overriding string
resources
bg_downloader_cancel
,bg_downloader_pause
,bg_downloader_resume
and descriptionsbg_downloader_notification_channel_name
,bg_downloader_notification_channel_description
.
Using foreground service on Android targeting API 34
If targeting API 34 or greater, you must add to your AndroidManifest.xml
a permission declaration <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
and the foreground service type definition (under the application
element):
<service
android:name="androidx.work.impl.foreground.SystemForegroundService"
android:foregroundServiceType="dataSync"
tools:node="merge" />
iOS
On iOS, ensure that you have the Background Fetch capability enabled:
- Select the Runner target in XCode
- Select the Signing & Capabilities tab
- Click the + icon to add capabilities
- Select 'Background Modes'
- Tick the 'Background Fetch' mode
Note that iOS by default requires all URLs to be https (and not http). See here for more details and how to address issues.
If using notifications, add the following to your AppDelegate.swift
:
UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
or if using Objective C, add to AppDelegate.m
:
[UNUserNotificationCenter currentNotificationCenter].delegate = (id<UNUserNotificationCenterDelegate>) self;
back_button_interceptor
To make it work on Android 13 and up, set this to false in the Android manifest:
<activity
android:name=".MainActivity"
android:enableOnBackInvokedCallback="false">