diff --git a/packages/pdfx/CHANGELOG.md b/packages/pdfx/CHANGELOG.md index eb2f24e5..262e11f7 100644 --- a/packages/pdfx/CHANGELOG.md +++ b/packages/pdfx/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Added Swift Package Manager support for iOS and macOS, consolidating the duplicated Apple implementation into shared Darwin sources while retaining CocoaPods compatibility [pull#623](https://github.com/ScerIO/packages.flutter/pull/623) + ## 2.10.0 * Supported AGP 9 built-in Kotlin [pull#624](https://github.com/ScerIO/packages.flutter/pull/624) diff --git a/packages/pdfx/ios/pdfx.podspec b/packages/pdfx/darwin/pdfx.podspec similarity index 58% rename from packages/pdfx/ios/pdfx.podspec rename to packages/pdfx/darwin/pdfx.podspec index f231f867..5c6298b9 100644 --- a/packages/pdfx/ios/pdfx.podspec +++ b/packages/pdfx/darwin/pdfx.podspec @@ -1,24 +1,30 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. -# Run `pod lib lint pdfx.podspec` to validate before publishing. -# -Pod::Spec.new do |s| - s.name = 'pdfx' - s.version = '1.0.0' - s.summary = 'Flutter Plugin to render a PDF file.' - s.description = <<-DESC -Flutter Plugin to render a PDF file. -Downloaded by pub (not CocoaPods). - DESC - s.homepage = 'https://github.com/ScerIO/packages.flutter/tree/main/packages/pdfx' - s.license = { :type => 'MIT', :file => '../LICENSE' } - s.author = { 'Serge Shkurko' => 'sergeshkurko@outlook.com' } - s.source = { :http => 'https://github.com/ScerIO/packages.flutter/tree/main/packages/pdfx' } - s.source_files = 'Classes/**/*' - s.dependency 'Flutter' - s.platform = :ios, '8.0' - - # Flutter.framework does not contain a i386 slice. - s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } - s.swift_version = '5.0' -end +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. +# Run `pod lib lint pdfx.podspec` to validate before publishing. +# +Pod::Spec.new do |s| + s.name = 'pdfx' + s.version = '1.0.0' + s.summary = 'Flutter Plugin to render a PDF file.' + s.description = <<-DESC +Flutter Plugin to render a PDF file. +Downloaded by pub (not CocoaPods). + DESC + s.homepage = 'https://github.com/ScerIO/packages.flutter/tree/main/packages/pdfx' + s.license = { :type => 'MIT', :file => '../LICENSE' } + s.author = { 'Serge Shkurko' => 'sergeshkurko@outlook.com' } + s.source = { :path => '.' } + s.source_files = 'pdfx/Sources/**/*.{h,m,swift}' + s.public_header_files = 'pdfx/Sources/**/include/**/*.h' + + s.ios.deployment_target = '13.0' + s.osx.deployment_target = '10.15' + + s.ios.dependency 'Flutter' + s.osx.dependency 'FlutterMacOS' + + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } + # Flutter.framework does not contain an i386 slice. + s.ios.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } + s.swift_version = '5.0' +end diff --git a/packages/pdfx/darwin/pdfx/Package.swift b/packages/pdfx/darwin/pdfx/Package.swift new file mode 100644 index 00000000..5eadbc37 --- /dev/null +++ b/packages/pdfx/darwin/pdfx/Package.swift @@ -0,0 +1,46 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let flutterFramework: Target.Dependency = .product( + name: "FlutterFramework", + package: "FlutterFramework" +) + +let package = Package( + name: "pdfx", + platforms: [ + .iOS("13.0"), + .macOS("10.15") + ], + products: [ + .library(name: "pdfx", targets: ["pdfx"]) + ], + dependencies: [ + .package(name: "FlutterFramework", path: "../FlutterFramework") + ], + targets: [ + // Swift Package Manager does not support mixing Objective-C and Swift + // sources in one target, so the generated Pigeon bridge is separate + // from the Swift plugin implementation. + .target( + name: "pdfx_messages", + dependencies: [flutterFramework], + path: "Sources/pdfx/messages", + publicHeadersPath: "include", + cSettings: [ + .headerSearchPath("include/pdfx_messages") + ] + ), + .target( + name: "pdfx", + dependencies: [ + flutterFramework, + "pdfx_messages" + ], + path: "Sources/pdfx", + exclude: ["messages"] + ) + ] +) diff --git a/packages/pdfx/ios/Classes/Document.swift b/packages/pdfx/darwin/pdfx/Sources/pdfx/Document.swift similarity index 95% rename from packages/pdfx/ios/Classes/Document.swift rename to packages/pdfx/darwin/pdfx/Sources/pdfx/Document.swift index fe95c436..9defc883 100644 --- a/packages/pdfx/ios/Classes/Document.swift +++ b/packages/pdfx/darwin/pdfx/Sources/pdfx/Document.swift @@ -1,3 +1,11 @@ +import CoreGraphics +import Foundation +#if os(iOS) +import UIKit +#elseif os(macOS) +import AppKit +#endif + class Document { let id: String let renderer: CGPDFDocument diff --git a/packages/pdfx/ios/Classes/Hooks.swift b/packages/pdfx/darwin/pdfx/Sources/pdfx/Hooks.swift similarity index 94% rename from packages/pdfx/ios/Classes/Hooks.swift rename to packages/pdfx/darwin/pdfx/Sources/pdfx/Hooks.swift index b02cfee2..58bd8af0 100644 --- a/packages/pdfx/ios/Classes/Hooks.swift +++ b/packages/pdfx/darwin/pdfx/Sources/pdfx/Hooks.swift @@ -1,4 +1,7 @@ +import CoreGraphics +import Foundation #if os(iOS) +import UIKit extension UIColor { convenience init(hexString: String) { @@ -21,6 +24,7 @@ extension UIColor { } #elseif os(macOS) +import AppKit extension NSColor { convenience init(hexString: String) { diff --git a/packages/pdfx/darwin/pdfx/Sources/pdfx/PdfxPlugin.swift b/packages/pdfx/darwin/pdfx/Sources/pdfx/PdfxPlugin.swift new file mode 100644 index 00000000..52efba0e --- /dev/null +++ b/packages/pdfx/darwin/pdfx/Sources/pdfx/PdfxPlugin.swift @@ -0,0 +1,13 @@ +#if os(iOS) +import Flutter +#elseif os(macOS) +import FlutterMacOS +#endif +import Foundation + +/// Stable plugin entry point used by Flutter's generated registrants. +public final class PdfxPlugin: NSObject, FlutterPlugin { + public static func register(with registrar: FlutterPluginRegistrar) { + SwiftPdfxPlugin.register(with: registrar) + } +} diff --git a/packages/pdfx/ios/Classes/Resources.swift b/packages/pdfx/darwin/pdfx/Sources/pdfx/Resources.swift similarity index 92% rename from packages/pdfx/ios/Classes/Resources.swift rename to packages/pdfx/darwin/pdfx/Sources/pdfx/Resources.swift index fb5e2777..d7e5c04d 100644 --- a/packages/pdfx/ios/Classes/Resources.swift +++ b/packages/pdfx/darwin/pdfx/Sources/pdfx/Resources.swift @@ -1,3 +1,6 @@ +import CoreGraphics +import Foundation + enum RepositoryError: Error { case ItemNotFound } diff --git a/packages/pdfx/ios/Classes/SwiftPdfxPlugin.swift b/packages/pdfx/darwin/pdfx/Sources/pdfx/SwiftPdfxPlugin.swift similarity index 97% rename from packages/pdfx/ios/Classes/SwiftPdfxPlugin.swift rename to packages/pdfx/darwin/pdfx/Sources/pdfx/SwiftPdfxPlugin.swift index d33be748..dac03b8d 100644 --- a/packages/pdfx/ios/Classes/SwiftPdfxPlugin.swift +++ b/packages/pdfx/darwin/pdfx/Sources/pdfx/SwiftPdfxPlugin.swift @@ -6,6 +6,9 @@ import Cocoa import FlutterMacOS #endif import CoreGraphics +#if SWIFT_PACKAGE +import pdfx_messages +#endif public class SwiftPdfxPlugin: NSObject, FlutterPlugin, PdfxApi { let registrar: FlutterPluginRegistrar diff --git a/packages/pdfx/ios/Classes/messages.h b/packages/pdfx/darwin/pdfx/Sources/pdfx/messages/include/pdfx_messages/messages.h similarity index 100% rename from packages/pdfx/ios/Classes/messages.h rename to packages/pdfx/darwin/pdfx/Sources/pdfx/messages/include/pdfx_messages/messages.h diff --git a/packages/pdfx/ios/Classes/pdfx.h b/packages/pdfx/darwin/pdfx/Sources/pdfx/messages/include/pdfx_messages/pdfx.h similarity index 95% rename from packages/pdfx/ios/Classes/pdfx.h rename to packages/pdfx/darwin/pdfx/Sources/pdfx/messages/include/pdfx_messages/pdfx.h index af7fbbc4..bba7e114 100644 --- a/packages/pdfx/ios/Classes/pdfx.h +++ b/packages/pdfx/darwin/pdfx/Sources/pdfx/messages/include/pdfx_messages/pdfx.h @@ -1 +1 @@ -#import "messages.h" +#import "messages.h" diff --git a/packages/pdfx/ios/Classes/messages.m b/packages/pdfx/darwin/pdfx/Sources/pdfx/messages/messages.m similarity index 100% rename from packages/pdfx/ios/Classes/messages.m rename to packages/pdfx/darwin/pdfx/Sources/pdfx/messages/messages.m diff --git a/packages/pdfx/ios/Classes/PdfxPlugin.h b/packages/pdfx/ios/Classes/PdfxPlugin.h deleted file mode 100644 index 1d0deadc..00000000 --- a/packages/pdfx/ios/Classes/PdfxPlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -#if TARGET_OS_IOS -#import -#else -#import -#endif - -@interface PdfxPlugin : NSObject -@end diff --git a/packages/pdfx/ios/Classes/PdfxPlugin.m b/packages/pdfx/ios/Classes/PdfxPlugin.m deleted file mode 100644 index 98ee7e9c..00000000 --- a/packages/pdfx/ios/Classes/PdfxPlugin.m +++ /dev/null @@ -1,15 +0,0 @@ -#import "PdfxPlugin.h" -#if __has_include() -#import -#else -// Support project import fallback if the generated compatibility header -// is not copied when this plugin is created as a library. -// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 -#import "pdfx-Swift.h" -#endif - -@implementation PdfxPlugin -+ (void)registerWithRegistrar:(NSObject*)registrar { - [SwiftPdfxPlugin registerWithRegistrar:registrar]; -} -@end diff --git a/packages/pdfx/macos/Classes/Document.swift b/packages/pdfx/macos/Classes/Document.swift deleted file mode 120000 index 9e9b939b..00000000 --- a/packages/pdfx/macos/Classes/Document.swift +++ /dev/null @@ -1 +0,0 @@ -../../ios/Classes/Document.swift \ No newline at end of file diff --git a/packages/pdfx/macos/Classes/Hooks.swift b/packages/pdfx/macos/Classes/Hooks.swift deleted file mode 120000 index 315c0856..00000000 --- a/packages/pdfx/macos/Classes/Hooks.swift +++ /dev/null @@ -1 +0,0 @@ -../../ios/Classes/Hooks.swift \ No newline at end of file diff --git a/packages/pdfx/macos/Classes/PdfxPlugin.h b/packages/pdfx/macos/Classes/PdfxPlugin.h deleted file mode 120000 index 4d5255b0..00000000 --- a/packages/pdfx/macos/Classes/PdfxPlugin.h +++ /dev/null @@ -1 +0,0 @@ -../../ios/Classes/PdfxPlugin.h \ No newline at end of file diff --git a/packages/pdfx/macos/Classes/PdfxPlugin.m b/packages/pdfx/macos/Classes/PdfxPlugin.m deleted file mode 120000 index 738f54fc..00000000 --- a/packages/pdfx/macos/Classes/PdfxPlugin.m +++ /dev/null @@ -1 +0,0 @@ -../../ios/Classes/PdfxPlugin.m \ No newline at end of file diff --git a/packages/pdfx/macos/Classes/Resources.swift b/packages/pdfx/macos/Classes/Resources.swift deleted file mode 120000 index 16812759..00000000 --- a/packages/pdfx/macos/Classes/Resources.swift +++ /dev/null @@ -1 +0,0 @@ -../../ios/Classes/Resources.swift \ No newline at end of file diff --git a/packages/pdfx/macos/Classes/SwiftPdfxPlugin.swift b/packages/pdfx/macos/Classes/SwiftPdfxPlugin.swift deleted file mode 120000 index 6995ff95..00000000 --- a/packages/pdfx/macos/Classes/SwiftPdfxPlugin.swift +++ /dev/null @@ -1 +0,0 @@ -../../ios/Classes/SwiftPdfxPlugin.swift \ No newline at end of file diff --git a/packages/pdfx/macos/Classes/messages.h b/packages/pdfx/macos/Classes/messages.h deleted file mode 120000 index 6b3b4c1d..00000000 --- a/packages/pdfx/macos/Classes/messages.h +++ /dev/null @@ -1 +0,0 @@ -../../ios/Classes/messages.h \ No newline at end of file diff --git a/packages/pdfx/macos/Classes/messages.m b/packages/pdfx/macos/Classes/messages.m deleted file mode 120000 index 9aa0efc5..00000000 --- a/packages/pdfx/macos/Classes/messages.m +++ /dev/null @@ -1 +0,0 @@ -../../ios/Classes/messages.m \ No newline at end of file diff --git a/packages/pdfx/macos/Classes/pdfx.h b/packages/pdfx/macos/Classes/pdfx.h deleted file mode 120000 index 339b36ac..00000000 --- a/packages/pdfx/macos/Classes/pdfx.h +++ /dev/null @@ -1 +0,0 @@ -../../ios/Classes/pdfx.h \ No newline at end of file diff --git a/packages/pdfx/macos/pdfx.podspec b/packages/pdfx/macos/pdfx.podspec deleted file mode 100644 index 8dd34cb6..00000000 --- a/packages/pdfx/macos/pdfx.podspec +++ /dev/null @@ -1,23 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. -# Run `pod lib lint pdfx.podspec` to validate before publishing. -# -Pod::Spec.new do |s| - s.name = 'pdfx' - s.version = '1.0.0' - s.summary = 'Flutter Plugin to render a PDF file.' - s.description = <<-DESC - Flutter Plugin to render a PDF file. - Downloaded by pub (not CocoaPods). - DESC - s.homepage = 'https://github.com/ScerIO/packages.flutter/tree/main/packages/pdfx' - s.license = { :type => 'MIT', :file => '../LICENSE' } - s.author = { 'Serge Shkurko' => 'sergeshkurko@outlook.com' } - s.source = { :http => 'https://github.com/ScerIO/packages.flutter/tree/main/packages/pdfx' } - s.source_files = 'Classes/**/*' - s.dependency 'FlutterMacOS' - - s.platform = :osx, '10.11' - s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } - s.swift_version = '5.0' -end diff --git a/packages/pdfx/pigeons/messages.dart b/packages/pdfx/pigeons/messages.dart index 0b3373f9..a837bdae 100644 --- a/packages/pdfx/pigeons/messages.dart +++ b/packages/pdfx/pigeons/messages.dart @@ -2,8 +2,9 @@ import 'package:pigeon/pigeon.dart'; @ConfigurePigeon(PigeonOptions( dartOut: 'lib/src/renderer/io/pigeon.dart', - objcHeaderOut: './ios/Classes/messages.h', - objcSourceOut: './ios/Classes/messages.m', + objcHeaderOut: + './darwin/pdfx/Sources/pdfx/messages/include/pdfx_messages/messages.h', + objcSourceOut: './darwin/pdfx/Sources/pdfx/messages/messages.m', javaOut: './android/src/main/java/dev/flutter/pigeon/Pigeon.java', javaOptions: JavaOptions( package: 'dev.flutter.pigeon', diff --git a/packages/pdfx/pubspec.yaml b/packages/pdfx/pubspec.yaml index ee7c8048..5d0181ab 100644 --- a/packages/pdfx/pubspec.yaml +++ b/packages/pdfx/pubspec.yaml @@ -37,8 +37,10 @@ flutter: pluginClass: PdfxPlugin ios: pluginClass: PdfxPlugin + sharedDarwinSource: true macos: pluginClass: PdfxPlugin + sharedDarwinSource: true windows: pluginClass: PdfxPlugin web: diff --git a/packages/pdfx/scripts/link_macos.sh b/packages/pdfx/scripts/link_macos.sh deleted file mode 100644 index 066812e9..00000000 --- a/packages/pdfx/scripts/link_macos.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -cd ./ios/Classes -rm -f ../../macos/Classes/* -for d in * -do - cd ../../macos/Classes/ - ln -s "../../ios/Classes/$d" "$d" - (echo "Linking $d to ../../ios/Classes/$d") -done - diff --git a/packages/pdfx/scripts/pigeon.sh b/packages/pdfx/scripts/pigeon.sh index e433ca23..1620ff46 100644 --- a/packages/pdfx/scripts/pigeon.sh +++ b/packages/pdfx/scripts/pigeon.sh @@ -11,12 +11,7 @@ echo "$Green Success$Color_Off" echo "$BBlue Replace import in generated iOS pigeon file for support macOS$Color_Off" to="#if TARGET_OS_IOS\n#import \n#else\n#import \n#endif" from="#import " -sed -i "" "s/$from/$to/g" "ios/Classes/messages.m" -echo "$Green Success$Color_Off" - - -echo "$BBlue Link macOS to iOS (universal) codebase$Color_Off" -sh ./scripts/link_macos.sh +sed -i "" "s/$from/$to/g" "darwin/pdfx/Sources/pdfx/messages/messages.m" echo "$Green Success$Color_Off"