Skip to content

Commit 32ff0e7

Browse files
committed
merge
2 parents 5f24279 + 92c472a commit 32ff0e7

26 files changed

+938
-488
lines changed

UISCENE_PLUGIN_RISK.md

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# UIScene Plugin Risk Checklist
2+
3+
- Project: `gsy_github_app_flutter`
4+
- Generated on: 2026-02-13
5+
- Scope: iOS plugins listed in `.flutter-plugins-dependencies`
6+
- Method: static source scan for Scene lifecycle compatibility signals (`FlutterSceneLifeCycleDelegate`, `addSceneDelegate`, usage of `UIApplication.keyWindow` / `windows`, and AppDelegate lifecycle hooks).
7+
8+
## High Risk
9+
10+
### 1. `url_launcher_ios 6.3.6`
11+
- Risk level: High
12+
- Why:
13+
- Uses deprecated window lookup via `UIApplication.shared.keyWindow`, which is scene-unaware.
14+
- Evidence:
15+
- `/Users/guoshuyu/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.6/ios/url_launcher_ios/Sources/url_launcher_ios/URLLauncherPlugin.swift:22`
16+
- Impact:
17+
- In multi-scene/iPad multi-window mode, in-app Safari presentation may target the wrong scene or fail to present.
18+
19+
### 2. `flutter_inappwebview_ios 1.1.2`
20+
- Risk level: High
21+
- Why:
22+
- Multiple code paths still use `keyWindow` / `UIApplication.shared.windows`, which can be incorrect under multi-scene.
23+
- Evidence:
24+
- `/Users/guoshuyu/.pub-cache/hosted/pub.dev/flutter_inappwebview_ios-1.1.2/ios/Classes/HeadlessInAppWebView/HeadlessInAppWebView.swift:40`
25+
- `/Users/guoshuyu/.pub-cache/hosted/pub.dev/flutter_inappwebview_ios-1.1.2/ios/Classes/UIApplication/VisibleViewController.swift:13`
26+
- `/Users/guoshuyu/.pub-cache/hosted/pub.dev/flutter_inappwebview_ios-1.1.2/ios/Classes/WebAuthenticationSession/WebAuthenticationSession.swift:93`
27+
- Impact:
28+
- Headless WebView attach point, visible view-controller resolution, and web-auth presentation anchor may bind to the wrong window/scene.
29+
30+
## Medium Risk
31+
32+
### 1. `fluttertoast 8.2.10`
33+
- Risk level: Medium
34+
- Why:
35+
- Chooses UI window via `UIApplication.sharedApplication.windows` and key-window iteration.
36+
- Evidence:
37+
- `/Users/guoshuyu/.pub-cache/hosted/pub.dev/fluttertoast-8.2.10/ios/Classes/FluttertoastPlugin.m:130`
38+
- Impact:
39+
- Toast may appear on a non-active scene window or behave inconsistently in multi-window mode.
40+
41+
## Low Risk
42+
43+
### 1. `share_plus 12.0.1`
44+
- Risk level: Low
45+
- Why:
46+
- Uses `connectedScenes` and `UIWindowScene.windows` for root view-controller selection on iOS 13+.
47+
- Evidence:
48+
- `/Users/guoshuyu/.pub-cache/hosted/pub.dev/share_plus-12.0.1/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m:12`
49+
- Note:
50+
- Keeps a fallback to `keyWindow` for iOS 12 and below (acceptable for non-scene OS versions).
51+
52+
### 2. Other installed iOS plugins in this repo
53+
- `connectivity_plus 6.0.5`
54+
- `device_info_plus 10.1.2`
55+
- `package_info_plus 8.0.2`
56+
- `path_provider_foundation 2.5.1`
57+
- `permission_handler_apple 9.4.7`
58+
- `rive_common 0.4.11`
59+
- `shared_preferences_foundation 2.5.6`
60+
- `sqflite 2.3.3+1`
61+
- `webview_flutter_wkwebview 3.23.5`
62+
63+
Risk level: Low (for UIScene lifecycle migration)
64+
- Why:
65+
- No direct AppDelegate lifecycle hook usage (`addApplicationDelegate` / `openURL` callbacks / `continueUserActivity`) detected in plugin runtime source paths.
66+
67+
## Recommended Actions
68+
69+
1. Upgrade first:
70+
- `url_launcher_ios`
71+
- `flutter_inappwebview_ios`
72+
- `fluttertoast`
73+
74+
2. Run targeted iPad multi-window validation:
75+
- `url_launcher` in-app Safari presentation
76+
- InAppWebView / headless webview attach
77+
- Web auth session presentation anchor
78+
- Toast display target window
79+
- Share sheet presentation
80+
81+
3. If upgrade is blocked:
82+
- Apply local patch to resolve active `UIWindowScene` and active window/VC instead of `keyWindow`/global `windows`.

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ android {
3333
applicationId "com.shuyu.gsygithub.gsygithubappflutter"
3434
minSdkVersion flutter.minSdkVersion
3535
targetSdkVersion 35
36-
versionCode 67
37-
versionName "7.9.1"
36+
versionCode 69
37+
versionName "7.9.3"
3838
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
3939
}
4040

ios/Podfile.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,14 @@ SPEC CHECKSUMS:
9999
fluttertoast: e9a18c7be5413da53898f660530c56f35edfba9c
100100
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
101101
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
102-
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
102+
path_provider_foundation: 0b743cbb62d8e47eab856f09262bb8c1ddcfe6ba
103103
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
104104
rive_common: cbbac3192af00d7341f19dae2f26298e9e37d99e
105-
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
106-
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
105+
share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f
106+
shared_preferences_foundation: 5086985c1d43c5ba4d5e69a4e8083a389e2909e6
107107
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
108108
Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e
109-
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
109+
url_launcher_ios: bb13df5870e8c4234ca12609d04010a21be43dfa
110110
webview_flutter_wkwebview: 29eb20d43355b48fe7d07113835b9128f84e3af4
111111

112112
PODFILE CHECKSUM: 0dbd5a87e0ace00c9610d2037ac22083a01f861d

ios/Runner.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
3B1CF5E1D5F3697BA6D5E888 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC05E0EDBFF42659F21BDE4B /* Pods_Runner.framework */; };
1212
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
1313
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
14+
6B771FB42D6F90E700E9D56C /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B771FB32D6F90E700E9D56C /* SceneDelegate.swift */; };
1415
9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; };
1516
9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; };
1617
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
@@ -155,6 +156,7 @@
155156
593F42BD9F603A49DC922B8C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
156157
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
157158
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
159+
6B771FB32D6F90E700E9D56C /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
158160
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
159161
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
160162
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
@@ -252,6 +254,7 @@
252254
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
253255
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
254256
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
257+
6B771FB32D6F90E700E9D56C /* SceneDelegate.swift */,
255258
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
256259
);
257260
path = Runner;
@@ -591,6 +594,7 @@
591594
buildActionMask = 2147483647;
592595
files = (
593596
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
597+
6B771FB42D6F90E700E9D56C /* SceneDelegate.swift in Sources */,
594598
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
595599
);
596600
runOnlyForDeploymentPostprocessing = 0;

ios/Runner/AppDelegate.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@ import UIKit
22
import Flutter
33

44
@main
5-
@objc class AppDelegate: FlutterAppDelegate {
5+
@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {
6+
func didInitializeImplicitFlutterEngine(
7+
_ engineBridge: FlutterImplicitEngineBridge
8+
) {
9+
GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry)
10+
}
11+
612
override func application(
713
_ application: UIApplication,
814
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?
915
) -> Bool {
10-
GeneratedPluginRegistrant.register(with: self)
1116
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
1217
}
1318
}

ios/Runner/Info.plist

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,13 @@
1717
<key>CFBundlePackageType</key>
1818
<string>APPL</string>
1919
<key>CFBundleShortVersionString</key>
20-
<string>7.9.1</string>
21-
<key>CFBundleSignature</key>
20+
<string>7.9.3</string> <key>CFBundleSignature</key>
2221
<string>????</string>
2322
<key>CFBundleVersion</key>
2423
<string>$(CURRENT_PROJECT_VERSION)</string>
2524
<key>LSApplicationCategoryType</key>
2625
<string></string>
27-
<key>LSRequiresIPhoneOS</key>
28-
<true/>
26+
<key>LSRequiresIPhoneOS</key> <true/>
2927
<key>NSAppTransportSecurity</key>
3028
<dict>
3129
<key>NSAllowsArbitraryLoads</key>
@@ -59,6 +57,25 @@
5957
<string>LaunchScreen</string>
6058
<key>UIMainStoryboardFile</key>
6159
<string>Main</string>
60+
<key>UIApplicationSceneManifest</key>
61+
<dict>
62+
<key>UIApplicationSupportsMultipleScenes</key>
63+
<false/>
64+
<key>UISceneConfigurations</key>
65+
<dict>
66+
<key>UIWindowSceneSessionRoleApplication</key>
67+
<array>
68+
<dict>
69+
<key>UISceneConfigurationName</key>
70+
<string>Default Configuration</string>
71+
<key>UISceneDelegateClassName</key>
72+
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
73+
<key>UISceneStoryboardFile</key>
74+
<string>Main</string>
75+
</dict>
76+
</array>
77+
</dict>
78+
</dict>
6279
<key>UISupportedInterfaceOrientations</key>
6380
<array>
6481
<string>UIInterfaceOrientationPortrait</string>

ios/Runner/SceneDelegate.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import Flutter
2+
3+
class SceneDelegate: FlutterSceneDelegate {}

lib/common/config/config.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
class Config {
2-
32
// Private constructor to prevent instantiation
43
Config._();
54

65
static bool? DEBUG = true;
76

8-
9-
107
static const PAGE_SIZE = 20;
118

129
/// //////////////////////////////////////常量////////////////////////////////////// ///
@@ -21,4 +18,5 @@ class Config {
2118
static const REFRESH_LANGUAGE = "refreshLanguageApp";
2219
static const THEME_COLOR = "theme-color";
2320
static const LOCALE = "locale";
21+
static const VIBRATION_ENABLE = "vibration-enable";
2422
}

lib/common/localization/l10n/app_en.arb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"login_deprecated": "The API via password authentication will remove on November 13, 2020 by Github",
2525
"home_reply": "Feedback",
2626
"home_change_language": "Language",
27+
"home_vibration": "Vibration",
2728
"home_change_grey": "Grey",
2829
"home_about": "About",
2930
"home_check_update": "Check Update",
@@ -135,4 +136,4 @@
135136
"search_sort": "Sort",
136137
"search_language": "Language",
137138
"feed_back_tip": "Your feedback will be sent to Github as a public issue"
138-
}
139+
}

lib/common/localization/l10n/app_ja.arb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"login_deprecated": "パスワード認証APIは2020年11月13日にGithubによって削除されます",
2525
"home_reply": "フィードバック",
2626
"home_change_language": "言語",
27+
"home_vibration": "振動フィードバック",
2728
"home_change_grey": "グレースケール",
2829
"home_about": "について",
2930
"home_check_update": "更新確認",
@@ -135,4 +136,4 @@
135136
"search_sort": "並び替え",
136137
"search_language": "言語",
137138
"feed_back_tip": "あなたのフィードバックは公開IssueとしてGitHubに送信されます"
138-
}
139+
}

0 commit comments

Comments
 (0)