Section 5/151 menit

5. Perbandingan Feature-by-Feature

5. Perbandingan Feature-by-Feature

Dukungan Binary Distribution

swift
# CocoaPods: binary via vendored_frameworks di podspec
spec.vendored_frameworks = 'Frameworks/MySDK.xcframework'
spec.vendored_libraries  = 'Libraries/libMyLib.a'

# SPM: binary target dengan .xcframework
.binaryTarget(
    name: "MySDK",
    url: "https://cdn.example.com/MySDK-1.0.0.xcframework.zip",
    checksum: "sha256_checksum_here"
)

# Atau local binary
.binaryTarget(
    name: "MySDK",
    path: "Frameworks/MySDK.xcframework"
)

Resource Bundling

swift
# CocoaPods: resource_bundles di podspec
spec.resource_bundles = {
    'MyLibraryAssets' => ['Sources/Assets/**/*.{xcassets,json,lottie}']
}

# Akses di Swift:
let bundle = Bundle(for: MyClass.self)
// atau
let bundle = Bundle(identifier: "org.cocoapods.MyLibraryAssets")
let image = UIImage(named: "icon", in: bundle, compatibleWith: nil)
swift
// SPM: resources di Package.swift
.target(
    name: "MyLibrary",
    resources: [.process("Resources")]
)

// Akses di Swift (type-safe dengan Bundle.module):
let bundle = Bundle.module
let image = UIImage(named: "icon", in: bundle, compatibleWith: nil)

Script/Plugin Hooks

swift
# CocoaPods: post_install hook di Podfile
post_install do |installer|
    installer.pods_project.targets.each do |target|
        # Modify build settings
        target.build_configurations.each do |config|
            config.build_settings['SWIFT_VERSION'] = '5.0'
        end
    end
end
swift
// SPM: Build Tool Plugin
// Sources/MyPlugin/MyBuildToolPlugin.swift
import PackagePlugin

@main
struct MyBuildToolPlugin: BuildToolPlugin {
    func createBuildCommands(context: PluginContext, target: Target) async throws -> [Command] {
        let inputFiles = target.directory.appending(subpath: "Resources")
        let outputFile = context.pluginWorkDirectory.appending(subpath: "GeneratedResources.swift")
        
        return [
            .buildCommand(
                displayName: "Generate Resource Enums",
                executable: try context.tool(named: "ResourceGen").path,
                arguments: [inputFiles.string, outputFile.string],
                inputFiles: [inputFiles],
                outputFiles: [outputFile]
            )
        ]
    }
}