{"id":18859390,"url":"https://github.com/tuarua/swift-ios-ane","last_synced_at":"2026-01-31T21:01:09.657Z","repository":{"id":17857041,"uuid":"82467117","full_name":"tuarua/Swift-IOS-ANE","owner":"tuarua","description":"FlashRuntimeExtensions.swift. Example Air Native Extension written in Swift 5 for iOS, macOS and tvOS","archived":false,"fork":false,"pushed_at":"2025-09-13T17:52:56.000Z","size":37085,"stargazers_count":63,"open_issues_count":0,"forks_count":14,"subscribers_count":20,"default_branch":"master","last_synced_at":"2025-09-13T19:36:42.999Z","etag":null,"topics":["actionscript","adobe-air","air-native-extensions","ane","ios","native-extension","osx","swift5","tvos"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tuarua.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"tuarua","custom":["paypal.me/tuarualtd"]}},"created_at":"2017-02-19T15:03:17.000Z","updated_at":"2025-09-13T17:51:03.000Z","dependencies_parsed_at":"2025-04-10T02:41:36.505Z","dependency_job_id":"17abdcb0-40bd-4dcf-8f60-45f51af9ee7c","html_url":"https://github.com/tuarua/Swift-IOS-ANE","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/tuarua/Swift-IOS-ANE","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuarua%2FSwift-IOS-ANE","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuarua%2FSwift-IOS-ANE/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuarua%2FSwift-IOS-ANE/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuarua%2FSwift-IOS-ANE/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tuarua","download_url":"https://codeload.github.com/tuarua/Swift-IOS-ANE/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuarua%2FSwift-IOS-ANE/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28955212,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-31T18:30:42.805Z","status":"ssl_error","status_checked_at":"2026-01-31T18:30:19.593Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["actionscript","adobe-air","air-native-extensions","ane","ios","native-extension","osx","swift5","tvos"],"created_at":"2024-11-08T04:17:37.414Z","updated_at":"2026-01-31T21:01:09.648Z","avatar_url":"https://github.com/tuarua.png","language":"Swift","funding_links":["https://github.com/sponsors/tuarua","paypal.me/tuarualtd","https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=5UR2T52J633RC"],"categories":[],"sub_categories":[],"readme":"# FreSwift\n\nExample Xcode projects showing how to create AIR Native Extensions for iOS, tvOS \u0026 macOS using Swift.   \nIt supports iOS 15.0+, tvOS 15.6+, macOS 11.5+\n\n#### Xcode Version 26.2 (17C52) must be used with Apple Swift version 6.2.3 (swiftlang-6.2.3.3.21 clang-1700.6.3.2)\nIt is not possible to mix Swift versions in the same app. Therefore all Swift based ANEs must use the same exact version.\n\nThis project is used as the basis for the following ANEs   \n[Firebase-ANE](https://github.com/tuarua/Firebase-ANE)     \n[Vibration-ANE](https://github.com/tuarua/Vibration-ANE)     \n[GoogleMaps-ANE](https://github.com/tuarua/Google-Maps-ANE)       \n[AdMob-ANE](https://github.com/tuarua/AdMob-ANE)    \n[WebViewANE](https://github.com/tuarua/WebViewANE)    \n[AR-ANE](https://github.com/tuarua/AR-ANE)     \n[ML-ANE](https://github.com/tuarua/ML-ANE)\n\n\n-------------\n\n[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=5UR2T52J633RC)\n\n### Getting Started\n\nA basic Hello World [starter project](/starter_projects) is included for each target\n\n### How to use\n\n[Full documentation](https://tuarua.github.io/swiftdocs/freswift/index.html) is provided   \n\nThe following table shows the primitive as3 types which can easily be converted to/from Swift types\n\n| AS3 type | Swift type | AS3 param-\u003eSwift | return Swift-\u003eAS3 |\n|:--------:|:--------:|:--------------|:-----------|\n| String | String | `let str = String(argv[0])` | `return str.toFREObject()`|\n| int | Int | `let i = Int(argv[0])` | `return i.toFREObject()`|\n| Boolean | Bool | `let b = Bool(argv[0])` | `return b.toFREObject()`|\n| Number | Double | `let dbl = Double(argv[0])` | `return dbl.toFREObject()`|\n| Number | CGFloat | `let cfl = CGFloat(argv[0])` | `return cfl.toFREObject()`|\n| Date | Date | `let date = Date(argv[0])` | `return date.toFREObject()`|\n| Rectangle | CGRect | `let rect = CGRect(argv[0])` | `return rect.toFREObject()` |\n| Point | CGPoint | `let pnt = CGPoint(argv[0])` | `return pnt.toFREObject()` |\n| Vector int | [Int] | `let a = [Int](argv[0])` | `return a.toFREObject()`|\n| Vector Boolean | [Bool] | `let a = [Bool](argv[0])` | `return a.toFREObject()`|\n| Vector Number | [Double] | `let a = [Double](argv[0])` | `return a.toFREObject()`|\n| Vector String | [String] | `let a = [String](argv[0])` | `return a.toFREObject()`|\n| Object | [String, Any]? | `let dct = Dictionary.init(argv[0])` | N/A |\n| null | nil | | return nil |\n\n\n#### Basic Types\n\n```swift\nlet myString: String? = String(argv[0])\nlet myInt = Int(argv[1])\nlet myBool = Bool(argv[2])\n\nlet swiftString = \"I am a string from Swift\"\nreturn swiftString.toFREObject()\n```\n\n#### Creating new FREObjects\n\n```swift\nlet newPerson = FREObject(className: \"com.tuarua.Person\")\n\n// create a FREObject passing args\n// \n// The following param types are allowed: \n// String, Int, UInt, Double, Float, CGFloat, NSNumber, Bool, Date, CGRect, CGPoint, FREObject\nlet frePerson = FREObject(className: \"com.tuarua.Person\", args: \"Bob\", \"Doe\", 28, myFREObject)\n```\n\n#### Calling Methods\n\n```swift\n// call a FREObject method passing args\n// \n// The following param types are allowed: \n// String, Int, UInt, Double, Float, CGFloat, NSNumber, Bool, Date, CGRect, CGPoint, FREObject\nlet addition = freCalculator.call(method: \"add\", args: 100, 31) {\n```\n\n#### Getting / Setting Properties\n\n```swift\nlet oldAge = Int(person[\"age\"])\nlet newAge = oldAge + 10\n\n// Set property using braces access\nperson[\"age\"] = (oldAge + 10).toFREObject()\n\n// Create using FreObjectSwift allowing us to get/set properties using inferred types\n// The following param types are allowed: \n// String, Int, UInt, Double, Float, CGFloat, NSNumber, Bool, Date, CGRect, CGPoint, FREObject\nif let swiftPerson = FreObjectSwift(className: \"com.tuarua.Person\") {\n    let oldAge:Int = swiftPerson.age\n    swiftPerson.age = oldAge + 5\n}\n\n```\n\n#### Arrays\n\n```swift\nlet airArray: FREArray = FREArray(argv[0])\n// convert to a Swift [String]\nlet airStringVector = [String](argv[0])\n\n// create a Vector.\u003ccom.tuarua.Person\u003e with fixed length of 5\nlet myVector = FREArray(className: \"com.tuarua.Person\", length: 5, fixed: true)\nlet airArrayLen = airArray.length\n\n// loop over FREArray\nfor fre in airArray {\n    trace(Int(fre))\n}\n\n// set element 0 to 123\nairArray[0] = 123\n\n// push 2 elements to a FREArray\nairArray.push(66, 77)\n\n// return Int Array to AIR\nlet swiftArr: [Int] = [99, 98, 92, 97, 95]\nreturn swiftArr.toFREObject()\n```\n\n#### Sending Events back to AIR\n\n```swift\ntrace(\"Hi\", \"There\")\n\n// with interpolation\ntrace(\"My name is: \\(name)\")\n\ndispatchEvent(\"MY_EVENT\", \"this is a test\")\n```\n\n#### Bitmapdata\n\n```swift\nif let img = UIImage(freObject: argv[0]) {\n    if let rootViewController = UIApplication.shared.keyWindow?.rootViewController {\n        let imgView: UIImageView = UIImageView(image: img)\n        imgView.frame = CGRect(x: 0, y: 0, width: img.size.width, height: img.size.height)\n        rootViewController.view.addSubview(imgView)\n    }\n}\n```\n\n#### ByteArrays\n\n```swift\nlet asByteArray = FreByteArraySwift(freByteArray: argv[0])\nif let byteData = asByteArray.value { // NSData\n\tlet base64Encoded = byteData.base64EncodedString(options: .lineLength64Characters)\n}\n```\n  \n#### Error Handling\n\n```swift\nFreSwiftLogger.shared.context = context\n\nguard FreObjectTypeSwift.int == expectInt.type else {\n    return FreError(stackTrace: \"\",\n        message: \"Oops, we expected the FREObject to be passed as an int but it's not\",\n        type: .typeMismatch).getError(#file, #line, #column)\n}\n```\n\n#### Advanced Example - Extending. Convert to/from SCNVector3\n```swift\npublic extension SCNVector3 {\n    init?(_ freObject: FREObject?) {\n        guard let rv = freObject else { return nil }\n        let fre = FreObjectSwift(rv)\n        self.init(fre.x as CGFloat, fre.y, fre.z)\n    }\n    func toFREObject() -\u003e FREObject? {\n        return FREObject(className: \"flash.geom.Vector3D\", args: x, y, z)\n    }\n}\n\npublic extension FreObjectSwift {\n    public subscript(dynamicMember name: String) -\u003e SCNVector3? {\n        get { return SCNVector3(rawValue?[name]) }\n        set { rawValue?[name] = newValue?.toFREObject() }\n    }\n}\n```\n----------\n\n#### applicationDidFinishLaunching\nThe static library contains a predefined `+(void)load` method in FreMacros.h. This method can safely be declared in different ANEs.\nIt is also called once for each ANE and very early in the launch cycle. In here the SwiftController is inited and `onLoad()` called.\nThis makes an ideal place to add observers for applicationDidFinishLaunching and any other calls which would normally be added as app delegates, thus removing the restriction of one ANE declaring itself as the \"owner\".   \nNote: We have no FREContext yet so calls such as trace, dispatchEvent will not work.\n\n```swift\n@objc func applicationDidFinishLaunching(_ notification: Notification) {\n   appDidFinishLaunchingNotif = notification //save the notification for later\n}\nfunc onLoad() {\n    NotificationCenter.default.addObserver(self, selector: #selector(applicationDidFinishLaunching),\n    name: UIApplication.didFinishLaunchingNotification, object: nil)    \n}\n```\n----------\n\n### Required AS3 classes\n**com.tuarua.fre.ANEUtils.as** and **com.tuarua.fre.ANEError.as** and **avmplus.DescribeTypeJSON** are required by FreSwift and should be included in the AS3 library of your ANE\n\n### Prerequisites\n\nYou will need\n\n- Xcode\n- IntelliJ IDEA\n- AIR 50.1+\n- wget on macOS via `brew install wget`\n- [Carthage](https://github.com/Carthage/Carthage#installing-carthage)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftuarua%2Fswift-ios-ane","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftuarua%2Fswift-ios-ane","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftuarua%2Fswift-ios-ane/lists"}