Post

Replies

Boosts

Views

Activity

Workspace with multiple targets for same framework
Hi ! I'm currently stuck with an issue on Xcode, I'll try explain to the best I can :-) I have a workspace (that I need to keep that way, I can't split projects) that contains multiple projects. I have 2 frameworks : Core and Draw. Draw depends on Core. So far so good. I needed to create a test application that can be modular and link my framewok, but also other drawing frameworks. To that extend, I created a CardLIbrary framewok, and a CardAdapter framewok, and I linked them into the test application. Test App └── DrawCardAdapter │ └── CardAdapter │ └── CardLibrary │ └── Core │ └── TCA (SPM) │ └── Draw │ └── Core Here, all dependencies are local ones if not stated otherwise (for the SPM). CardLibrary is a framework that generates only UI (linked to Core for logging purposes, nothing fancy). I also added TCA which is a SPM dependency, it may generate some issues after. CardAdapter is an abstraction for CardLibrary. Basically, it acts as an interface between CardLibrary and Test Application. DrawCardAdapter is the actual implementation of CardAdapter using local Draw framework. Why so complex ? Because I need to be able to do this: Test App └── ExternalDrawCardAdapter │ └── CardAdapter │ └── CardLibrary │ └── Core │ └── TCA (SPM) │ └── ExternalDrawFramework With this architecture, I can create a new ExternalDrawCardAdapter that implents the CardAdapter logic. This new framework does not relies on my Draw framework, and yet, I can still generate a test application that visually looks and feel like all others, but use a completely different drawing engine underneath. To do that, the Test App code only uses inputs and outputs from CardAdapter (the protocol), not concrete implementations like DrawCardAdapter or ExternalDrawCardAdapter. But to be able to make it work, I have 2 test ap targets : a DrawTestApp and a ExternalDrawTestApp. All code files are shared, except a SdkLauncher that is target specific and acutally loads the proper implementation. So the SdkLauncher for DrawTestApp is linked to the DrawCardAdapter (embed and sign) and loads DrawCardAdapter framework, whereas the ExternalDrawTestApp is linked to the ExternalDrawCardAdapter (embed and sign) and loads ExternalDrawCardAdapter framework. Now it looks like this (I only show local stuff othewise it would be too complicated :D) So far so good, this works well. Now, for the part that fails. My Draw and Core frameworks are frameworks that I release for my customers (Cocoapod), and I wanted to be able to test my productions frameworks with the test app (it's that actual purpose of the test app : being able to test development and released SDKs) To do so, I duplicated every target and removed local dependency for a cocoapod dependency. All targets were named -pod, but the actual module and product name are still the same (I tried differently, it did not work either, I'll explain it later). Test App └── DrawCardAdapter │ └── CardAdapter │ └── CardLibrary │ └── Core │ └── TCA (SPM) │ └── Draw │ └── Core │ Test App Pod └── DrawCardAdapter-pod │ └── CardAdapter-pod │ └── CardLibrary-pod │ └── Core-pod │ └── TCA (SPM) │ └── Draw-pod │ └── Core-pod Once again, it's only targets, every project would look like CardAdapter └── CardAdapter └── CardAdapter-pod It continues to use local targets, except for the DrawCardAdapter-pod that actually loads Draw and Core from a Podfile instead of using the lkocal frameworks. But now for the part that fails : even though TestApp-pod does not link any local frameworks, I get a warning Multiple targets match implicit dependency for product reference 'Draw.framework'. Consider adding an explicit dependency on the intended target to resolve this ambiguity. And actually, Xcode ends up packaging the wrong framework. I can check it but showing in the app the Draw framework version, and it's always the local one, not the one specified in the podfile. For the record, I get this message for all 3 frameworks of course. I tried sooooo many things, that did not work of course: renaming the -pod frameworks so that the names are different (I had to rename all imports too). It works for all local frameworks (Lilbrary and Adapter basically), but not for Draw and Core (since I don't have -podversions of thoses framewoks of course). Creating a new local workspace that only handles -pod versions. Does not work since as we work as a team, I have to keep the shared schemes, and all workspaces see all targets and schemes. I also tried with a separate derived data folder, but I end up with some compilation issues. It seems that mixing local, cocoapod and spm dependencies inside the same workspace is not well handled) using explicit Target Dependenciesfrom the build phase. I end up with some compilation issues creating local podspecs for Library and Adapter. It fails because TCA is linked with SPM and apparently not copied when using podspecs. To the few ones that stayed so far, thanks for your patience :D I hope that @eskimo will drop by as you always were my savior in the end :D :D
1
1
107
May ’25
Mac OS Sequoia keeps crashing at start
Hi! I wanted to have a look at how my app behaves on the Sequoia OS, but for some reason, I keeps crashing at start after the login. The screen freezes, I get a pink (?) screen, and it reboots. I can't use boot modes, none of them seems to work. I event tried to connect my BT keyboard to the iMac with a USB cable, same behavior : none of the start up keeps seems to respond :-/ Any idea on how can I fix this or at least, restore the time machine save ? Thanks!
11
5
4.4k
Jul ’24
Dynamically resize Annotation's callout
Hi,I've got annotations on a MKMapView and I added a custom view inside the detailCalloutAccessoryView. This custom view performs a request and should present various amount of data depending on the request's reply. Basically, I can show 1 or 2 rows of data.Sometimes, when I touch an annotation and the result is only one row, the callout is not resized. However, if I dimiss the annotation and select it once again, it is rendered correctly.What is the "right" way to make it work? Using a intrinsicContentSize, or calling layoutIfNeeded (already tried, did not work)Thanks for your help.
1
0
1.2k
Oct ’23
PhaseAnimator on presented View crashes the app
Hi I'm trying to use the new PhaseAnimator from iOS 17 and I noticed a bug. For some reason, the animation is not deallocated when the view is removed from hierarchy, leading to a crash app. Example enum OuterBreathState: CaseIterable { case exhale, inhale var scale: CGFloat { switch self { case .inhale: return 2 case .exhale: return 1 } } var color: Color { switch self { case .inhale: return .white case .exhale: return .blue } } } struct PhaseView: View { var body: some View { PhaseAnimator(OuterBreathState.allCases) { state in Circle() .background(.clear) .frame(width: 150, height: 150) .padding(.vertical) .scaleEffect(state.scale) .background(in: Circle()) .foregroundStyle(state.color) } animation: {state in switch state { case .inhale: return .easeInOut(duration: 1.5) case .exhale: return .easeInOut(duration: 3.5) } } } } struct ContentView: View { var body: some View { NavigationStack { NavigationLink("push") { PhaseView() } } } } Pushing the view works just fine, but after popping, the app becomes unresponsive 😓 It's the content update that fails actually. If I make no updates to the Circle, everything works fine. I also tried with the phaseAnimator trailing function, I get the same behaviour. Interesting fact : if I use a trigger (and even a timer that flips that trigger to mimic the infinite loop), it does not crash the app. Here is the code enum OuterBreathState: CaseIterable { case exhale, inhale var scale: CGFloat { switch self { case .inhale: return 2 case .exhale: return 1 } } var color: Color { switch self { case .inhale: return .white case .exhale: return .blue } } } struct PhaseView: View { @State var animate = false let timer = Timer.publish(every: 5, tolerance: .zero, on: .main, in: .default).autoconnect() var body: some View { PhaseAnimator(OuterBreathState.allCases, trigger: animate) { state in Circle() .background(.clear) .frame(width: 150, height: 150) .padding(.vertical) .scaleEffect(state.scale) .background(in: Circle()) .foregroundStyle(state.color) } animation: {state in switch state { case .inhale: return .easeInOut(duration: 1.5) case .exhale: return .easeInOut(duration: 3.5) } } .onReceive(timer, perform: { _ in animate.toggle() }) .onTapGesture { animate.toggle() } } } struct ContentView: View { var body: some View { NavigationStack { NavigationLink("push") { PhaseView() } } } } #Preview { ContentView() } Any idea why it crashes and how I can make it work ? Thanks!
7
2
1.3k
Sep ’23
[NSBundle mainBundle] returns same path as [NSBundle bundleForClass: [self class]] in framework
Hi ;-) I develop a framwork along with a testApp that both belongs to the same workspace. I added a file to my framework, it is in the Copy Ressources part of the Build Phases, I double checked the name, no issues here. I want to load this file using pretty straightforward code using [NSBundle bundleForClass: [self class]] as follows   NSBundle *bundle = [NSBundle bundleForClass: [self class]];   NSString *jsonPath = [bundle pathForResource:@"deviceSafeAreas" ofType:nil]; It always returns nil. The strange part is that if I print the bundlePath iVar, I get the same path for both [NSBundle mainBundle] and [NSBundle bundleForClass: [self class]]. I even tried to "force" the [self class] into [MyClass class], but I get the same result. If I inspect the derivedData, the file is present at the root of the framework This folder is inside ~/Library/Developer/Xcode/DerivedData/XXXXXX/Build/Products/Debug-iphonesimulator My guess is that since I do not really embeed the framework, but use it from the workspace, xcode messes things up and is not able to properly get the framework's bundle, mbut I may be wrong. Any help would be appreciated. thanks.
1
1
1.2k
Oct ’22
SafeAreas for both orientation before adding a view to the hierarchy
Hi everyone, For various optimization purposes, I want to get the device's max display size without the safe areas for both portrait and lanscape. I can use the UIWindow's safeAreaInsets, but that only gives me the current safe areas, not the one for opposite layout (assuming there is only portrait and landscape). I had a look at UITraitCollections (I really thought I could achieve it with it), but it seems like a dead end. Anyone can help me with that ? Thanks!
Topic: UI Frameworks SubTopic: UIKit Tags:
6
0
1.7k
Oct ’22
Determine which swift version is available (if so) from framework
Hi all :-) Very specific question today : I work for a company that produces an objC framework to many many clients and we want to know if we can update our framework to swift. To do so, we want to know if the framework is incorporated to pure objC projects or swift ones (depending on the version) I tried to search, but I can't find any clue on how to check this. If I incorporate a Swift file to our framework, objC only clients will see their compilation fail. I looked for .swiftinterface file w/o any luck too. Is there any way (even indirect with some preproc conditions and scripts) that can allow me to retrieve if our framework is used with a Swift project (or not) and if yes, which version of swift is used by our clients. Thanks for your help!
2
0
2.2k
Oct ’22
Localizing XCAsset images in a swift package
Hi all ;-) I'm using SPM to create various libraries. So far, I only had to localize strings, so I added a Resources folder, some .lproj data and a defaultLocalization in my Package.swift file. Now I'd like to localize some images in the XCAsset catalog, but when I click on "localize" on my image, the only localization that is proposed is the defaultLocalization from my Package.swift file (if I change "en" to "fr", I now get a "French" localize option, but English has gone). How can I make Xcode aware of the supported localization inside my package ? Thanks.
1
0
1.3k
Feb ’22
Save tracks from AudioEngine to file
Hi all, I'm using AVAudioEngine to play multiple nodes at various times (like GarageBand for example). So far I managed to play the various files at the right time using this code : DispatchQueue.global(qos: .background).async {             AudioManager.instance.audioEngine.attach(AudioManager.instance.mixer)             AudioManager.instance.audioEngine.connect(AudioManager.instance.mixer, to: AudioManager.instance.audioEngine.outputNode, format: nil)           // !important - start the engine *before* setting up the player nodes           try! AudioManager.instance.audioEngine.start()                      for audioFile in data {             // Create and attach the audioPlayer node for this file             let audioPlayer = AVAudioPlayerNode()             AudioManager.instance.audioEngine.attach(audioPlayer)             AudioManager.instance.nodes.append(audioPlayer)             // Notice the output is the mixer in this case             AudioManager.instance.audioEngine.connect(audioPlayer, to: AudioManager.instance.mixer, format: nil)             let fileUrl = audioFile.audio.fileUrl             if let file : AVAudioFile = try? AVAudioFile.init(forReading: fileUrl) {                 let time = audioFile.start > 0 ? AudioManager.instance.secondsToAVAudioTime(hostTime: mach_absolute_time(), time: Double(audioFile.start / CGFloat.secondsToPoints)) : nil                 audioPlayer.scheduleFile(file, at: time, completionHandler: nil)                 audioPlayer.play(at: time)             }           }         } Basically my data object contains struct that have a reference to an audio fileURL and the startPosition at which it should begin. That works great. now I would like to export all these tracks mixed into a single file and save it to the Document's directory of the user. How can I achieve this? Thanks for your help.
4
0
2.5k
Dec ’21
What happens during a change language under the hood ?
Hi all ;-) I'm working on a library that crashes if the user stresses the iPhone with many language changes. Weird because this lib has no UI (and no localisable content) but heavily relies on the Keychain and disk writing. I was wondering if some Apple engineer can give me some information about what happens in iOS when a language change is triggered, so that I can find a clue of what's going on. Thanks
0
0
541
Nov ’21
Xcode SPM update multiple errors
Hi everyone ;-) I use SPM for quite a while now, but it's been a week now since I started having refresh and checking out issues. It's either "the SSL certificate is not valid" or an unknown error occured". Sometimes, after trying and trying, the SPM update or version check succeeds, but it's a real pain the a**. Before, I did not have so many issues. Is there something wrong with GitHub or Xcode theses days ? For the record, I'm working on 2 projects that have common packages, and it seems that Xcode does not handle that very well, especially when I drag n drop a package onto my project to use it as a local package. Thanks for your help
2
0
1.5k
Apr ’21
App crashes at start under iOS 13.x, runs fine with iOS 14
Hi everyone ;-) Weird behavior here. I develop an app that works fine under iOS 14.x (any subversion). It's a classic storyboard/swift app. It is supposed to be compatible with iOS 13.x devices but when I launch it, I get a crash right away, no crash log, no report, and not in a method or class that I developed :-/ It seems that I tries to load a SwiftUI object (State object) and doesn't find it, which is pretty logical. Th thing is : I don't use SwiftUI in my code (besides maybe the SceneDelegate ? ) Here is the only data I can gather dyld: Symbol not found: _$s7SwiftUI11StateObjectVMn Referenced from: /Users/gg/Library/Developer/CoreSimulator/Devices/9EADF5C5-D5E6-46F8-8A99-98801D5F67FD/data/Containers/Bundle/Application/C9272BF0-688C-4DA4-8799-B9E335155905/taxi.Chauffeur.app/taxi.Chauffeur Expected in: /System/Library/Frameworks/SwiftUI.framework/SwiftUI in /Users/gg/Library/Developer/CoreSimulator/Devices/9EADF5C5-D5E6-46F8-8A99-98801D5F67FD/data/Containers/Bundle/Application/C9272BF0-688C-4DA4-8799-B9E335155905/taxi.Chauffeur.app/taxi.Chauffeur dyld: launch, loading dependent libraries DYLD_SHARED_CACHE_DIR=/Users/gg/Library/Developer/CoreSimulator/Caches/dyld/20D91/com.apple.CoreSimulator.SimRuntime.iOS-13-7.17H22 DYLD_ROOT_PATH=/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 13.7.simruntime/Contents/Resources/RuntimeRoot DYLD_LIBRARY_PATH=/Users/gg/Library/Developer/Xcode/DerivedData/taxi.Chauffeur-ceaclbvdpopdwqdodbmzcecwohzz/Build/Products/Debug-iphonesimulator:/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 13.7.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/introspection DYLD_INSERT_LIBRARIES=/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 13.7.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libBacktraceRecording.dylib:/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 13.7.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libMainThreadChecker.dylib:/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 13.7.simruntime/Contents/Resources/RuntimeRoot/Developer/Library/PrivateFrameworks/DTDDISupport.framewor Any help would be most appreciated. Thanks.
5
0
3.3k
Mar ’21
Debug Widget Timeline and refresh
Hi, pretty dumb question, but how can we debug a widget, especially a TimelineProvider ? I added breakpoints, print statements, it seems that I never refresh my Widget :-/ When a user adds some content in my app, I save the data to a shared UserDefauls as follows func save() {         let encoder = JSONEncoder()         if let data = try? encoder.encode(self) {             UserDefaults.group.set(data, forKey: "lastPost")             UserDefaults.group.synchronize()             WidgetCenter.shared.getCurrentConfigurations { (result) in                 guard case .success(let widgets) = result else { return }                 widgets.forEach { widget in                     WidgetCenter.shared.reloadTimelines(ofKind: widget.kind)                 }             }         }     } Here is my TimeLineProvider struct Provider: TimelineProvider {     @AppStorage("lastPost", store: UserDefaults(suiteName: "group.com.kaiman.apps")) var currentModelData: Data?     var currentModel: ExtensionSharedModel? {         guard let data = currentModelData else { return nil }         return ExtensionSharedModel.retrieve(from: data)     }        func placeholder(in context: Context) -> WidgetModelEntry {         print("🏵 placeholder")         return WidgetModelEntry(date: Date())     }     func getSnapshot(in context: Context, completion: @escaping (WidgetModelEntry) -> ()) {         print("🏵 getSnapshot")         let currentDate = Date()         if let model = currentModel, model.date.isToday {             print("🏵 add model \(model.displayName)")             completion(WidgetModelEntry(date: currentDate, model: model))         } else {             print("🏵 no models to add...")             completion(WidgetModelEntry(date: currentDate))         }     }     func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {         print("🏵 getTimeline")         var entries: [WidgetModelEntry] = []         // Generate a timeline consisting of five entries an hour apart, starting from the current date.         let currentDate = Date()         if let model = currentModel, model.date.isToday {             print("🏵 add model \(model.displayName)")             entries = [WidgetModelEntry(date: currentDate, model: model),                        WidgetModelEntry(date: currentDate.dateAtEndOf(.day), model: model)]         } else {             print("🏵 no models to add...")             entries = [WidgetModelEntry(date: currentDate.dateAtEndOf(.day))]         }         let timeline = Timeline(entries: entries, policy: .atEnd)         completion(timeline)     } } I can't see what am I doing wrong :-/ I do enter in the WidgetCenter.shared.reloadTimelines(ofKind: widget.kind) , the data is saved to the shared UD. Thanks for your help
6
0
5.6k
Feb ’21
UIMotionEffect totally broken in 14.4 (worked before though)
Hi guys, It's been a long since I used a pretty neat code that slightly animates some shadows to give life to my apps. func addShadowMotion() {         let horizontalEffect = UIInterpolatingMotionEffect(             keyPath: "layer.shadowOffset.width",             type: .tiltAlongHorizontalAxis)         horizontalEffect.minimumRelativeValue = 16         horizontalEffect.maximumRelativeValue = -16                  let verticalEffect = UIInterpolatingMotionEffect(             keyPath: "layer.shadowOffset.height",             type: .tiltAlongVerticalAxis)         verticalEffect.minimumRelativeValue = 16         verticalEffect.maximumRelativeValue = -16                  let effectGroup = UIMotionEffectGroup()         effectGroup.motionEffects = [ horizontalEffect,                                       verticalEffect ]                  addMotionEffect(effectGroup)     } As stipulated, it worked fine until the last iOS update. Now, the shadow move half the screen as you can see :-/ Any ideas ? Thanks. Image link: (remove the extra space) https ://ibb.co/prMz6Tg
0
0
651
Feb ’21
Getting Bluetooth state after reconnection : weird issue
Hi everyone ;-) I'm currently developing an app that is synced to a BT device. This BT device has 2 states (let's say ON and OFF though it is still powered on, like a bulb). When I connect to the peripheral, I get 2 characteristics : a write and a read characteristic. In order to retrieve the current state, I have to send a write frame that basically ask the peripheral to give me its current state. As a response, I get a frame that contains the current peripheral state. If I connect to the peripheral, ask the state (ON for instance), I receive ON. I turn the peripheral OFF, I receive OFF. Now I kill my app and launch it again. The app will reconnect to the peripheral, ask the current state. The response is OFF. So far so good.... I can keep on changing the peripheral state, I always retrieve the last state of the peripheral when I relaunch the app. Now for the weird part : I do exactly the same operations, but before launching my app, I switch again the peripheral state (in the above example, it would now be ON). I launch the app, send a write frame to the peripheral, and the response is ... OFF. One could argue that it is a peripheral issue, but fellow colleagues on Android do not have this bug, so I guess it's on my side. Just for the record, here are my BT implementation, which is pretty straightforward. extension BluetoothManager: CBPeripheralDelegate {         func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {         log("didDiscoverCharacteristicsFor \(service)")         if let characteristics = service.characteristics {             for characteristic in characteristics {                 if let chara = ATACharacteristics.from(characteristic) {                     switch chara {                     case .write:                         log("write  ATACharacteristics\(characteristic)")                         peripheral.setNotifyValue(true, for: characteristic)                         self.characteristics.append(chara)                         readStateFromBox(characteristic)                                              case .read:                         log("read  ATACharacteristics\(characteristic)")                         self.characteristics.append(chara)                                              case .nus: ()                     }                 }             }         }     }       func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {         log("didUpdateValueFor \(characteristic)")         if let data = characteristic.value,            let validator = try? ATAFrameDecoder().decode(data) as? LuminousStatusFrameValidator {             log("   data \(data as NSData)")             updateState(from: validator)         }     }     func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {         log("didWriteValueFor \(characteristic)")         if let data = characteristic.value,            let validator = try? ATAFrameDecoder().decode(data) as? LuminousStatusFrameValidator  {             log("   data \(data as NSData)")             updateState(from: validator)         }     } } Here are although the logs for both scenarios. When receiving the didWrite frame, if I get a "00" after "02a00461" it means ON, if I get a "fe", it means OFF First the good one : 📲 centralManagerDidUpdateState poweredOn 📲 didDiscoverServices <CBPeripheral: 0x281508000, identifier = A274CD79-938C-CAEF-2CE7-D20CB5B6961F, name = ATA-000008, state = connected> 📲 didDiscoverCharacteristicsFor <CBService: 0x2831a5280, isPrimary = YES, UUID = 6E400001-B5A3-F393-E0A9-E50E24DCCA9E> 📲 read&#9;ATACharacteristics<CBCharacteristic: 0x280006100, UUID = 6E400002-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0xC, value = (null), notifying = NO> 📲 write&#9;ATACharacteristics<CBCharacteristic: 0x2800044e0, UUID = 6E400003-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x10, value = {length = 13, bytes = 0x02a00461fe0000000000122903}, notifying = NO> 📲 readStateFromBox {length = 9, bytes = 0x02a50000000001a603} for <CBCharacteristic: 0x2800044e0, UUID = 6E400003-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x10, value = {length = 13, bytes = 0x02a00461fe0000000000122903}, notifying = NO> 📲 didUpdateNotificationStateFor <CBCharacteristic: 0x2800044e0, UUID = 6E400003-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x10, value = {length = 13, bytes = 0x02a00461fe0000000000122903}, notifying = YES> 📲 didWriteValueFor <CBCharacteristic: 0x2800044e0, UUID = 6E400003-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x10, value = {length = 13, bytes = 0x02a00461fe0000000000122903}, notifying = YES> 📲&#9;&#9;data {length = 13, bytes = 0x02a00461fe0000000000122903} 📲 updateState occupied 📲 acknowledge {length = 9, bytes = 0x0206a000000003a703} for Optional(<CBCharacteristic: 0x2800044e0, UUID = 6E400003-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x10, value = {length = 13, bytes = 0x02a00461fe0000000000122903}, notifying = YES>) and then the bug 📲 centralManagerDidUpdateState poweredOn 📲 didDiscoverServices <CBPeripheral: 0x2839885a0, identifier = A274CD79-938C-CAEF-2CE7-D20CB5B6961F, name = ATA-000008, state = connected> 📲 didDiscoverCharacteristicsFor <CBService: 0x281dd5100, isPrimary = YES, UUID = 6E400001-B5A3-F393-E0A9-E50E24DCCA9E> 📲 read&#9;ATACharacteristics<CBCharacteristic: 0x282c88300, UUID = 6E400002-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0xC, value = (null), notifying = NO> 📲 write&#9;ATACharacteristics<CBCharacteristic: 0x282c881e0, UUID = 6E400003-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x10, value = {length = 13, bytes = 0x02a0046100000000000013d603}, notifying = NO> 📲 readStateFromBox {length = 9, bytes = 0x02a50000000001a603} for <CBCharacteristic: 0x282c881e0, UUID = 6E400003-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x10, value = {length = 13, bytes = 0x02a0046100000000000013d603}, notifying = NO> 📲 didUpdateNotificationStateFor <CBCharacteristic: 0x282c881e0, UUID = 6E400003-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x10, value = {length = 13, bytes = 0x02a0046100000000000013d603}, notifying = YES> 📲 didWriteValueFor <CBCharacteristic: 0x282c881e0, UUID = 6E400003-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x10, value = {length = 13, bytes = 0x02a0046100000000000013d603}, notifying = YES> 📲&#9;&#9;data {length = 13, bytes = 0x02a0046100000000000013d603} 📲 updateState free 📲 acknowledge {length = 9, bytes = 0x0206a000000003a703} for Optional(<CBCharacteristic: 0x282c881e0, UUID = 6E400003-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x10, value = {length = 13, bytes = 0x02a0046100000000000013d603}, notifying = YES>) Is there some kind of cache on BT exchanges ? I don't know why it reacts like that. Thanks for your help.
0
0
689
Jan ’21