diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 1dc6cf7..391a902 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -20,7 +20,5 @@ ???? CFBundleVersion 1.0 - MinimumOSVersion - 13.0 diff --git a/ios/Flutter/ShareExtension-Debug.xcconfig b/ios/Flutter/ShareExtension-Debug.xcconfig new file mode 100644 index 0000000..add9a31 --- /dev/null +++ b/ios/Flutter/ShareExtension-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "../Pods/Target Support Files/Pods-Share Extension/Pods-Share Extension.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/ShareExtension-Profile.xcconfig b/ios/Flutter/ShareExtension-Profile.xcconfig new file mode 100644 index 0000000..4d71a13 --- /dev/null +++ b/ios/Flutter/ShareExtension-Profile.xcconfig @@ -0,0 +1,2 @@ +#include? "../Pods/Target Support Files/Pods-Share Extension/Pods-Share Extension.profile.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/ShareExtension-Release.xcconfig b/ios/Flutter/ShareExtension-Release.xcconfig new file mode 100644 index 0000000..d67b4ca --- /dev/null +++ b/ios/Flutter/ShareExtension-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "../Pods/Target Support Files/Pods-Share Extension/Pods-Share Extension.release.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/TimetableWidget-Debug.xcconfig b/ios/Flutter/TimetableWidget-Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/TimetableWidget-Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Flutter/TimetableWidget-Profile.xcconfig b/ios/Flutter/TimetableWidget-Profile.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/TimetableWidget-Profile.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Flutter/TimetableWidget-Release.xcconfig b/ios/Flutter/TimetableWidget-Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/TimetableWidget-Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 90eadc9..0c8e34b 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -36,53 +36,37 @@ PODS: - SwiftyGif - emoji_picker_flutter (0.0.1): - Flutter - - fast_rsa (0.7.0): + - eraser (0.0.1): - Flutter - file_picker (0.0.1): - DKImagePickerController/PhotoGallery - Flutter - - Firebase/CoreOnly (12.4.0): - - FirebaseCore (~> 12.4.0) - - Firebase/InAppMessaging (12.4.0): + - Firebase/CoreOnly (12.12.0): + - FirebaseCore (~> 12.12.0) + - Firebase/Messaging (12.12.0): - Firebase/CoreOnly - - FirebaseInAppMessaging (~> 12.4.0-beta) - - Firebase/Messaging (12.4.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 12.4.0) - - firebase_core (4.2.1): - - Firebase/CoreOnly (= 12.4.0) + - FirebaseMessaging (~> 12.12.0) + - firebase_core (4.7.0): + - Firebase/CoreOnly (= 12.12.0) - Flutter - - firebase_in_app_messaging (0.9.0-4): - - Firebase/InAppMessaging (= 12.4.0) + - firebase_messaging (16.2.0): + - Firebase/Messaging (= 12.12.0) - firebase_core - Flutter - - firebase_messaging (16.0.4): - - Firebase/Messaging (= 12.4.0) - - firebase_core - - Flutter - - FirebaseABTesting (12.4.0): - - FirebaseCore (~> 12.4.0) - - FirebaseCore (12.4.0): - - FirebaseCoreInternal (~> 12.4.0) + - FirebaseCore (12.12.1): + - FirebaseCoreInternal (~> 12.12.0) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/Logger (~> 8.1) - - FirebaseCoreInternal (12.4.0): + - FirebaseCoreInternal (12.12.0): - "GoogleUtilities/NSData+zlib (~> 8.1)" - - FirebaseInAppMessaging (12.4.0-beta): - - FirebaseABTesting (~> 12.4.0) - - FirebaseCore (~> 12.4.0) - - FirebaseInstallations (~> 12.4.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - nanopb (~> 3.30910.0) - - FirebaseInstallations (12.4.0): - - FirebaseCore (~> 12.4.0) + - FirebaseInstallations (12.12.0): + - FirebaseCore (~> 12.12.0) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/UserDefaults (~> 8.1) - PromisesObjC (~> 2.4) - - FirebaseMessaging (12.4.0): - - FirebaseCore (~> 12.4.0) - - FirebaseInstallations (~> 12.4.0) + - FirebaseMessaging (12.12.0): + - FirebaseCore (~> 12.12.0) + - FirebaseInstallations (~> 12.12.0) - GoogleDataTransport (~> 10.1) - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - GoogleUtilities/Environment (~> 8.1) @@ -96,6 +80,9 @@ PODS: - Flutter - flutter_native_splash (2.4.3): - Flutter + - flutter_secure_storage_darwin (10.0.0): + - Flutter + - FlutterMacOS - GoogleDataTransport (10.1.0): - nanopb (~> 3.30910.0) - PromisesObjC (~> 2.4) @@ -123,6 +110,8 @@ PODS: - GoogleUtilities/UserDefaults (8.1.0): - GoogleUtilities/Logger - GoogleUtilities/Privacy + - home_widget (0.0.1): + - Flutter - image_picker_ios (0.0.1): - Flutter - in_app_review (2.0.0): @@ -136,9 +125,6 @@ PODS: - Flutter - package_info_plus (0.4.5): - Flutter - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - PhoneNumberKit (3.7.11): - PhoneNumberKit/PhoneNumberKitCore (= 3.7.11) - PhoneNumberKit/UIKit (= 3.7.11) @@ -146,9 +132,13 @@ PODS: - PhoneNumberKit/UIKit (3.7.11): - PhoneNumberKit/PhoneNumberKitCore - PromisesObjC (2.4.0) - - SDWebImage (5.21.2): - - SDWebImage/Core (= 5.21.2) - - SDWebImage/Core (5.21.2) + - receive_sharing_intent (1.8.1): + - Flutter + - screen_brightness_ios (2.1.3): + - Flutter + - SDWebImage (5.21.7): + - SDWebImage/Core (= 5.21.7) + - SDWebImage/Core (5.21.7) - share_plus (0.0.1): - Flutter - shared_preferences_foundation (0.0.1): @@ -162,41 +152,51 @@ PODS: - Flutter - url_launcher_ios (0.0.1): - Flutter + - video_player_avfoundation (0.0.1): + - Flutter + - FlutterMacOS + - wakelock_plus (0.0.1): + - Flutter + - workmanager_apple (0.0.1): + - Flutter DEPENDENCIES: - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - emoji_picker_flutter (from `.symlinks/plugins/emoji_picker_flutter/ios`) - - fast_rsa (from `.symlinks/plugins/fast_rsa/ios`) + - eraser (from `.symlinks/plugins/eraser/ios`) - file_picker (from `.symlinks/plugins/file_picker/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_in_app_messaging (from `.symlinks/plugins/firebase_in_app_messaging/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - Flutter (from `Flutter`) - flutter_app_badge (from `.symlinks/plugins/flutter_app_badge/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) + - flutter_secure_storage_darwin (from `.symlinks/plugins/flutter_secure_storage_darwin/darwin`) + - home_widget (from `.symlinks/plugins/home_widget/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - in_app_review (from `.symlinks/plugins/in_app_review/ios`) - open_filex (from `.symlinks/plugins/open_filex/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - PhoneNumberKit (~> 3.7.6) + - receive_sharing_intent (from `.symlinks/plugins/receive_sharing_intent/ios`) + - screen_brightness_ios (from `.symlinks/plugins/screen_brightness_ios/ios`) - share_plus (from `.symlinks/plugins/share_plus/ios`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) - syncfusion_flutter_pdfviewer (from `.symlinks/plugins/syncfusion_flutter_pdfviewer/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`) + - wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`) + - workmanager_apple (from `.symlinks/plugins/workmanager_apple/ios`) SPEC REPOS: trunk: - DKImagePickerController - DKPhotoGallery - Firebase - - FirebaseABTesting - FirebaseCore - FirebaseCoreInternal - - FirebaseInAppMessaging - FirebaseInstallations - FirebaseMessaging - GoogleDataTransport @@ -214,14 +214,12 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/device_info_plus/ios" emoji_picker_flutter: :path: ".symlinks/plugins/emoji_picker_flutter/ios" - fast_rsa: - :path: ".symlinks/plugins/fast_rsa/ios" + eraser: + :path: ".symlinks/plugins/eraser/ios" file_picker: :path: ".symlinks/plugins/file_picker/ios" firebase_core: :path: ".symlinks/plugins/firebase_core/ios" - firebase_in_app_messaging: - :path: ".symlinks/plugins/firebase_in_app_messaging/ios" firebase_messaging: :path: ".symlinks/plugins/firebase_messaging/ios" Flutter: @@ -232,6 +230,10 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_local_notifications/ios" flutter_native_splash: :path: ".symlinks/plugins/flutter_native_splash/ios" + flutter_secure_storage_darwin: + :path: ".symlinks/plugins/flutter_secure_storage_darwin/darwin" + home_widget: + :path: ".symlinks/plugins/home_widget/ios" image_picker_ios: :path: ".symlinks/plugins/image_picker_ios/ios" in_app_review: @@ -240,8 +242,10 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/open_filex/ios" package_info_plus: :path: ".symlinks/plugins/package_info_plus/ios" - path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/darwin" + receive_sharing_intent: + :path: ".symlinks/plugins/receive_sharing_intent/ios" + screen_brightness_ios: + :path: ".symlinks/plugins/screen_brightness_ios/ios" share_plus: :path: ".symlinks/plugins/share_plus/ios" shared_preferences_foundation: @@ -252,6 +256,12 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/syncfusion_flutter_pdfviewer/ios" url_launcher_ios: :path: ".symlinks/plugins/url_launcher_ios/ios" + video_player_avfoundation: + :path: ".symlinks/plugins/video_player_avfoundation/darwin" + wakelock_plus: + :path: ".symlinks/plugins/wakelock_plus/ios" + workmanager_apple: + :path: ".symlinks/plugins/workmanager_apple/ios" SPEC CHECKSUMS: connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd @@ -259,40 +269,43 @@ SPEC CHECKSUMS: DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 emoji_picker_flutter: ece213fc274bdddefb77d502d33080dc54e616cc - fast_rsa: fb70897d51040b094c780d5f1d7358614738b879 + eraser: 83a4b06985f3702aa3d8dec816f9693266012937 file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be - Firebase: f07b15ae5a6ec0f93713e30b923d9970d144af3e - firebase_core: f1aafb21c14f497e5498f7ffc4dc63cbb52b2594 - firebase_in_app_messaging: 04dfc07ab81578ef83bf0c0229be258ddf287c4f - firebase_messaging: c17a29984eafce4b2997fe078bb0a9e0b06f5dde - FirebaseABTesting: c05b5ec9f1d9f21a65909525de301d375032d9a4 - FirebaseCore: bb595f3114953664e3c1dc032f008a244147cfd3 - FirebaseCoreInternal: d7f5a043c2cd01a08103ab586587c1468047bca6 - FirebaseInAppMessaging: 606dd4d4d5590a3d8229f363fdebb485235985b2 - FirebaseInstallations: ae9f4902cb5bf1d0c5eaa31ec1f4e5495a0714e2 - FirebaseMessaging: d33971b7bb252745ea6cd31ab190d1a1df4b8ed5 + Firebase: aa154fee4e9b8eac17aa42344988865b3e857d33 + firebase_core: 9156a152117c843440b0b990c785aa0259bc5447 + firebase_messaging: 0d962ab44ff24ed36deb8fa2ee043c4671858269 + FirebaseCore: 86241206e656f5c80c995e370e6c975913b9b284 + FirebaseCoreInternal: 7c12fc3011d889085e765e317d7b9fd1cef97af9 + FirebaseInstallations: 4e6e162aa4abaaeeeb01dd00179dfc5ad9c2194e + FirebaseMessaging: 341004946fa7ffc741344b20f1b667514fc93e31 Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 flutter_app_badge: ca742dd659a157c1090ef7cd881cb78f48f3bcdf - flutter_local_notifications: a5a732f069baa862e728d839dd2ebb904737effb + flutter_local_notifications: 643a3eda1ce1c0599413ca31672536d423dee214 flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf + flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23 GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 + home_widget: f169fc41fd807b4d46ab6615dc44d62adbf9f64f image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326 in_app_review: 7dd1ea365263f834b8464673f9df72c80c17c937 nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 open_filex: 432f3cd11432da3e39f47fcc0df2b1603854eff1 package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 - path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880 PhoneNumberKit: ced55861269312a5e3bc2ef82a58d6255b1c976a PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a + receive_sharing_intent: 222384f00ffe7e952bbfabaa9e3967cb87e5fe00 + screen_brightness_ios: 212d950bb99c915eee971c884f4a6c87c92cd13d + SDWebImage: e9fc87c1aab89a8ab1bbd74eba378c6f53be8abf share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 syncfusion_flutter_pdfviewer: 90dc48305d2e33d4aa20681d1e98ddeda891bc14 url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b + video_player_avfoundation: 3453f792138786248960ca029747fcd9f318ef52 + wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556 + workmanager_apple: 904529ae31e97fc5be632cf628507652294a0778 -PODFILE CHECKSUM: e21c9d4c7b9623c73c6784ddc132fd50a603ad93 +PODFILE CHECKSUM: 424a9b4c0fe81d8ebeaa9cb0dfedb60a68b19a0d COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 7227682..d612d3e 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -7,17 +7,50 @@ objects = { /* Begin PBXBuildFile section */ + 034BD2FF7A860C6DC2FED514 /* Pods_Share_Extension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F2428AC5384E0EF8DAB462A /* Pods_Share_Extension.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3321F80F2FB1C00C0011C712 /* Share Extension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 3321F8052FB1C00C0011C712 /* Share Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 33FDB0982EE9ABDC000B2391 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 33FDB0972EE9ABDC000B2391 /* GoogleService-Info.plist */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + AA0101070000000011111111 /* TimetableWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = AA0101020000000011111111 /* TimetableWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + AA0102010000000022222222 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA0102020000000022222222 /* SceneDelegate.swift */; }; B8263932DB64B022CCEE7A53 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 90960A132A5F91779B3FBE28 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 3321F80D2FB1C00C0011C712 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3321F8042FB1C00C0011C712; + remoteInfo = "Share Extension"; + }; + AA0101080000000011111111 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = AA0101010000000011111111; + remoteInfo = TimetableWidgetExtension; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXCopyFilesBuildPhase section */ + 3321F8102FB1C00C0011C712 /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 3321F80F2FB1C00C0011C712 /* Share Extension.appex in Embed Foundation Extensions */, + AA0101070000000011111111 /* TimetableWidgetExtension.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; 9705A1C41CF9048500538489 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -33,9 +66,12 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3321F8052FB1C00C0011C712 /* Share Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Share Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 33FDB0972EE9ABDC000B2391 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 4509EC31CB08BA9BF367AF6C /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 4F2428AC5384E0EF8DAB462A /* Pods_Share_Extension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Share_Extension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 60E1803A3FB28FCC6F435E99 /* Pods-Share Extension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Share Extension.release.xcconfig"; path = "Target Support Files/Pods-Share Extension/Pods-Share Extension.release.xcconfig"; sourceTree = ""; }; 64801C012A9112D500E8B558 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -48,11 +84,73 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + AA0101020000000011111111 /* TimetableWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = TimetableWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + AA0102020000000022222222 /* SceneDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; AA6B03D1433E7395021F7730 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + BB0001010000000011111111 /* ShareExtension-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "ShareExtension-Debug.xcconfig"; path = "Flutter/ShareExtension-Debug.xcconfig"; sourceTree = ""; }; + BB0001020000000011111111 /* ShareExtension-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "ShareExtension-Release.xcconfig"; path = "Flutter/ShareExtension-Release.xcconfig"; sourceTree = ""; }; + BB0001030000000011111111 /* ShareExtension-Profile.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "ShareExtension-Profile.xcconfig"; path = "Flutter/ShareExtension-Profile.xcconfig"; sourceTree = ""; }; + BB0001040000000011111111 /* TimetableWidget-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "TimetableWidget-Debug.xcconfig"; path = "Flutter/TimetableWidget-Debug.xcconfig"; sourceTree = ""; }; + BB0001050000000011111111 /* TimetableWidget-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "TimetableWidget-Release.xcconfig"; path = "Flutter/TimetableWidget-Release.xcconfig"; sourceTree = ""; }; + BB0001060000000011111111 /* TimetableWidget-Profile.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "TimetableWidget-Profile.xcconfig"; path = "Flutter/TimetableWidget-Profile.xcconfig"; sourceTree = ""; }; C7E1879BE78835C7E3256316 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DD904D7C0FC0AD11449CEB80 /* Pods-Share Extension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Share Extension.debug.xcconfig"; path = "Target Support Files/Pods-Share Extension/Pods-Share Extension.debug.xcconfig"; sourceTree = ""; }; + EF5279D9BF8FCBB117AF998E /* Pods-Share Extension.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Share Extension.profile.xcconfig"; path = "Target Support Files/Pods-Share Extension/Pods-Share Extension.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + AA01010E0000000011111111 /* Exceptions for "Share Extension" folder in "Share Extension" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = 3321F8042FB1C00C0011C712 /* Share Extension */; + }; + AA01010F0000000011111111 /* Exceptions for "TimetableWidgetExtension" folder in "TimetableWidgetExtension" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = AA0101010000000011111111 /* TimetableWidgetExtension */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 3321F8062FB1C00C0011C712 /* Share Extension */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + AA01010E0000000011111111 /* Exceptions for "Share Extension" folder in "Share Extension" target */, + ); + explicitFileTypes = { + }; + explicitFolders = ( + ); + path = "Share Extension"; + sourceTree = ""; + }; + AA0101030000000011111111 /* TimetableWidgetExtension */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + AA01010F0000000011111111 /* Exceptions for "TimetableWidgetExtension" folder in "TimetableWidgetExtension" target */, + ); + explicitFileTypes = { + }; + explicitFolders = ( + ); + path = TimetableWidgetExtension; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + /* Begin PBXFrameworksBuildPhase section */ + 3321F8022FB1C00C0011C712 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 034BD2FF7A860C6DC2FED514 /* Pods_Share_Extension.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -61,6 +159,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AA0101050000000011111111 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -70,6 +175,9 @@ C7E1879BE78835C7E3256316 /* Pods-Runner.debug.xcconfig */, AA6B03D1433E7395021F7730 /* Pods-Runner.release.xcconfig */, 4509EC31CB08BA9BF367AF6C /* Pods-Runner.profile.xcconfig */, + DD904D7C0FC0AD11449CEB80 /* Pods-Share Extension.debug.xcconfig */, + 60E1803A3FB28FCC6F435E99 /* Pods-Share Extension.release.xcconfig */, + EF5279D9BF8FCBB117AF998E /* Pods-Share Extension.profile.xcconfig */, ); path = Pods; sourceTree = ""; @@ -78,6 +186,7 @@ isa = PBXGroup; children = ( 90960A132A5F91779B3FBE28 /* Pods_Runner.framework */, + 4F2428AC5384E0EF8DAB462A /* Pods_Share_Extension.framework */, ); name = Frameworks; sourceTree = ""; @@ -89,6 +198,12 @@ 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 9740EEB31CF90195004384FC /* Generated.xcconfig */, + BB0001010000000011111111 /* ShareExtension-Debug.xcconfig */, + BB0001020000000011111111 /* ShareExtension-Release.xcconfig */, + BB0001030000000011111111 /* ShareExtension-Profile.xcconfig */, + BB0001040000000011111111 /* TimetableWidget-Debug.xcconfig */, + BB0001050000000011111111 /* TimetableWidget-Release.xcconfig */, + BB0001060000000011111111 /* TimetableWidget-Profile.xcconfig */, ); name = Flutter; sourceTree = ""; @@ -98,6 +213,8 @@ children = ( 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, + 3321F8062FB1C00C0011C712 /* Share Extension */, + AA0101030000000011111111 /* TimetableWidgetExtension */, 97C146EF1CF9000F007C117D /* Products */, 345F4BD4143471FDA71626DE /* Pods */, 731388A08E3B330B216381D0 /* Frameworks */, @@ -108,6 +225,8 @@ isa = PBXGroup; children = ( 97C146EE1CF9000F007C117D /* Runner.app */, + 3321F8052FB1C00C0011C712 /* Share Extension.appex */, + AA0101020000000011111111 /* TimetableWidgetExtension.appex */, ); name = Products; sourceTree = ""; @@ -124,6 +243,7 @@ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + AA0102020000000022222222 /* SceneDelegate.swift */, 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, ); path = Runner; @@ -132,6 +252,27 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 3321F8042FB1C00C0011C712 /* Share Extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3321F8152FB1C00C0011C712 /* Build configuration list for PBXNativeTarget "Share Extension" */; + buildPhases = ( + AC0316D13BD5FB74CD9B5223 /* [CP] Check Pods Manifest.lock */, + 3321F8012FB1C00C0011C712 /* Sources */, + 3321F8022FB1C00C0011C712 /* Frameworks */, + 3321F8032FB1C00C0011C712 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 3321F8062FB1C00C0011C712 /* Share Extension */, + ); + name = "Share Extension"; + productName = "Share Extension"; + productReference = 3321F8052FB1C00C0011C712 /* Share Extension.appex */; + productType = "com.apple.product-type.app-extension"; + }; 97C146ED1CF9000F007C117D /* Runner */ = { isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; @@ -142,6 +283,7 @@ 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3321F8102FB1C00C0011C712 /* Embed Foundation Extensions */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 174B54D80220E5F588BD9737 /* [CP] Embed Pods Frameworks */, 859FAB4E05FAC31B7B1A62D7 /* [CP] Copy Pods Resources */, @@ -149,12 +291,34 @@ buildRules = ( ); dependencies = ( + 3321F80E2FB1C00C0011C712 /* PBXTargetDependency */, + AA0101090000000011111111 /* PBXTargetDependency */, ); name = Runner; productName = Runner; productReference = 97C146EE1CF9000F007C117D /* Runner.app */; productType = "com.apple.product-type.application"; }; + AA0101010000000011111111 /* TimetableWidgetExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = AA01010D0000000011111111 /* Build configuration list for PBXNativeTarget "TimetableWidgetExtension" */; + buildPhases = ( + AA0101040000000011111111 /* Sources */, + AA0101050000000011111111 /* Frameworks */, + AA0101060000000011111111 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + AA0101030000000011111111 /* TimetableWidgetExtension */, + ); + name = TimetableWidgetExtension; + productName = TimetableWidgetExtension; + productReference = AA0101020000000011111111 /* TimetableWidgetExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -162,13 +326,20 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 2610; LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { + 3321F8042FB1C00C0011C712 = { + CreatedOnToolsVersion = 26.1.1; + }; 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; LastSwiftMigration = 1100; }; + AA0101010000000011111111 = { + CreatedOnToolsVersion = 26.1.1; + }; }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; @@ -185,11 +356,20 @@ projectRoot = ""; targets = ( 97C146ED1CF9000F007C117D /* Runner */, + 3321F8042FB1C00C0011C712 /* Share Extension */, + AA0101010000000011111111 /* TimetableWidgetExtension */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 3321F8032FB1C00C0011C712 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 97C146EC1CF9000F007C117D /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -202,6 +382,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AA0101060000000011111111 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -213,14 +400,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; @@ -250,14 +433,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; @@ -278,6 +457,28 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + AC0316D13BD5FB74CD9B5223 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Share Extension-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; EE78ADC5E762D17A29097E92 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -303,17 +504,45 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 3321F8012FB1C00C0011C712 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 97C146EA1CF9000F007C117D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + AA0102010000000022222222 /* SceneDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; + AA0101040000000011111111 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 3321F80E2FB1C00C0011C712 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3321F8042FB1C00C0011C712 /* Share Extension */; + targetProxy = 3321F80D2FB1C00C0011C712 /* PBXContainerItemProxy */; + }; + AA0101090000000011111111 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AA0101010000000011111111 /* TimetableWidgetExtension */; + targetProxy = AA0101080000000011111111 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ 97C146FA1CF9000F007C117D /* Main.storyboard */ = { isa = PBXVariantGroup; @@ -375,7 +604,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -394,6 +623,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CUSTOM_GROUP_ID = group.eu.mhsl.marianum.mobile.client.share; DEVELOPMENT_TEAM = MY55VF3KPG; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -403,7 +633,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = "${FLUTTER_BUILD_NAME)"; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; PRODUCT_BUNDLE_IDENTIFIER = eu.mhsl.marianum.mobile.client; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -413,6 +643,132 @@ }; name = Profile; }; + 3321F8112FB1C00C0011C712 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BB0001010000000011111111 /* ShareExtension-Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "Share Extension/Share Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CUSTOM_GROUP_ID = group.eu.mhsl.marianum.mobile.client.share; + DEVELOPMENT_TEAM = MY55VF3KPG; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + INFOPLIST_FILE = "Share Extension/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "eu.mhsl.marianum.mobile.client.Share-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 3321F8122FB1C00C0011C712 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BB0001020000000011111111 /* ShareExtension-Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "Share Extension/Share Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CUSTOM_GROUP_ID = group.eu.mhsl.marianum.mobile.client.share; + DEVELOPMENT_TEAM = MY55VF3KPG; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + INFOPLIST_FILE = "Share Extension/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "eu.mhsl.marianum.mobile.client.Share-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 3321F8132FB1C00C0011C712 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BB0001030000000011111111 /* ShareExtension-Profile.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "Share Extension/Share Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CUSTOM_GROUP_ID = group.eu.mhsl.marianum.mobile.client.share; + DEVELOPMENT_TEAM = MY55VF3KPG; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + INFOPLIST_FILE = "Share Extension/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "eu.mhsl.marianum.mobile.client.Share-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Profile; + }; 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -460,7 +816,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -509,7 +865,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -530,6 +886,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CUSTOM_GROUP_ID = group.eu.mhsl.marianum.mobile.client.share; DEVELOPMENT_TEAM = MY55VF3KPG; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -539,7 +896,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = "${FLUTTER_BUILD_NAME)"; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; PRODUCT_BUNDLE_IDENTIFIER = eu.mhsl.marianum.mobile.client; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -560,6 +917,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CUSTOM_GROUP_ID = group.eu.mhsl.marianum.mobile.client.share; DEVELOPMENT_TEAM = MY55VF3KPG; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -569,7 +927,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = "${FLUTTER_BUILD_NAME)"; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; PRODUCT_BUNDLE_IDENTIFIER = eu.mhsl.marianum.mobile.client; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -579,9 +937,141 @@ }; name = Release; }; + AA01010A0000000011111111 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BB0001040000000011111111 /* TimetableWidget-Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = TimetableWidgetExtension/TimetableWidgetExtension.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = MY55VF3KPG; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + INFOPLIST_FILE = TimetableWidgetExtension/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = eu.mhsl.marianum.mobile.client.TimetableWidgetExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + AA01010B0000000011111111 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BB0001050000000011111111 /* TimetableWidget-Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = TimetableWidgetExtension/TimetableWidgetExtension.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = MY55VF3KPG; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + INFOPLIST_FILE = TimetableWidgetExtension/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = eu.mhsl.marianum.mobile.client.TimetableWidgetExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + AA01010C0000000011111111 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BB0001060000000011111111 /* TimetableWidget-Profile.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = TimetableWidgetExtension/TimetableWidgetExtension.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = MY55VF3KPG; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + INFOPLIST_FILE = TimetableWidgetExtension/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = eu.mhsl.marianum.mobile.client.TimetableWidgetExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Profile; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 3321F8152FB1C00C0011C712 /* Build configuration list for PBXNativeTarget "Share Extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3321F8112FB1C00C0011C712 /* Debug */, + 3321F8122FB1C00C0011C712 /* Release */, + 3321F8132FB1C00C0011C712 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -602,6 +1092,16 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + AA01010D0000000011111111 /* Build configuration list for PBXNativeTarget "TimetableWidgetExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AA01010A0000000011111111 /* Debug */, + AA01010B0000000011111111 /* Release */, + AA01010C0000000011111111 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Share extension.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Share extension.xcscheme new file mode 100644 index 0000000..1fb5c92 --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Share extension.xcscheme @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/TimetableWidgetExtension.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/TimetableWidgetExtension.xcscheme new file mode 100644 index 0000000..9bd329c --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/TimetableWidgetExtension.xcscheme @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index b636303..c30b367 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -1,13 +1,16 @@ -import UIKit import Flutter +import UIKit @main -@objc class AppDelegate: FlutterAppDelegate { +@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { - GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } + + func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) { + GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) + } } diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index ad33a62..20b323b 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -1,69 +1,90 @@ + + AppGroupId + $(CUSTOM_GROUP_ID) + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Marianum Fulda + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + client + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER) + + + + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + NSCameraUsageDescription + Um Fotos direkt aus der App aufnehmen und teilen zu können wird Zugriff auf die Kamera benötigt. + NSPhotoLibraryUsageDescription + Um Medien mit anderen zu teilen wird Zugriff zu deine Dateien benötigt. + UIApplicationSceneManifest - AppGroupId - $(CUSTOM_GROUP_ID) - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER) - - - - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Marianum Fulda - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - client - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSRequiresIPhoneOS - - NSCameraUsageDescription - Um Fotos direkt aus der App aufnehmen und teilen zu können wird Zugriff auf die Kamera benötigt. - NSPhotoLibraryUsageDescription - Um Medien mit anderen zu teilen wird Zugriff zu deine Dateien benötigt. - UIApplicationSupportsIndirectInputEvents - - UIBackgroundModes - - fetch - remote-notification - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIStatusBarHidden - - UISupportedInterfaceOrientations - - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - - UIViewControllerBasedStatusBarAppearance + UIApplicationSupportsMultipleScenes + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneClassName + UIWindowScene + UISceneConfigurationName + flutter + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + UIApplicationSupportsIndirectInputEvents + + UIBackgroundModes + + fetch + remote-notification + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + UIViewControllerBasedStatusBarAppearance + + diff --git a/ios/Runner/SceneDelegate.swift b/ios/Runner/SceneDelegate.swift new file mode 100644 index 0000000..aeefe17 --- /dev/null +++ b/ios/Runner/SceneDelegate.swift @@ -0,0 +1,33 @@ +import Flutter +import UIKit +import receive_sharing_intent + +// FlutterSceneDelegate has a fallback that forwards URL events to plugins +// registered via addApplicationDelegate, but the fallback is best-effort and +// has not always fired in our setup. This subclass forwards URLs explicitly +// to receive_sharing_intent so cold-start and warm shares both reach Dart. +class SceneDelegate: FlutterSceneDelegate { + override func scene( + _ scene: UIScene, + willConnectTo session: UISceneSession, + options connectionOptions: UIScene.ConnectionOptions + ) { + super.scene(scene, willConnectTo: session, options: connectionOptions) + for context in connectionOptions.urlContexts { + _ = SwiftReceiveSharingIntentPlugin.instance.application( + UIApplication.shared, + didFinishLaunchingWithOptions: [UIApplication.LaunchOptionsKey.url: context.url] + ) + } + } + + override func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { + for context in URLContexts { + _ = SwiftReceiveSharingIntentPlugin.instance.application( + UIApplication.shared, + open: context.url, + options: [:] + ) + } + } +} diff --git a/ios/Share Extension/MainInterface.storyboard b/ios/Share Extension/Base.lproj/MainInterface.storyboard similarity index 67% rename from ios/Share Extension/MainInterface.storyboard rename to ios/Share Extension/Base.lproj/MainInterface.storyboard index 1746985..1f0f0dd 100644 --- a/ios/Share Extension/MainInterface.storyboard +++ b/ios/Share Extension/Base.lproj/MainInterface.storyboard @@ -1,6 +1,5 @@ - - + @@ -10,15 +9,15 @@ - - - + + + - - + + - + diff --git a/ios/Share Extension/SETUP.md b/ios/Share Extension/SETUP.md deleted file mode 100644 index 6e9031e..0000000 --- a/ios/Share Extension/SETUP.md +++ /dev/null @@ -1,93 +0,0 @@ -# iOS Share Extension — Xcode Setup - -Die Quellen unter `ios/Share Extension/` müssen einmalig in Xcode als **Share Extension Target** verdrahtet werden — analog zur `TimetableWidgetExtension`. Erst danach taucht „Marianum Fulda" im System-Share-Sheet auf. - -## Schritt 1 — Share-Extension-Target anlegen - -1. `ios/Runner.xcworkspace` in Xcode öffnen. -2. Projekt-Sidebar → `Runner` (Projekt-Root) → **+ Add Target** unten links. -3. **iOS → Share Extension** wählen. -4. Eigenschaften: - - Product Name: `Share Extension` (mit Leerzeichen, exakt so — der Ordnername und Podfile-Eintrag matchen). - - Bundle Identifier: `eu.mhsl.marianum.mobile.client.Share-Extension`. - - Language: Swift. - - Embed in: Runner. -5. Beim Activate-Scheme-Dialog auf **Cancel** klicken. -6. Deployment Target = mind. iOS 12.0 (Plugin-Mindestanforderung). - -## Schritt 2 — Vorhandene Quelldateien ins Target ziehen - -Xcode legt Dummy-Dateien an. Diese **löschen** (Move to Trash). Dann: - -1. Sidebar → Rechtsklick auf den Ordner `Share Extension` → **Add Files to "Runner"…** -2. Im File-Picker zu `ios/Share Extension/` navigieren und folgende Dateien selektieren: - - `ShareViewController.swift` - - `Info.plist` - - `MainInterface.storyboard` - - `Share Extension.entitlements` -3. **Wichtig**: bei „Add to targets" nur `Share Extension` ankreuzen, **nicht** Runner. - -## Schritt 3 — App Group aktivieren - -Beide Targets brauchen die App-Group-Berechtigung, damit die Extension geteilte Dateien für die Hauptapp im gemeinsamen Container ablegen kann. - -1. **Runner**-Target → **Signing & Capabilities** → **+ Capability** → **App Groups**. - - Group-ID hinzufügen: `group.eu.mhsl.marianum.mobile.client.share` (zusätzlich zur bereits existierenden Widget-Group). -2. Dasselbe für **Share Extension**-Target — mit derselben Group-ID `group.eu.mhsl.marianum.mobile.client.share`. - -Im Apple-Developer-Portal muss diese App-Group bei beiden App-IDs eingetragen sein, sonst schlägt das Provisioning fehl. - -## Schritt 4 — User-Defined Build Setting `CUSTOM_GROUP_ID` - -Beide Targets brauchen das User-Defined Setting, das in `Runner/Info.plist` und `Share Extension/Info.plist` als `$(CUSTOM_GROUP_ID)` referenziert wird. - -1. **Runner** → Build Settings → `+` (oben links) → **Add User-Defined Setting**. - - Name: `CUSTOM_GROUP_ID` - - Wert: `group.eu.mhsl.marianum.mobile.client.share` -2. Dasselbe für **Share Extension**-Target. - -## Schritt 5 — Entitlements verlinken - -1. **Runner** → Build Settings → `CODE_SIGN_ENTITLEMENTS` zeigt bereits auf `Runner/Runner.entitlements` (jetzt mit beiden Groups). -2. **Share Extension** → Build Settings → `CODE_SIGN_ENTITLEMENTS` → auf `Share Extension/Share Extension.entitlements` setzen. - -## Schritt 6 — Info.plist-Pfad - -**Share Extension** → Build Settings → `INFOPLIST_FILE` → auf `Share Extension/Info.plist` setzen. - -## Schritt 7 — Build Phases reorder - -Damit das Plugin-Modul vom Extension-Target gefunden wird: - -1. **Runner**-Target → **Build Phases**. -2. `Embed Foundation Extensions` per Drag-and-Drop **vor** `Thin Binary` ziehen. - -## Schritt 8 — Pods installieren - -```bash -cd ios && pod install -``` - -Der Podfile-Eintrag (`target 'Share Extension' do inherit! :search_paths end`) ist bereits vorhanden. - -## Schritt 9 — Build & Run - -1. Scheme `Runner` wählen → Run auf Device oder Simulator (≥ iOS 12). -2. Foto in der Fotos-App auswählen → Teilen → „Marianum Fulda" sollte erscheinen. -3. Auswahl → App öffnet sich, ShareTargetPage erscheint. - -## Troubleshooting - -- **Error: No such module 'receive_sharing_intent'** - → Schritt 7 (Build Phases reorder) wurde übersprungen. -- **Error: ‚Frameworks' not allowed in extension** - → In Build Settings der Share Extension `Other Linker Flags` und `Framework Search Paths` leeren (nur die geerbten Pod-Pfade behalten). -- **Share-Sheet zeigt App nicht an** - → `NSExtensionActivationRule`-Limits in `Share Extension/Info.plist` zu klein? Werte testweise erhöhen. Außerdem: App muss **mindestens einmal nach Install** geöffnet worden sein, sonst wird die Extension von iOS nicht registriert. -- **Files kommen mit `nil` Pfad an** - → App-Group nicht konsistent. Prüfen, dass `CUSTOM_GROUP_ID` in beiden Targets identisch ist und die Entitlement-Files dieselbe Group enthalten. - -## Was am Mac noch zu tun ist - -- Schritte 1–8 oben (~15 Min). -- Auf physischem iPhone testen — Simulator-Share-Sheet ist eingeschränkt. diff --git a/ios/Share Extension/ShareViewController.swift b/ios/Share Extension/ShareViewController.swift index 74b3416..9c80aaf 100644 --- a/ios/Share Extension/ShareViewController.swift +++ b/ios/Share Extension/ShareViewController.swift @@ -1,8 +1,240 @@ import UIKit -import receive_sharing_intent +import UniformTypeIdentifiers +import AVFoundation -class ShareViewController: RSIShareViewController { - override func shouldAutoRedirect() -> Bool { - return true - } +// Datenmodell muss byte-für-byte zu dem passen, was +// SwiftReceiveSharingIntentPlugin auf der Host-App-Seite decodiert. +private enum SharedMediaType: String, Codable { + case image, video, text, file, url +} + +private struct SharedMediaFile: Codable { + let path: String + let mimeType: String? + let thumbnail: String? + let duration: Double? + let message: String? + let type: SharedMediaType +} + +final class ShareViewController: UIViewController { + // Schlüssel sind die, die das Plugin liest. + private let userDefaultsKey = "ShareKey" + private let userDefaultsMessageKey = "ShareMessageKey" + private let urlSchemePrefix = "ShareMedia" + + private var appGroupId = "" + private var hostBundleId = "" + + override func viewDidLoad() { + super.viewDidLoad() + resolveIds() + setupPlaceholderUI() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + processAttachments() + } + + private func resolveIds() { + let extBundleId = Bundle.main.bundleIdentifier ?? "" + if let lastDot = extBundleId.lastIndex(of: ".") { + hostBundleId = String(extBundleId[.. Void) { + let order: [(String, SharedMediaType)] = [ + (UTType.image.identifier, .image), + (UTType.movie.identifier, .video), + (UTType.text.identifier, .text), + (UTType.fileURL.identifier, .file), + (UTType.url.identifier, .url), + (UTType.data.identifier, .file), + ] + for (typeId, kind) in order { + if provider.hasItemConformingToTypeIdentifier(typeId) { + provider.loadItem(forTypeIdentifier: typeId) { [weak self] data, error in + guard let self else { completion(nil); return } + if error != nil { completion(nil); return } + completion(self.toSharedFile(data: data, kind: kind)) + } + return + } + } + completion(nil) + } + + private func toSharedFile(data: Any?, kind: SharedMediaType) -> SharedMediaFile? { + switch kind { + case .text: + guard let s = data as? String else { return nil } + return SharedMediaFile(path: s, mimeType: "text/plain", + thumbnail: nil, duration: nil, message: nil, type: .text) + case .url: + guard let u = data as? URL else { return nil } + return SharedMediaFile(path: u.absoluteString, mimeType: nil, + thumbnail: nil, duration: nil, message: nil, type: .url) + case .image: + if let u = data as? URL, let dst = copyIntoAppGroup(src: u) { + return SharedMediaFile(path: pathString(for: dst), mimeType: mime(for: u), + thumbnail: nil, duration: nil, message: nil, type: .image) + } + if let img = data as? UIImage, let dst = writePng(image: img) { + return SharedMediaFile(path: pathString(for: dst), mimeType: "image/png", + thumbnail: nil, duration: nil, message: nil, type: .image) + } + return nil + case .video: + guard let u = data as? URL, let dst = copyIntoAppGroup(src: u) else { return nil } + return SharedMediaFile(path: pathString(for: dst), mimeType: mime(for: u), + thumbnail: nil, duration: videoDurationMs(url: u), + message: nil, type: .video) + case .file: + guard let u = data as? URL, let dst = copyIntoAppGroup(src: u) else { return nil } + return SharedMediaFile(path: pathString(for: dst), mimeType: mime(for: u), + thumbnail: nil, duration: nil, message: nil, type: .file) + } + } + + private func copyIntoAppGroup(src: URL) -> URL? { + guard let container = FileManager.default + .containerURL(forSecurityApplicationGroupIdentifier: appGroupId) else { + return nil + } + let name = src.lastPathComponent.isEmpty ? UUID().uuidString : src.lastPathComponent + let dst = container.appendingPathComponent(name) + do { + if FileManager.default.fileExists(atPath: dst.path) { + try FileManager.default.removeItem(at: dst) + } + try FileManager.default.copyItem(at: src, to: dst) + return dst + } catch { + return nil + } + } + + private func writePng(image: UIImage) -> URL? { + guard let container = FileManager.default + .containerURL(forSecurityApplicationGroupIdentifier: appGroupId), + let data = image.pngData() else { return nil } + let dst = container.appendingPathComponent("\(UUID().uuidString).png") + return (try? data.write(to: dst)) != nil ? dst : nil + } + + // Das Plugin macht `path.replacingOccurrences(of: "file://", with: "")`, + // also liefern wir absoluteString mit Prozent-Decoding — selbes Format wie + // im Original-RSIShareViewController. + private func pathString(for url: URL) -> String { + url.absoluteString.removingPercentEncoding ?? url.absoluteString + } + + private func mime(for url: URL) -> String? { + UTType(filenameExtension: url.pathExtension)?.preferredMIMEType + } + + private func videoDurationMs(url: URL) -> Double { + (CMTimeGetSeconds(AVURLAsset(url: url).duration) * 1000).rounded() + } + + private func saveAndRedirect(items: [SharedMediaFile]) { + guard !items.isEmpty else { + finish() + return + } + let defaults = UserDefaults(suiteName: appGroupId) + guard let encoded = try? JSONEncoder().encode(items) else { + finish() + return + } + defaults?.set(encoded, forKey: userDefaultsKey) + defaults?.removeObject(forKey: userDefaultsMessageKey) + + let urlStr = "\(urlSchemePrefix)-\(hostBundleId):share" + guard let url = URL(string: urlStr) else { + finish() + return + } + + // Apple-DTS says Share Extensions are not officially allowed to open + // URLs. Both `extensionContext.open` and the responder-chain trick + // succeed in some iOS versions and fail silently in others, so we fire + // both in parallel and let whichever Apple is honouring this release + // win the race. + extensionContext?.open(url, completionHandler: nil) + var responder: UIResponder? = self + while responder != nil { + if let app = responder as? UIApplication { + app.open(url, options: [:], completionHandler: nil) + break + } + responder = responder?.next + } + + // Brief window so the open request reaches the system before we tear + // the extension down. + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in + self?.finish() + } + } + + private func finish() { + extensionContext?.completeRequest(returningItems: [], completionHandler: nil) + } } diff --git a/ios/TimetableWidgetExtension/SETUP.md b/ios/TimetableWidgetExtension/SETUP.md deleted file mode 100644 index bcb46c4..0000000 --- a/ios/TimetableWidgetExtension/SETUP.md +++ /dev/null @@ -1,72 +0,0 @@ -# iOS Widget Extension — Xcode Setup - -Die Swift-Quellen unter `ios/TimetableWidgetExtension/` müssen einmalig in Xcode als **Widget Extension Target** verdrahtet werden — ohne diesen Schritt bleibt der Code unkompiliert. - -## Schritt 1 — Widget-Extension-Target anlegen - -1. `ios/Runner.xcworkspace` in Xcode öffnen. -2. Projekt-Sidebar → `Runner` (Projekt-Root) → **+ Add Target** unten links. -3. **iOS → Widget Extension** wählen. -4. Eigenschaften: - - Product Name: `TimetableWidgetExtension` - - Bundle Identifier: `eu.mhsl.marianum.mobile.client.TimetableWidgetExtension` - - Language: Swift - - Include Configuration Intent: **OFF** (StaticConfiguration reicht) - - Embed in: Runner -5. Beim Activate-Scheme-Dialog auf **Cancel** klicken. - -## Schritt 2 — Vorhandene Quelldateien ins Target ziehen - -Xcode hat zunächst Dummy-Dateien (`TimetableWidgetExtension.swift`, `TimetableWidgetExtensionBundle.swift`) angelegt. Diese **löschen** (Move to Trash). Dann: - -1. Sidebar → Rechtsklick auf den Ordner `TimetableWidgetExtension` → **Add Files to "Runner"…** -2. Im File-Picker zu `ios/TimetableWidgetExtension/` navigieren und alle `.swift`-Dateien, die `Info.plist`, `TimetableWidgetExtension.entitlements` **und den `Assets.xcassets`-Ordner** selektieren (mit `marianum_m`-Asset darin — gleicher Asset-Name wie auf Android-Seite). -3. **Wichtig**: bei „Add to targets" nur `TimetableWidgetExtension` ankreuzen, **nicht** Runner. - -## Schritt 3 — App Group aktivieren - -Beide Targets brauchen die App-Group-Berechtigung, damit Hauptapp und Widget über `UserDefaults(suiteName:)` schreiben/lesen können. - -1. **Runner**-Target → **Signing & Capabilities** → **+ Capability** → **App Groups**. - - Group-ID hinzufügen: `group.eu.mhsl.marianum.mobile.client.widget` -2. Dasselbe für **TimetableWidgetExtension** — mit derselben Group-ID. - -Im Apple-Developer-Portal muss die App-Group bei beiden App-IDs eingetragen sein, sonst schlägt das Provisioning fehl. - -## Schritt 4 — Entitlements verlinken - -1. **Runner** → Build Settings → `CODE_SIGN_ENTITLEMENTS` sollte bereits auf `Runner/Runner.entitlements` zeigen. -2. **TimetableWidgetExtension** → Build Settings → `CODE_SIGN_ENTITLEMENTS` → auf `TimetableWidgetExtension/TimetableWidgetExtension.entitlements` setzen. - -## Schritt 5 — Info.plist + Deployment Target - -1. **TimetableWidgetExtension** → Build Settings → `INFOPLIST_FILE` → auf `TimetableWidgetExtension/Info.plist` setzen. -2. Build Settings → `IPHONEOS_DEPLOYMENT_TARGET` ≥ 16.0 (Code gated `.containerBackground` mit `if #available(iOS 17, *)`, läuft also auch auf 16). - -## Schritt 6 — Build & Run - -- Scheme `Runner` (nicht das Widget-Scheme) wählen → Run. -- Auf Home-Screen langes Drücken → Widget hinzufügen → "Marianum · Heute" / "Marianum · Woche". -- Widget-Tap öffnet die App im zuletzt sichtbaren Tab. Eine Tab-Navigation auf den Stundenplan ist bewusst nicht implementiert (Android nutzt Intent-Extras, iOS würde dafür ein URL-Scheme oder AppIntent brauchen — beides bewusst ausgespart). - -## Troubleshooting - -- **Widget zeigt „Lade…"** auch nach Refresh: App-Group greift nicht. Prüfen, ob beide Targets dieselbe Group-ID haben und das Provisioning aktualisiert wurde. -- **Stale-Daten nach Logout**: `WidgetSync.clear()` schreibt `widget_data_logged_in_v1 = false`; Widget zeigt dann den Login-Placeholder. -- **Lessons um 1–2 Stunden verschoben**: Date-Parser-Bug. Sollte gefixt sein in `WidgetData.swift::parseDartDate` — verifizieren, dass die ISO-8601-Strings ohne Z-Suffix als `TimeZone.current` geparsed werden. -- **App-Store-Submit später**: `Runner.entitlements` `aps-environment` von `development` auf `production` umbiegen. - -## Was bereits im Repo erledigt ist - -- Alle Swift-Quellen, Info.plist, Entitlements liegen unter `ios/TimetableWidgetExtension/`. -- App-Group-ID konsistent zwischen Dart (`WidgetSync.iosAppGroupId`), Swift (`WidgetDataKey.appGroupId`) und der Entitlements-Datei. -- `home_widget`-Plugin auf der Dart-Seite konfiguriert; ruft `HomeWidget.setAppGroupId` beim ersten Sync. -- `containerBackground` für iOS 17+ gegated, fällt auf iOS 16 sauber zurück. -- Date-Parser fixt das fehlende Z-Suffix (Dart schreibt lokale Zeit ohne TZ-Marker). - -## Was am Mac noch zu tun ist - -- Schritte 1–5 oben in Xcode durchklicken (10–15 Min). -- `flutter pub get` + `cd ios && pod install`. -- Auf physischem Gerät oder iOS-Simulator (≥ 16.0) bauen. -- Widget aufs Home-Screen ziehen, prüfen dass Lesson-Zeiten korrekt rendern.