Author Topic: Installing BASS into a Swift Xcode Project (Mac & iOS)  (Read 644 times)

brom43

  • Posts: 18
For the benefit of other Swift developers, here's how I created a Swift Xcode project incorporating the BASS audio library.  (I used the newest versions of macOS 13.2.1, iOS 16.3.1, Xcode 14.2, and BASS 2.4.17 on 7 March 2023.)  This app is multiplatform (meaning it works on both macOS and iOS devices).  This project can be freely downloaded from https://github.com/Keith-43 .

-------------------
Step 1: 
In Xcode, create a new Multiplatform App named SwiftBassDemo.  Build and run it to get a window displaying "Hello, world!". This creates a SwiftBassDemo project which contains (in the Finder window used by Xcode) the file structure:

   SwiftBassDemo (project folder)
      SwiftBassDemo (app folder)
         Assets.xcassets
         ContentView.swift
         Preview Content (folder)
         SwiftBassDemo.entitlements
         SwiftBassDemoApp.swift
      SwiftBassDemo.xcodeproj

Step 2: 
Go to https://www.un4seen.com and download the macOS  and iOS versions of the BASS audio library.  This puts two folders named bass24-osx and bass24-ios into your Downloads folder.  From the former, copy the two files named bass.h and libbass.dylib into your SwiftBassDemo project folder. From the latter, copy the bass.xcframework folder into your SwiftBassDemo project folder.  (Remember to tell Xcode about these new files by using the File | Add Files to "SwiftBassDemo" command.)

Step 3: 
In Xcode's Project Navigator pane (typically on the far left of the Xcode window), select the SwiftBassDemo project at the top.  In the pane to the immediate right-hand side of the Project Navigator pane, select the SwiftBassDemo under TARGETS.  In the General section, there is a category labelled "Frameworks, Libraries, and Embedded Content”.  Confirm that the bass.xcframework and libbass.dylib items were added there (automatically done by Step 2 above.)  If not, add them.  For both items, in the Embed subcolumn, change the option from "Do Not Embed" to "Embed & Sign".  For the bass.xcframework item, in the Filters subcolumn change the "Always Used" to "iOS".  For the libbass.dylib item, in the Filters subcolumn, change the "Always Used" to "macOS".

Step 4: 
Create a text file named "bridging-header.h" with the following text: 
   #ifndef bridging_header_h 
   #define bridging_header_h 
   #include "bass.h" 
   #endif /* bridging_header_h */ 
Place this file into your project folder.  (Remember to tell Xcode about this new file by using the File | Add Files to "SwiftBassDemo" command.)

The project folder in your Finder window should now look like:

   SwiftBassDemo (project folder)
      bass.h
      bass.xcframework (folder)
      bridging-header.h
      libbass.dylib
      SwiftBassDemo (app folder)
      SwiftBassDemo.xcodeproj

Step 5: 
In the SwiftBassDemo PROJECT | Build Settings | Swift Compiler - General,  set "Objective-C Bridging Header" to "bridging-header.h" in both the Debug and Release subheadings.

Step 6: 
In Xcode's Project Navigator pane (typically on the far left of the Xcode window), select the SwiftBassDemo project at the top.  In the pane to the immediate right-hand side of the Project Navigator pane, select the SwiftBassDemo under TARGETS.  In the Build Phases section, there is a category labelled "Embedded Frameworks”.  Within this category, confirm that both the bass.xcframework and libbass.dylib are named.  If not, add them.   In the Filters subcolumn, confirm that "Allow any platform" has been changed to "iOS" for the former item and to "macOS" for the latter item.  Confirm that the "Code Sign On Co..." box is checked for both items.

Step 7:
Following the above steps will produce an app that works as desired.  However, if you want to distribute your app on Apple's App Store, you will need to remove the i386 32-bit code from the libbass.dylib file so that your app passes Apple's verification test.  To do this, use the Terminal app in your Applications | Utilities folder, change it's target directory (using the "cd" command) to your bass24-osx folder (from steps 1 and 2), and enter the command "make 64bit".  This creates a folder named "64bit" which contains a new libbass.dylib file.  Replace the file in your SwiftBassDemo project forlder with this new one.  In Xcode, run your SwiftBassDemo project again, and it should now pass Apple's verification test.

Step 8: 
To enable live microphone input, check the "Resource Access: Audio Input" box in the SwiftBassDemo TARGET, "Signing & Capabilites" heading, "All" subheading, "Hardened Runtime" section.
Also, you must add a "Privacy - Microphone Usage Description" (such as "This app analyzes audio from the microphone."  Add this in the SwiftBassDemo TARGET, Info heading, "Custom Application Target Properties" section.
----------------
« Last Edit: 26 Mar '23 - 16:59 by brom43 »

Ian @ un4seen

  • Administrator
  • Posts: 26172
Thanks for that. I have added a link to your example project on the BASS page, so it's easier to find.

brom43

  • Posts: 18
Ian, As you know, I installed BASS into my "SwiftBassDemo" project.  The app worked.  It rendered a real-time spectrum, and I published the code on GitHub.  I thought that I was finished.  However, I just tried to validate it on Apple's App Store Connect, and received the following error message:

Unsupported Architectures.  Your executable contained the following disallowed architectures:  '[i386 (in path/Frameworks/libbass.dylib)]'.  New apps submitted to the Mac App Store must support 64-bit starting January 2018, and Mac app updates and existing apps must support 64-bit starting June 2018.

I am using the newest versions of macOS 13.2.1, iOS 16.3.1, Xcode 14.2, and BASS 2.4.17 on 20 March 2023.
Can you tell me how to solve this problem?

Ian @ un4seen

  • Administrator
  • Posts: 26172
You can exclude the i386 architecture from the BASS and add-on libraries using the "makefile" included in the macOS BASS package. Open the BASS folder in Terminal and enter "make 64bit".

brom43

  • Posts: 18
Ian, Thanks for your guidance.  By "the BASS folder", do you mean "the bass24-osx" folder?  Also, what should I do regarding the bass24-ios folder?

Ian @ un4seen

  • Administrator
  • Posts: 26172
The BASS folder would be wherever you extracted the BASS package, most likely to indeed be "bass24-osx". You shouldn't need to do anything to the iOS libraries.

brom43

  • Posts: 18
There is now a much simpler method of incorporating BASS into an Xcode Swift project than the answer I provided earlier.  A programmer named Treata Norouzi packaged the BASS files into a Swift Package which he called CBass. He made this package open-source and posted it on GitHub.  Simply importing the CBass package seamlessly integrates the BASS audio library and its extensive collection of extensions into your Swift projects.

To import BASS into your Xcode project, click on "File | Add Package Dependencies...". In the resultant pop-up window, type "github.com/Teatra11/CBass" as the repository url, and click on "Add Package". Then type "import Bass" at the top of any class in the project using BASS library commands.

To be clear, the CBass Swift Package wrapper is open source and free for general usage, but the wrapper's contents (mainly the files bass.xcframework, libbass.xcframework, bass.h, bridge.c, and bridge.h) are proprietary to Un4seen Developments. Usage of these files is free for non-commercial use.

I posted a simple Swift project named SwiftCBassDemo at https://github.com/Treata11/SwiftCBassDemo as a sample illustrating proper usage.