Hello,
Basically, I am reading and writing an asset.
To simplify, I am just reading the asset and rewriting it into an output video without any modifications.
However, I want to add a fade-out effect to the last three seconds of the output video.
I don’t know how to do this.
So far, before adding the CMSampleBuffer to the output video, I tried reducing its volume using an extension on CMSampleBuffer.
In the extension, I passed 0.4 for testing, aiming to reduce the video's overall volume by 60%.
My question is:
How can I directly adjust the volume of a CMSampleBuffer?
Here is the extension:
extension CMSampleBuffer {
func adjustVolume(by factor: Float) -> CMSampleBuffer? {
guard let blockBuffer = CMSampleBufferGetDataBuffer(self) else { return nil }
var length = 0
var dataPointer: UnsafeMutablePointer<Int8>?
guard CMBlockBufferGetDataPointer(blockBuffer, atOffset: 0, lengthAtOffsetOut: nil, totalLengthOut: &length, dataPointerOut: &dataPointer) == kCMBlockBufferNoErr else { return nil }
guard let dataPointer = dataPointer else { return nil }
let sampleCount = length / MemoryLayout<Int16>.size
dataPointer.withMemoryRebound(to: Int16.self, capacity: sampleCount) { pointer in
for i in 0..<sampleCount {
let sample = Float(pointer[i])
pointer[i] = Int16(sample * factor)
}
}
return self
}
}
Swift
RSS for tagSwift is a powerful and intuitive programming language for Apple platforms and beyond.
Posts under Swift tag
200 Posts
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Hello,
I have been running into issues with setting nowPlayingInfo information, specifically updating information for CarPlay and the CPNowPlayingTemplate.
When I start playback for an item, I see lock screen information update as expected, along with the CarPlay now playing information.
However, the playing items are books with collections of tracks. When I select a new track(chapter) within the book, I set the MPMediaItemPropertyTitle to the new chapter name. This change is reflected correctly on the lock screen, but almost never appears correctly on the CarPlay CPNowPlayingTemplate. The previous chapter title remains set and never updates.
I see "Application exceeded audio metadata throttle limit." in the debug console fairly frequently.
From that a I figured that I need to minimize updates to the nowPlayingInfo dictionary. What I did:
I store the metadata dictionary in a local dictionary and only set values in the main nowPlayingInfo dictionary when they are different from the current value.
I kick off the nowPlayingInfo update via a task that initially sleeps for around 2 seconds (not a final value, just for my current testing). If a previous Task is active, it gets cancelled, so that only one update can happen within that time window.
Neither of these things have been sufficient. I can switch between different titles entirely and the information updates (including cover art).
But when I switch chapters within a title, the MPMediaItemPropertyTitle continues to get dropped. I know the value is getting set, because it updates on the lock screen correctly.
In total, I have 12 keys I update for info, though with the above changes, usually 2-4 of them actually get updated with high frequency.
I am running out of ideas to satisfy the throttling thresholds to accurately display metadata. I could use some advice.
Thanks.
Its document says openDocument can open a document at a specific URL. So I've saved a model as a JSON object with its URL and a bookmark as Data. With its security-scoped bookmark data resolved, I am able to open a document except that the app will crash right after opening a document. Console says
should only be called in the main thread
struct ContentView: View {
@EnvironmentObject var bookmarkViewModel: BookmarkViewModel
var body: some View {
VStack {
}
.onAppear {
loadBookmarks()
}
}
extension ContentView {
func loadBookmarks() {
print("1 \(Thread.current)") // NSMainThread
Task {
for bookmarkItem in bookmarkViewModel.bookmarkItems { // resolving a security-scoped bookmark
print("2 \(Thread.current)") // NSMainThread
if let _ = resolveBookmark(bookmarkData: bookmarkItem.bookmarkData) {
print("3 \(Thread.current)") // NSMainThread
do {
print("4 \(Thread.current)") // NSMainThread
try await openDocument(at: bookmarkItem.bookmarkURL)
print("5 \(Thread.current)") // NSMainThread
} catch {
print("\(error.localizedDescription)")
}
}
}
}
}
}
Well, the application is on the main thread. I've checked every line before and after opening a document with its URL. Call what on the main thread? This is confusing. Thanks.
class BookmarkViewModel: ObservableObject {
@Published var bookmarkItems: [BookmarkItem] = []
var defaultFileManager: FileManager {
return FileManager.default
}
var documentURL: URL? {
...
}
init() {
fetchBookmarkItems()
}
func fetchBookmarkItems() {
bookmarkItems.removeAll()
if let documentURL {
let bookmarkFolderURL = documentURL.appending(path: "MyApp").appending(path: "Bookmarks")
do {
let contents = try defaultFileManager.contentsOfDirectory(atPath: bookmarkFolderURL.path)
for content in contents {
...
let fileURL = bookmarkFolderURL.appending(path: content)
let data = try Data(contentsOf: fileURL)
let bookmarkItem = try JSONDecoder().decode(BookmarkItem.self, from: data)
bookmarkItems.append(bookmarkItem)
}
} catch {
print("Error fetching folder content: \(error.localizedDescription)")
}
}
}
}
struct BookmarkItem: Codable, Hashable {
let bookmarkURL: URL
let date: Date
let bookmarkData: Data
let open: Bool
}
I am trying to create a simple Swift package that uses AWS SDK for Swift but I get an error that says it can't import one of the modules, actually any of the modules. I researched this for a couple of days but can't figure out how to get this working. Any help would be appreciated.
Hi all
I'm reworking our app in SwiftUI. My ultimate goal is to access the NavigationPath from a child view which is used throughout different NavgationStacks. While searching for I came across different ways of achieving this. As I'm relatively new to SwiftUI it is hard to understand what the actual best practice seems to be.
So for the use case. My app has a TabView and each Tab has its own NavigationStack which looks something like this
struct TabNavigation: View {
@State private var selectedProductType: StaticProductType = .all
@StateObject private var appRouter = AppRouter()
var body: some View {
TabView(selection: $appRouter.selectedTab) {
Overview(activeType: $selectedProductType)
.tabItem {
Label("Home", systemImage: "house")
}
.tag(Tab.home)
AssortmentView(router: $appRouter.assortmentRouter,
activeType: $selectedProductType)
.tabItem {
Label(String(localized: "assortment"), systemImage:
"list.bullet")
}
.tag(Tab.assortment)
}
}
The AssortmenView holds the NavigationStack and defines the routes.
struct AssortmentView: View {
@Binding var router: AssortmentRouter
@Binding var activeType: StaticProductType
var body: some View {
NavigationStack(path: $router.navigationPath) {
VStack {
ProductTypeNavigation(activeType: $activeType)
.padding(.top, 10)
.padding(.horizontal, 10)
Spacer()
TabView(selection: $activeType) {
ListNavigation(type: .all)
.tag(StaticProductType.all)
ListNavigation(type: .games)
.tag(StaticProductType.games)
ListNavigation(type: .digital)
.tag(StaticProductType.digital)
ListNavigation(type: .toys)
.tag(StaticProductType.toys)
ListNavigation(type: .movies)
.tag(StaticProductType.movies)
ListNavigation(type: .books)
.tag(StaticProductType.books)
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
}
.addToolbar()
.navigationDestination(for: AssortmentRouter.Route.self) { route in
switch route {
case .overview(let type):
OverviewTypeView(type: type)
case .productDetail(let productId):
ProductDetailView(productId: productId)
.environmentObject(router)
case .productList:
ProductList()
}
}
}
}
}
Through my app I often use a view to displaying products. This view is reused over different NavigationStacks.
struct ProductDetailView: View {
var productId: Int
@StateObject private var viewModel: ProductDetailViewModel = ProductDetailViewModel()
@State private var showErrorAlert = false
@EnvironmentObject var router: AssortmentRouter
var body: some View {
VStack {
if !viewModel.isRefreshing {
let product = viewModel.product
VStack {
Text("Product: \(product.title)")
NavigationLink(destination: ProductDetailView(productId: Product.preview.productId)) {
Text("Test")
}
}
.navigationTitle(product.title)
} else {
ProgressView()
}
}.task {
await loadProduct()
}
.alert("Error", isPresented: $showErrorAlert, presenting: viewModel.localizedError) { _ in
Button("Try again") {
Task {
await loadProduct()
}
}
Button("Go Back", role: .cancel) {
// access navigationPath
}
} message: { errorMessage in
Text(errorMessage)
}
}
@MainActor
private func loadProduct() async {
await viewModel.loadProduct(productId: productId)
showErrorAlert = viewModel.localizedError != nil
}
}
In this example I created an AppRouter which holds all information for the routes and some functions to accessing the NavigationPath.
class AppRouter: ObservableObject {
var assortmentRouter = AssortmentRouter()
var selectedTab: Tab = .home
func navigateTo(tab: Tab) {
selectedTab = tab
}
}
class AssortmentRouter: ObservableObject {
var navigationPath = NavigationPath()
enum Route: Hashable {
case overview(type: StaticProductType)
case productList
case productDetail(productId: Int)
}
func navigateTo(route: Route) {
navigationPath.append(route)
}
}
This works fine as it is. The pro of this solution is that I don't have to pass the NavigationPath down each subview to use it as I can define it as EnvrionmentObject. The problem with this though, I like to reuse ProductDetailView also in my other NavigationStack which won't have a router binding of type AssortmentRouter as you can imagine.
To come back to my initial question, what would be the best way to design this?
Passing down a NavigationPath Binding and using different typing for navigationDestinaion values
Define a callback which is passed as function parameter to the detail view
Using dismiss, but I read that this is can lead to weird behaviour and bugs
Any other option? Maybe changing the app architecture to handle this a better way
Apolgize the long post, but I would be really glad to get some feedback on this, so I can do it the right way.
Thank you very much
Hi everyone,
I'm developing an ARKit app using RealityKit and encountering an issue where a video displayed on a 3D plane shows up as a pink screen instead of the actual video content.
Here's a simplified version of my setup:
func createVideoScreen(video: AVPlayerItem, canvasWidth: Float, canvasHeight: Float, aspectRatio: Float, fitsWidth: Bool = true) -> ModelEntity {
let width = (fitsWidth) ? canvasWidth : canvasHeight * aspectRatio
let height = (fitsWidth) ? canvasWidth * (1/aspectRatio) : canvasHeight
let screenPlane = MeshResource.generatePlane(width: width, depth: height)
let videoMaterial: Material = createVideoMaterial(videoItem: video)
let videoScreenModel = ModelEntity(mesh: screenPlane, materials: [videoMaterial])
return videoScreenModel
}
func createVideoMaterial(videoItem: AVPlayerItem) -> VideoMaterial {
let player = AVPlayer(playerItem: videoItem)
let videoMaterial = VideoMaterial(avPlayer: player)
player.play()
return videoMaterial
}
Despite following the standard process, the video plane renders pink. Has anyone encountered this before, or does anyone know what might be causing it?
Thanks in advance!
Hello,
I'm encountering a runtime crash when building my visionOS app with Xcode 16.3 for visionOS 2.5. Our existing AppStore/Testflight app is also instantly crashing on visionOS 2.5 when opened but works fine on e.g visionOS 2.4.
The app builds successfully but crashes on launch with this symbol lookup error (slightly adjusted because the forum complained regarding sensitive data):
Symbol not found: _$sSo22CLLocationCoordinate2DVSE12CoreLocationMc
Referenced from: <XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX> /private/var/containers/Bundle/Application/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/MyApp.app/MyApp.debug.dylib
Expected in: <XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX> /usr/lib/swift/libswiftCoreLocation.dylib
dyld config: DYLD_LIBRARY_PATH=/usr/lib/system/introspection DYLD_INSERT_LIBRARIES=/usr/lib/libLogRedirect.dylib:/usr/lib/libBacktraceRecording.dylib:/usr/lib/libMainThreadChecker.dylib:/System/Library/PrivateFrameworks/GPUToolsCapture.framework/GPUToolsCapture:/usr/lib/libViewDebuggerSupport.dylib
I've already implemented my own Codable conformance for CLLocationCoordinate2D:
extension CLLocationCoordinate2D: Codable {
// implementation details...
}
This worked fine on previous visionOS/Xcode versions. Has anyone encountered this issue or found a solution?
System details:
macOS version: 15.3.2
Xcode version: 16.3
visionOS target: 2.5
Thank you!
I'm experiencing an issue with a SwiftUI document-based app where document files are not appearing in the "Recents" tab or anywhere in the Files app when created from the "Recents" tab. However, when creating documents from the "Browse" tab, they work as expected.
When I print the URL of the created document, it shows a valid path, but when navigating to that path, the file doesn't appear. This seems to be a specific issue related to document creation while in the "Recents" tab.
Steps to Reproduce
Use Apple's demo app for document-based SwiftUI apps: https://developer.apple.com/documentation/swiftui/building-a-document-based-app-with-swiftui
Run the app and navigate to the "Recents" tab in the Files app
Create a new document
Note that the document doesn't appear in "Recents" or anywhere in Files app
Now repeat the process but create the document from the "Browse" tab - document appears correctly
Environment:
Xcode 16.3
iOS 18.4
Expected Behavior:
Documents created while in the "Recents" tab should be saved and visible in the Files app just like when created from the "Browse" tab.
After the update of the Xcode to latest version, I’m getting “No Such Module Unity Framework” as error. the complete information is below.
I had to update the Xcode and the O.S as per the Apple Requirement from my older version of 14.x to latest 16.3. I had no issued running the Unity within my iOS App till the recent update.
Previous Setup:
Unity was successfully integrated into this iOS app and running fine before the update.
As it was working till the Xcode version 14.3, i have not changed any code relevant to Unity.
What I’ve Tried:
a. Added UnityFramework.framework to “Link Binary with Libraries” and marked it as “Embed & Sign”.
b. Verified Framework Search Paths include $(PROJECT_DIR)/UnityProject/build/Debug-iphoneos
c. Cleaned build folder, deleted Derived Data
d. Checked [CP] Embed Pods Frameworks step in Build Phases
Stuck On: Xcode still throws "No such module 'UnityFramework'" — it’s as if the framework isn’t being built or seen from my main project.
Request for Help:
Has anyone encountered this issue post-Xcode 16.3 update from 14.x. I’d really appreciate any guidance, updated workflows, or even a checklist of steps for properly integrating Unity into an existing iOS app with the new Xcode build system.
Greetings
I'm trying to get on iPad the SSID from the wifi I'm connected to. For that, I added the wifi entitlement and I'm requesting permission to the user for Location.
Once I have it, I'm using the function CNCopySupportedInterfaces to get the interfaces, but I can only receive the en0, which using the method CNCopyCurrentNetworkInfo returns nil.
I also tried using the NEHotspotNetwork.fetchCurrent and the SSID keeps being nil. So right now I'm drawing a blank. Is there any way to make it work? Thanks.
Topic:
App & System Services
SubTopic:
Networking
Tags:
Swift
Network Extension
Network
Core Location
Hello,
I'm running into an issue while developing an iOS app that requires local network access. I’m using the latest MacBook Air M4 with macOS sequoia 15.5 and Xcode 16.1. In the iOS Simulator, my app fails to discover devices connected to the same local network.
I’ve already added the necessary key to the Info.plist:
NSLocalNetworkUsageDescription
This app needs access to local network devices.
When I run the app on a real device and M2 Chip Macbook's simulators, it works fine for local network permission as expected. However, in the M4 Chip Macbook's Simulator:
The app can’t find any devices on the local network
Bonjour/mDNS seems not to be working as well
I’ve tried the following without success:
Restarting Simulator and Mac
Resetting network settings in Simulator
Confirming app permissions under System Settings > Privacy & Security
Has anyone else encountered this issue with the new Xcode/macOS combo? Is local network access just broken in the Simulator for now, or is there a workaround?
Thanks in advance!
Hoping someone can help me with this…
The error is… Generic parameter ‘/‘ cannot be inferred.
.multilineTextAlignment(.center)
.onAppear(perform: {
var checkFirstCardLatitude = cards.firstCardLatitude
let charArray = Array(checkFirstCardLatitude)
let allowed: [Character] = ["-", ".", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
for char in charArray {
if char != allowed {
cards.firstCardLatitude = "000.000000" // Reset Text Field
}
}
})
When referencing WebKit’s function callAsyncJavaScript, any iOS app crashes immediately on startup when running in simulator. On device, it does not crash.
The error message is:
dyld[9892]: Symbol not found: _$sSo9WKWebViewC6WebKitE19callAsyncJavaScript_9arguments2inAF17completionHandlerySS_SDySSypGSo11WKFrameInfoCSgSo14WKContentWorldCys6ResultOyyps5Error_pGcSgtF
Furthermore, this only happens for some simulators.
With Xcode 16.3, it’s simulators 18.0 and prior.
With Xcode 16.4 RC1 it includes simulators iOS 18.5 and 18.4 but works correctly on earlier versions of simulator.
The reproduction path is easy. Example file attached.
This used to work about 3 weeks or a month ago, which is perplexing.
As a workaround I replaced the function with evaluateJavaScript which does not crash, but that is not the desired method to use for us.
The attached file can reproduce it easily - just refernece this view from the default ContentView in a new project.
TestWebView.swift
I'm building a SwiftUI app with a UITextView subclass, and it seems that the software keyboard doesn't trigger the pressesBegan or pressesEnded functions of UITextView. With a hardware keyboard, pressesBegan works as expected, allowing us to intercept key presses in our subclass.
I can't find any documentation about this, or any other forum posts (here or on Stack Overflow) that talk about a discrepancy between software and hardware keyboard behaviors, and I can't believe this is an intended behavior. Our app is a SwiftUI app, in case that's relevant.
Does anyone have any guidance? Is this a bug or am I not understanding this API? Any information or work arounds would be greatly appreciated.
I've made a sample project that demonstrates this issue, which you can grab from GitHub at https://github.com/nyousefi/KeyPressSample. To see this in action, run the sample project and start pressing keys. The hardware keyboard will print the key press at the top of the screen (above the text view), while the software keyboard won't.
I am trying to use initialize a Decimal type using its generic binary integer exactly initializer but it keeps crashing with a fatal error regardless of the value used:
Code to reproduce the issue:
let binaryInteger = -10
let decimal = Decimal(exactly: binaryInteger) // error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
Is it a known bug?
For an initial launch of Xcode, the GatherProvisioningInputs usually takes 60 seconds for a simple project. Subsequent build is fast though.
But the build process seems got stuck at VeryModule of the MyFramework target, which usually takes 15 seconds.
I'm developing an iPadOS 18+ application that uses a UITabBarController, styled as a sidebar, to serve as the primary navigation interface. This setup includes 20 different tabs, each representing a distinct section of the app.
For the user experience, each tab needs to present a master-detail interface, implemented using a UISplitViewController. The goal is to allow users to navigate between tabs via the sidebar, and within each tab, access related content through the split view's list-detail pattern.
The Problem:
Currently, my implementation involves instantiating a separate UISplitViewController for each tab, resulting in 20 unique split view instances embedded inside the UITabBarController. While this works functionally, it leads to significant memory usage, especially after the user opens each tab at least once. The accumulation of all these instantiated view controllers in memory eventually causes performance degradation or even memory warnings/crashes on lower-end iPads.
The Question:
What is the best approach to implement this type of architecture without running into memory management issues?
Specifically:
Is there a way to reuse or lazily load the UISplitViewController instances only when needed?
Can we unload or release split view controllers that haven't been used for a while to reduce memory pressure?
Would a custom container controller be more appropriate than using UITabBarController in this case?
Are there iPadOS 18+ best practices or newer APIs that support this kind of complex multi-tab, multi-split-view structure efficiently?
Any advice on how to optimize memory usage while preserving the sidebar navigation and split view layout would be highly appreciated.
Hello Everyone,
I’m working on a project that involves multicast communication between processes running on different devices within the same network. For all my Apple devices (macOS, iOS, etc.), I am using NWConnectionGroup, which listens on a multicast address "XX.XX.XX.XX" and a specific multicast port.
The issue occurs when a requestor (such as a non-Apple process) sends a multicast request, and the server, which is a process running on an Apple device using NWConnectionGroup (the responder), attempts to reply. The problem is that the response is sent from a different ephemeral port rather than the port on which the multicast request was received.
If the client is behind a firewall that blocks unsolicited traffic, the firewall only allows incoming packets on the same multicast port used for the initial request. Since the multicast response is sent from a different ephemeral port, the firewall blocks this response, preventing the requestor from receiving it.
Questions:
Is there a recommended approach within the NWConnectionGroup or Network.framework to ensure that responses to multicast requests are sent from the same port used for the request?
Are there any best practices for handling multicast responses in scenarios where the requestor is behind a restrictive firewall?
Any insights or suggestions on how to account for this behavior and ensure reliable multicast communication in such environments would be greatly appreciated.
Thanks,
Harshal
Hello,
We have a SwiftUI-based application that runs as a LaunchAgent and communicates with other internal components using Unix domain sockets (UDS).
On Sequoia (macOS virtualized environment), when installing the app, we encounter the Local Network Privacy Alert, asking:
"Allow [AppName] to find and connect to devices on the local network?"
We are not using any actual network communication — only interprocess communication via UDS.
Is there a way to prevent this system prompt, either through MDM configuration or by adjusting our socket-related implementation?
Here's a brief look at our Swift/NIO usage:
class ClientHandler: ChannelInboundHandler {
...
public func channelRead(context: ChannelHandlerContext, data: NIOAny) {
...
}
...
}
// init bootstrap.
var bootstrap: ClientBootstrap {
return ClientBootstrap(group: group)
// Also tried to remove the .so_reuseaddr, the prompt was still there.
.channelOption(ChannelOptions.socketOption(.so_reuseaddr), value: 1)
.channelInitializer { channel in
// Add ChannelInboundHandler reader.
channel.pipeline.addHandler(ClientHandler())
}
}
// connect to the UDS.
self.bootstrap.connect(unixDomainSocketPath: self.path).whenSuccess { (channel) in
..
self.channel = channel
}
...
...
// Send some data.
self.channel?.writeAndFlush(buffer).wait()
Any guidance would be greatly appreciated.
Hi!
I'm working on a web extension for Safari and I need to send messages from the containing application to JavaScript. For this I use the method
class func dispatchMessage(
withName messageName: String,
toExtensionWithIdentifier identifier: String,
userInfo: [String : Any]? = nil
) async throws
of the SFSafariApplication class. If the site is opened in Safari in normal mode, everything works as expected. However, if the site is "docked", the messages are not transmitted to this "Web App".
Is it possible to somehow link the container application to the docked website so that messages from the application are received by this "Web App"?
That you.