Posts

Post not yet marked as solved
0 Replies
893 Views
In the following simplified app I want to change the status bar color from default black to white (the main iPhone theme is light) but nothing else. I'm partly succeeded doing so, but the theme of keyboard is wrong: when it is first appeared it is good (light) and as soon as i start typing it changes itself to unwanted dark. Is there a way to change just the status bar color but nothing else? Note that I want the status bar color be dynamic - sometimes white, sometimes black depending upon what the app is doing. import SwiftUI struct ContentView: View {     @State var string = "Hello, World"     var body: some View {         TextField("EditableText", text: $string)             .font(.largeTitle)             .frame(maxHeight: 1000)             .navigationTitle("Hello, World")             .background(                 Color(red: 1, green: 0.7, blue: 0.7, opacity: 1)             )             .colorScheme(.light) // attempt to "undo" the effect             .preferredColorScheme(.dark)     } } @main struct NavBarTestApp: App {     var body: some Scene {         WindowGroup {             ContentView()         }     } } PS. I don't mind dropping to UIKit for status bar handling if it is not possible to do it in SwiftUI. The rest of app itself is SwiftUI and it is quite big, here I am showing a stripped down version.
Posted Last updated
.
Post marked as solved
4 Replies
790 Views
Given an arbitrary memory address how do I find (in runtime) the nature of memory block it belongs to? For stack addresses I guess there's some "stack start" and "stack end" of the current thread. For other threads' stacks - I guess I'd have to enumerate all threads to get those ranges. I also found that I can use malloc_size and sometimes it gives me correct result (the size if non zero at least), although it doesn't give me the beginning of the block memory address belongs to. For anything else I have no clue at the moment. Ideal method I am looking for: struct MemoryBlock { let type: MemoryBlockType // stack, heap, unmapped, etc let start: UnsafeRawPointer let size: Int let attributes // e.g. red / write } func findMemoryBlock(_ address: UnsafeRawPointer) -> MemoryBlock PS. the language doesn't matter (e.g. can be C) so long as this method works in a swift/obj-c app.
Posted Last updated
.
Post not yet marked as solved
11 Replies
6.5k Views
i have a list like this: id: 1, image: image1, title: title1, badge: 0 id: 2, image: image2, title: title2, badge: 0 id: 3, image: image3, title: title3, badge: 0 ... is my understanding correct that in order to do a smooth "expected" animation when I want to change both the badge of the item and its order i have to manually split this "big" update into two smaller updates (first change then move, or vice versa)? this is somewhat surprising, i would expect a diffable implementation to have a notion of "identity" (in the example above it's "id") and calculate the differences based on that identity plus ite equivalence check rather than just based on the hash/equality check for the whole item.
Posted Last updated
.
Post not yet marked as solved
4 Replies
1.2k Views
is this a bug that NSDateFormatter knows about leap days but not about leap seconds? let f = DateFormatter() f.timeZone = TimeZone(identifier: "UTC") f.dateFormat = "yyyy/MM/dd HH:mm:ss" // last leap year let t1 = f.date(from: "2020/02/29 00:00:00") // 2020-02-29 00:00:00 UTC // last leap second let t2 = f.date(from: "2016/12/31 23:59:60") // nil
Posted Last updated
.
Post marked as solved
2 Replies
738 Views
Our app has "allow arbitrary loads" in the "App Transport Security Settings" and generally allows both "http" and "https" connections. I want to restrict basic authentication usage to secure connections only, what is the best way to do that? I have URLSessionTaskDelegate's:     func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { where I can put the relevant logic, but how do I check if the connection attempt in question is happening over TLS or not? I can check task.currentRequest.url scheme being "http" vs "https", and port being nil vs 80 vs 443, but I hope there is a more robust check.
Posted Last updated
.
Post not yet marked as solved
4 Replies
1.1k Views
https://developer.apple.com/documentation/foundation/urlcache has this: "Although URLCache instance methods can safely be called from multiple execution contexts at the same time, be aware that methods like  cachedResponse(for:) and storeCachedResponse(_:for:) have an unavoidable race condition when attempting to read or write responses for the same request." What does it mean "unavoidable"? If I put a lock (mutex / NSLock, or similar) in my wrappers on top of "cachedResponse" / "storeCachedResponse" would that avoid the mentioned race condition? Also, what do they mean by "the same request"? A few examples below: let url = URL(string: "https://www.apple.com")! let req1 = URLRequest(url: url) let req2 = req1 // perhaps "the same" let req3 = URLRequest(url: url) // "the same"? let req4 = URLRequest(url: req1.url!) // "the same"? let req5 = URLRequest(url: url, cachePolicy: req1.cachePolicy, timeoutInterval: req1.timeoutInterval) // "the same"? let req6 = URLRequest(url: url, cachePolicy: req1.cachePolicy, timeoutInterval: 1234) // "the same"? let req7 = URLRequest(url: url, cachePolicy: .reloadIgnoringCacheData, timeoutInterval: req1.timeoutInterval) // "the same"? assert(req1 == req2) assert(req1 == req3) assert(req1 == req4) assert(req1 == req5) assert(req1 == req6) // this is ok assert(req1 == req7) // this fails
Posted Last updated
.
Post marked as solved
3 Replies
1.8k Views
Is it possible to use network from within iOS Thumbnail Extension? I tried - it works fine under simulator, but I'm getting this error when running on real device: networkd_settings_read_from_file Sandbox is preventing this process from reading networkd settings file at "/Library/Preferences/com.apple.networkd.plist", please add an exception. Adding "App Transport Security Settings / Allow Arbitrary Loads" plist entry didn't help. As the error seems to be specific access to a particular file I tried adding "com.apple.security.temporary-exception.files.absolute-path.read-only" but it didn't help and looks like it couldn't help on iOS: "Note: This chapter describes property list keys specific to the macOS implementation of App Sandbox. They are not available in iOS."
Posted Last updated
.
Post not yet marked as solved
12 Replies
2.5k Views
is JSONSerialization.jsonObject(with: inputStream) reliable? sometimes it works fine (e.g. with small objects) and sometimes it blocks forever (easier to get the block with big objects). yet sometimes it works ok even with big objects. tried to call it on a different queue - didn't help.
Posted Last updated
.
Post marked as solved
5 Replies
4.9k Views
hello, how do i create a virtual microphone on macOS that can be selected as a default input device in System Settings or in apps like FaceTime / QuickTime Player / Skype, etc? is Audio HAL plugin the way to go? i've seen this macOS 10.15 note: "Legacy Core Audio HAL audio hardware plug-ins are no longer supported. Use Audio Server plug-ins for audio drivers." though i am not sure if that's applicable, as i can think of these interpretations: 1 "Legacy Core Audio HAL audio hardware plug-ins are no longer supported (but you can still use non-legacy ones.) 2 "Legacy Core Audio HAL audio hardware plug-ins are no longer supported." (but you can still use non-hardware ones".) 3 "Legacy Core Audio HAL audio hardware plug-ins are no longer supported". (if you used that functionality to implement audio hardware drivers then your you can use Audio Server plug-ins instead, otherwise you are screwed.) The "Audio Server plugin" documentation is minimalistic: https://developer.apple.com/library/archive/qa/qa1811/_index.html which leads to a 2013 sample code: https://developer.apple.com/library/archive/samplecode/AudioDriverExamples/Introduction/Intro.html and contains a "nullAudio" plugin and a kernel extension backed plugin - neither of those i wasn't able to resurrect (i'm on macOS Catalina now). any hints?
Posted Last updated
.
Post marked as solved
1 Replies
1k Views
hello, i know i could be overly paranoid at times.. but is this the case that i need to protect my global memory location (that i read from / write to) with read/write memory barriers even if i'm only accessing that location from a single serial DispatchQueue? considering the fact that GCD can pick a different thread to run operations on that queue, and a further fact that different threads can run on different cores and thus have different L1/L2 caches, so that the barrier unprotected write to a location in one code invocation (that runs on my serial queue, that happens to be bound to thread1/core1 at the time) might not yet be visible to a different invocation of my code that runs a bit later on the same serial GCD queue but it so happens that now it runs on thread2/core2, so that the barrier unprotected read from that global memory location returns some stale data? is the answer any different if we consider a serial (maxConcurrentCount=1) OperationQueue instead of a serial dispatch queue? finally, is the answer any different if we consider a single NSThread / pthread instead of a serial dispatch queue? can a single thread be bound to different cores during its lifetime? (e.g. work on one core, then sleep, then awake on a different core). thank you.
Posted Last updated
.
Post marked as solved
10 Replies
7.7k Views
hello, i don't think it is provided by the system already so i'd like to implement a smart version of DispatchQueue.async function - the one that will not reschedule the block if i am already on the queue in question and call the block directly instead in this case.  extension DispatchQueue { func asyncSmart(execute: @escaping () -> Void) { if DispatchQueue.current === self { // ????? execute() } else { async(execute: execute) } } } the immediate problem is that there is no way to get the current queue (in order to compare it with the queue parameter and do the logic branch). anyone've been through it and solved this puzzle?
Posted Last updated
.
Post not yet marked as solved
2 Replies
1.1k Views
https://developer.apple.com/library/archive/qa/qa1811/_index.html this is old, i know. can those in the know shed some light on whether the bit about temp/cached location still correct: An AudioServerPlugIn operates in a limited environment. ... Further, the host process is sandboxed. As such, an AudioServerPlugIn may only read files in its bundle in addition to the system libraries and frameworks. It may not access user documents or write to any filesystem locations other than the system's cache and temporary directories as derived through Apple API. i tried to write to temporary folder (obtained with NSTemporaryDirectory and also tried /tmp and /private/tmp) and cached folder (obtained with NSSearchPathForDirectoriesInDomains + cachesDirectory) but everything i tried resulted in permission errors.
Posted Last updated
.
Post not yet marked as solved
0 Replies
866 Views
i thought it is impossible to have CallKit show system UI for outgoing calls. but then i saw this: "For incoming and outgoing calls, CallKit displays the same interfaces as the Phone app..." https://developer.apple.com/documentation/callkit how do i present it though? or is this a documentation error?
Posted Last updated
.
Post not yet marked as solved
0 Replies
433 Views
documentation for the mFramesPerPacket field of AudioStreamBasicDescription has this: https://developer.apple.com/documentation/coreaudiotypes/audiostreambasicdescription/1423257-mframesperpacket?language=objc The number of frames in a packet of audio data. ... For variable bit-rate formats, the value is a larger fixed number, such as 1024 for AAC. is there a definite table somewhere that lists allowed values for codecs like AAC_ELD, Opus, etc? i know that 50 works for AAC_ELD. but that's only because i tried that particular value... maybe 49 or 51 works as well, and i just didn't try those. there must be a documented way or API way to determine allowed values.
Posted Last updated
.