Hi Guys,
i tried with the final Xcode 11 Version to generate a .xcframework from my framework but it will not work. I successfully generated the .xcframework like apple showed us on WWDC. But when i import the framework in a sample projekt, it throws the error: "Failed to load module ..." if i try to import it. And there are lot of errors from "arm64-apple-ios.swiftinterface". It's the same error for all public protocols, enums, structs
-> "... is not a member type of..."
This is the interface file where the errors appear and for every FastSocket.Struct, FastSocket.Protocol.. -> for example: "MessageProtocol is not a member type of FastSocket". I dont have any idea why this happen 😟. The Things are all public and the module works like expected. but not as xcframework 😟
// swift-interface-format-version: 1.0
// swift-compiler-version: Apple Swift version 5.1 (swiftlang-1100.0.270.13 clang-1100.0.33.7)
// swift-module-flags: -target arm64-apple-ios13.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name FastSocket
import CryptoKit
import Foundation
import Network
import Swift
extension Data : FastSocket.MessageProtocol {
}
public protocol FastSocketProtocol : AnyObject {
var on: FastSocket.FastSocketCallback { get set }
var parameters: FastSocket.TransferParameters { get set }
init(host: Swift.String, port: Swift.UInt16, type: FastSocket.TransferType)
func connect()
func disconnect()
func send<T>(message: T) where T : FastSocket.MessageProtocol
}
public struct FastSocketCallback {
public var ready: () -> Swift.Void
public var close: () -> Swift.Void
public var message: (FastSocket.MessageProtocol) -> Swift.Void
public var bytes: (FastSocket.ByteCountResult) -> Swift.Void
public var error: (Swift.Error?) -> Swift.Void
}
public protocol MessageTypeProtocol {
}
public protocol MessageProtocol {
}
public enum ByteCountResult {
case input(Swift.Int)
case output(Swift.Int)
}
extension String : FastSocket.MessageProtocol {
}
public enum TransferType {
case tcp
case tls
public static func == (a: FastSocket.TransferType, b: FastSocket.TransferType) -> Swift.Bool
public var hashValue: Swift.Int {
get
}
public func hash(into hasher: inout Swift.Hasher)
}
public class FastSocket : FastSocket.FastSocketProtocol {
public var on: FastSocket.FastSocketCallback
public var parameters: FastSocket.TransferParameters
required public init(host: Swift.String, port: Swift.UInt16, type: FastSocket.TransferType = .tcp)
public func connect()
public func disconnect()
public func send<T>(message: T) where T : FastSocket.MessageProtocol
@objc deinit
}
public struct TransferParameters {
public var acceptLocalOnly: Swift.Bool
public var allowFastOpen: Swift.Bool
public var preferNoProxies: Swift.Bool
public var prohibitedInterfaceTypes: [Network.NWInterface.InterfaceType]
public var prohibitExpensivePaths: Swift.Bool
public var requiredInterfaceType: Network.NWInterface.InterfaceType
public var serviceClass: Network.NWParameters.ServiceClass
public var multipathServiceType: Network.NWParameters.MultipathServiceType
}
public enum FastSocketError : Swift.Int, Swift.Error {
case none
case emptyHost
case handshakeInitializationFailed
case handshakeVerificationFailed
case timeoutError
case networkUnreachable
case sendFailed
case sendToEarly
case socketClosed
case socketUnexpectedClosed
case writeBeforeClear
case parsingFailure
case zeroData
case readBufferIssue
case readBufferOverflow
case writeBufferOverflow
case unknownOpcode
public typealias RawValue = Swift.Int
public init?(rawValue: Swift.Int)
public var rawValue: Swift.Int {
get
}
}
extension FastSocketError {
public static var errorDomain: Swift.String {
get
}
public var errorCode: Swift.Int {
get
}
public var errorUserInfo: [Swift.String : Swift.String] {
get
}
}
extension FastSocket.TransferType : Swift.Equatable {}
extension FastSocket.TransferType : Swift.Hashable {}
extension FastSocket.FastSocketError : Swift.Equatable {}
extension FastSocket.FastSocketError : Swift.Hashable {}
extension FastSocket.FastSocketError : Swift.RawRepresentable {}
i generated it with the following commands and i also set the Build Library for Distribution to Yes
xcodebuild archive -scheme FastSocket -destination generic/platform=iOS -archivePath ./FastSocket.xcarchive SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
xcodebuild -create-xcframework -framework FastSocket.xcarchive/Products/Library/Frameworks/FastSocket.framework -output FastSocket.xcframework
I ran into the same issue.
The problem is that in the Swiftinterface file, you have a class named FastSocket, but the module is also called FastSocket. The generated file includes many module references that Swift thinks are class references because it uses the class ahead of the module...
There is a workaround, edit all of the .swiftinterface files to remove the module references (FastSocket.). There are many .swiftinterface files (one per architecture supported) so an easy way to do them all at once is to run this in the root of the .xcframework directory:
find . -name "*.swiftinterface" -exec sed -i -e 's/FastSocket\.//g' {} \;
You may want to check that has only removed module references, in the case where you have some subelements of the FastSocket class that might need more refining to get right.
After running that do a clean build of a project using that framework and try again, the erorrs should be gone.
Apple is working on a fix for this so before too long hopefully this step of XCFramework generation will not be required.