Jump to content

Rollo62

Members
  • Content Count

    1812
  • Joined

  • Last visited

  • Days Won

    23

Everything posted by Rollo62

  1. Hi there, I'm checking in iOS (and later for Android, Windows, etc.), what is the best, right way to Sleep in a background mode of the OS. The implementation for iOS seems to be same, as Posix, for iOS, Android, Macos, but I didn't checked that. My goal is to stop any OS operation in the background mode, to avoid killed apps by the OS. While the Thead loop is still active, but only throttled. TThread.Sleep - uses usleep, which is external function, as far as I know based on nanosleep - is this really affecting the current thread only ? class procedure TThread.Sleep(Timeout: Integer); begin {$IF Defined(MSWINDOWS)} Winapi.Windows.Sleep(Timeout); {$ELSEIF Defined(POSIX)} usleep(Timeout * 1000); {$ENDIF POSIX} end; System.SysUtils.Sleep - is bascially same {$IFDEF MSWINDOWS} procedure Sleep; external kernel32 name 'Sleep'; stdcall; {$ENDIF MSWINDOWS} {$IFDEF POSIX} procedure Sleep(milliseconds: Cardinal); begin usleep(milliseconds * 1000); // usleep is in microseconds end; {$ENDIF POSIX} System.SyncObjs.TEvent.WaitFor - is defintively based differently - uses a sem_timedwait (here and here also) - this probably waits by counting in a semaphore, so its not a "real" sleep of the OS, right ? Shall I better use Sleep or TEvent.WaitFor, to let threads sleep in the OS, while avoiding too many wakeups and operations in the background ? Is TEvent.WaitFor really sleeping, from a iOS OS perspective, or will it be seen as running app ? What I assumed before is that TThread.Sleep really stops the thread, and passes back CPU operation to other tasks, but I'm not so sure anymore under IOS.
  2. @Remy Lebeau You are talking about Android, thats all true. But my question was especially regarding iOS, where things are very much different. https://stackoverflow.com/questions/11044095/ios-keep-an-app-running-like-a-service The background mode in iOS can be kept active only by those few background modes available, like Audio, Bluetooth, Location, etc. My goal is too keep some background activity, like a alarm timer, if none of the above is active. If the timer has ended, then a special alarm tone and speech might occur, together with a local notification. I do use timed local notifications, to wake up the system right now, but the Tts and audio works not always reliable. The most reliable way to keep threads running so far I found is the Bluetooth-periperial background mode, where the app itself may act as BLE device, also in background. That may keep iOS active, but if you never need that "peripheral", only to keep it up, then Apple will ask you to show and explain where you need this mode probably. I think a possible way would be to introduce some "function", that can be shown, but may never be used in practice.
  3. The interesting thing is that it sometimes work, and sometimes not. I will do some more tests if MediaPlayer might allow longer background task, technically its working fine. In other apps I can use other background modes to keep awake, so its under some conditions possible to get around special service on iOS, but still I don't see the full picture.
  4. Hi there, I was trying to extend the iOSapi_AVFoundation.pas module, by adding the following function to the AVAudioSession function setCategoryWithOptionsError( category: NSString; withOptions : AVAudioSessionCategoryOptions; error: NSError): Boolean; cdecl; Unfortunately its crashing with an object is nil error, what do I miss here ? I make a local copy of the unit, and the following additions: uses ... const AVAudioSessionCategoryOptionDuckOthers = 2; //S4: add 14.05.20 ... type AVAudioSessionCategoryOptions = NSUInteger; //S4: add 14.05.20 AVAudioSessionClass = interface(NSObjectClass) ['{B24932F9-3C98-44E4-A4F6-0CB58AF7DE8A}'] //S4: 14.05.20 new GUID {class} function sharedInstance: Pointer; cdecl; end; AVAudioSession = interface(NSObject) ['{0B02D5EC-ED09-421A-84BE-6CEE08420E14}'] //S4: 14.05.20 new GUID ... //S4: Addition 14.05.20, the new function I need //[MethodName('setCategory:withOptions:error:')] function setCategoryWithOptionsError( category: NSString; withOptions : AVAudioSessionCategoryOptions; error: NSError): Boolean; cdecl; ... end. This is derived from the function in the Apple reference https://developer.apple.com/documentation/avfoundation/avaudiosession/1616442-setcategory Could be looking in Objective-C like this AVAudioSessionCategoryOptions AVAudioSessionCategoryOptionsNone = 0; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionsNone error:nil]; I want to call it like this LAVAudioSession := TAVAudioSession.Wrap( TAVAudioSession.OCClass.sharedInstance ); //<-- This is original method, it still can be called without exception LRes := LAVAudioSession.setCategory( AVAudioSessionCategoryPlayback, LError); //<-- This is the new method, crash with exception LRes := LAVAudioSession.setCategoryWithOptionsError( AVAudioSessionCategoryPlayback, AVAudioSessionCategoryOptionDuckOthers, LError); Do I have a stupid typo somewhere ? Can the two modules not coexist, because the old one is linked somewhere else ? Shall I use different GUID for the interfaces, or keep the same, to allow static links to find them ? Is the new method not yet in the Rx10.3.3 libraries, but I updated to latest SDK 13.4.1, they should be in there and FMX able to resolve it ? Does the module need to be initialized somehow ? Is there something missing what is needed for correct linkage ? Maybe its too late already, or I'm to blind to see.
  5. A right. I even hat that in my code in the first place, but stupid me commented that out. So I will try again.
  6. Rollo62

    Rx10.4 new feature blogs

    Well sorry Dave, I added that too. Regarding the special permission, and that htis was done in the past, thats all true. But I have the gut feeling that I see more responses these days than in the last 5-6 new releases, maybe I'm wrong, never counted that
  7. Rollo62

    Rx10.4 new feature blogs

    @Dany Marmur Sorry, I was over overexcited now its getting better .... Pfffffffffffff
  8. I have done some experiments, and see that background mode behaves a little tricky. See the little iOS test enclosed. Its missing the wonderful Grijjy TestToSpeech library, available here. Just copy all .pas files into the .dproj folder. And in the _Assets\Sounds folder you can put the downloaded Codex_Machine_-_02_-_Controlled_Relaxation.mp3 file from here. Sorry for the German texts, manby that sound fuzzy in other languages, its a poem from Paul Fleming 05.10.1609. The demo: 1.) When pressing the "Speak" button it start an infinite thread, with Sleep( 3000 ), counting and speaking the numbers. 2.) In foreground no problem, but in background the thread get stopped 3.) Back in foreground, the suspended thread resumes as it should 4.) Press "Stop" to leave the thread loop 5. ) Start long lasting spoken text, or the long playing music, by pressing "Speak long" and/or "Music long" 6.) You can move into background mode, it don't stop playing, as desired 7. ) When back in FG, you can add the "Speak" counter, and all text + musik is playing nicely together 8.) Put into background, also the thread loop with the Sleep is not still counting, that is the desired behavior. What I'm looking for is a background thread, which seems to stay active under some special conditions (either BLuetooth, Location can keep BG awake, as seen above also permanent Audio-Play can keep it awake). You can try 09.) Restart the app 10.) Play musik and/or "Speak" counter 11.) Enter background 12.) Stop music 13.) Start "Speak" counter 14.) Enter background 15.) "Speak" counter will stop, if no music is running parallel 16.) Restart the app 17.) Play musik and/or "Speak" counter 18.) Enter background 12.) Wait until the music finished (Ok takes a while, but you can use shorter .mp3 maybe) 13.) "Speak" counter is still active 14.) Enter background 15.) "Speak" counter is still active 16.) Enter foreground 17.) "Speak" counter is still active 18.) Enter background 19.) "Speak" counter is still active 20.) It seems the MediaPlayer changed the AVAudioSession awake somehow, so that is can keep the thread loop active What I have noticed: If I play music plus the "Speak", then even after music has stopped the speech contrinues !!! That is probably because the MediaPlayer opens a AVAudioSession, but didn't close it, so maybe an open session is enough to keep BG alive. But also I noticed that this sometimes works, sometimes not, timing and sequence seems very important too. Are there any signals that could keep the thread awake in background, if I don't have BLE or Location active ? Some people from iOS propose to play "Silence.mp3" sound for > 500ms, but that would be a hard way, and probably against Apple restrictions. Are there any more tricks how to that behaviour (active thread in BG, with Sleep) could be achieved reliably ? T345_BG_AudioTest.zip
  9. Rollo62

    Rx10.4 new feature blogs

    I see light in the tunnel .... this is one small step for a man - one giant leap for mankind
  10. Here is something for FPC, but quite old. https://github.com/ObjectUp/CrossRoads/blob/master/CrossRoads_DelphiVER280_Port/LSNLibrary/unLSNSound.pas I'm not sure if and how binding FPC solution into Delphi makes sense, probable the iOS bridges were too different, but since the first version of FMX based on this I still have hope that there is a second way.
  11. @Dave Nottage Or did I misunderstand your post, and you say this is currently under 10.3.3 NOT usable, even with the proposals you gave, because Objective-C bridge cannot handle it yet ? That would be the worst case, I need that urgently, my customers already ask why can't we do what other apps can do. I monitor the changes in all Delphi iOSApi and AndroidApi units since the last 5 or 6 versions, so far never changed anything since years, only copyright year is eagerly updated. My hope is that all the available system interfaces might get linked to FMX units soon. Is there maybe a helpful unit from the FPC community, at least this didn't jump in my eye yet ? Any solution welcome, to configure background and foreground audio.
  12. Rollo62

    Return background to foreground

    @Sherlock But this is also sending a notification, and the user must open the notification to start the app, right ? I think the process on the phone is quite similar from local and remote notification. Or is there any possibility to replace the default notification with lets say a more prominent view/launcher via remote notifications ?
  13. A yes, great. So I better check the c headers from now on, instead of Apple Docs. Every time I see a NSError now I will have to replace it bei PPointer, what a mess Then there were many wrong entries in the unit, I only wonder why this seems to work with setCategory, at least I get no exceptions. Unfortunately it still doesn't run without exception, and I think I've tried all optiions, see alternatives (A) to (C) and (1) to (5), I've tried most combinations with same result. When I don't use local copy with different name iOSapi_AVFoundation_Ex I do get compiler errors in FMX.Media.iOS, seems that one uses the original unit, and cannot work with my local copy. Thats why I used a different unit name, that also is working for other iOS units before. unit iOSapi_AVFoundation_Ex; //<-- local copy, with extensions and changed GUID var LAVAudioSession : AVAudioSession; LError : NSError; LRes : Boolean; (A) as PPointer, called by @LPError (B) as PPointer, called by LPError (although this makes not much sense) //LPError : PPointer; (C) as Pointer, called by @LPError LPError : Pointer; begin LAVAudioSession := TAVAudioSession.Wrap( TAVAudioSession.OCClass.sharedInstance ); // (1) this works as far as I can say, at least never see exceptions I can say LRes := LAVAudioSession.setCategory( AVAudioSessionCategoryPlayback, LError); // (2) first approach, throws exception LRes := LAVAudioSession.setCategoryWithOptionsError( AVAudioSessionCategoryPlayback, AVAudioSessionCategoryOptionDuckOthers, LError); // (3) Dave's proposal // Because the corresponding declaration in Objective-C is: // - (BOOL)setCategory:(AVAudioSessionCategory)category error:(NSError **)outError //PPointer = ^Pointer; {$NODEFINE PPointer} { defined in sysmac.h } //NSError = interface; // (A), (B) set to nil before LPError := nil; //<-- this always shows same crash, no matter what (A),(B),(C), (2)-(5) LRes := LAVAudioSession.setCategoryWithOptionsError( // (4a) this alternative both version should be identical -> get from string //CocoaNSStringConst(libAVFoundation, 'AVAudioSessionCategoryPlayback'), // (4b) this alternative get from dedicated function, doing same as above //AVAudioSessionCategoryPlayback, // (4c) this alternative from Dave's original proposal, using different mode CocoaNSStringConst(libAVFoundation, 'AVAudioSessionCategoryPlayAndRecord'), // (5a) this alternative is a simple integer constant 0x2, defined as const = 2 AVAudioSessionCategoryOptionDuckOthers, // 2 // (5b) this alternative also crashes same //2, // (5c) this alternative from Dave's original proposal, using different option 0, @LPError); if LPError <> nil then begin LError := TNSError.Wrap(LPError); end; if not LRes or (LError <> nil) then begin // Something wrong end;
  14. @Dave Nottage Thanks for the correction, I will check this out. What I really dont understand why this should be different. There is a prototype in the iOSapi_Foundation.pas file already, the setCategory function setCategory(theCategory: NSString; error: NSError): Boolean; cdecl; It uses the error: NSError type I simply tried to copy that, and extent to function setCategoryWithOptionsError( category: NSString; withOptions : AVAudioSessionCategoryOptions; error: NSError): Boolean; cdecl; Why should it be error: PPointer, right now ? function setCategoryWithOptionsError(category: NSString; withOptions: AVAudioSessionCategoryOptions; error: PPointer): Boolean; cdecl; Also the FmxExpress header conversions from @Eli M. shows it with special NSError type. Edit: NSError is defined in iOSap_Foundation as interface PPointer ist jus a pointer to pointer in System NSError = interface(NSObject) ['{8E8F832A-5F75-4F65-A18B-5A8E2F49A867}'] function code: NSInteger; cdecl; function domain: NSString; cdecl; function helpAnchor: NSString; cdecl; function initWithDomain(domain: NSString; code: NSInteger; userInfo: NSDictionary): Pointer; cdecl; function localizedDescription: NSString; cdecl; function localizedFailureReason: NSString; cdecl; function localizedRecoveryOptions: NSArray; cdecl; function localizedRecoverySuggestion: NSString; cdecl; function recoveryAttempter: Pointer; cdecl; function userInfo: NSDictionary; cdecl; end; ... PPointer = ^Pointer; {$NODEFINE PPointer} { defined in sysmac.h } How can the type of "error" change in one unit, is this another Apple-Magic ? And the original libraries from Apple seems to use similar types as well, here are all the variants. Why to use NSError in one, and PPointer in the other, I don't get that ? func setCategory(_ category: AVAudioSession.Category) throws func setCategory(_ category: AVAudioSession.Category, options: AVAudioSession.CategoryOptions = []) throws func setCategory(_ category: AVAudioSession.Category, mode: AVAudioSession.Mode, options: AVAudioSession.CategoryOptions = []) throws func setCategory(_ category: AVAudioSession.Category, mode: AVAudioSession.Mode, options: AVAudioSession.CategoryOptions = []) throws I call this as shown above, those are predefined function, to get the necessary string key constant. which is defined in iOSapi_Foundation function AVAudioSessionCategoryPlayback: NSString; in caller unit var LError : NSError; LRes := LAVAudioSession.setCategory( AVAudioSessionCategoryPlayback, LError); You should. I meant when I import make a local copy of the unit, which has hundrets or interfaces keeping untouched. Will it be enough to use different GUID only for those interfaces that have changed, not the ones that keep original ? Still then would be 2 references 8old unit, new unit) of units which may have same interface GUID. Do I have to change all the GUIDS in that local copy of the unit (that would be a little messy) ? No. I suggest filing a QP report. You mean feature request for the iOSapi_Foundation, right ? Its clear that the interface is missing in iOSapi_Foundation, but I was not sure if there is anything else might missing in the static libraries. Since I assume those are copied and get actually from the current system, this should always up to date. My understanding of the iOS-Delphi bridge is that SDK from current system is bounded via the interfaces to Delphi classes, or is there anything hidden inbetween that I haven't seen yet ?
  15. @Remy Lebeau Thanks for the clarification. But is there any possible negative effect on iOS/(Android) apps when running in background mode ? Are the apps more likely to be killed when using one or the other in a running thread loop ? I assume that TThread.Sleep should be safe in background mode, while TEvent.WaitFor is probably not the right choice, but I'm very unsure about that.
  16. Rollo62

    Programmatically Change Properties of a Custom style

    The styles data is not always accessible, better if you touch them only via the OnApplyStyleLookup event. At that time should be guaranteed that all presentation layers are created.
  17. I have analysed the crash report, see enclosed, which gives some hints. But I don't have threads that wakeup so frequently (I reduced the processing thread to 500ms, as said, by TThread.Sleep()) Maybe the reason could be the TextToSpeech thread, which is also in the stacklist, I have to check where this sits and what it does exaclty. Are there any known background issues with the TTS ? This looks to me like blocking something, trying to finish, while it cant. From above logs I have seen that TTS has launched (speechSynthesizerDidStartSpeechUtterance), but no sound and no EndOfSpeech event occurs (speechSynthesizerDidFinishSpeechUtterance). Probably somewhere inbetween sits the troublemaker. What else could cause so many wakeups, and what exaclty wakes up (Thread.Sleep) ? Maybe the Sleep method is not the best, I will try with TEvent. Stack.txt
  18. Rollo62

    Programmatically Change Properties of a Custom style

    You could try to simply add another rectangle on top of the CustomStyle Panel background in the StyleDesigner, with giving a new StyleName it should be accessible. Not tested in your case, but Ido similar things with other controls. As proposed above, try to use TRectangle instead of TPanel, or better even TLayout as base container for your other components.
  19. Rollo62

    Programmatically Change Properties of a Custom style

    The implementations can also vary between the different platforms. You cannot rely that one element is accessible in same way under all platforms. This is one of the biggest drawbacks of FMX styles IMHO.
  20. Some more tests regarding the missing background audio, it seems the TTS is started, but keeps silent. 11:23:16.355 (B) - TS4Log: AUD_P: TS4Measure_Tts.SpeakFree prepare: 7 11:23:16.356 (B) - TS4Log: AUD_P: TextToSpeechImplementation.SpeechRate_Set 100 11:23:16.356 (B) - TS4Log: AUD_P: TextToSpeechImplementation.Speak LUtterance.setRate 11:23:16.359 (B) - TS4Log: AUD_P: TextToSpeechImplementation.Speak BG granted 11:23:16.359 (B) - TS4Log: AUD_P: TS4App_Feature_TtsSpeak.Request_Background 11:23:16.360 (B) - TS4Log: AUD_P: <=== AUDIO_PLAY IOS SESSION ENABLE 11:23:16.360 (B) - TS4Log: AUD_P: <=== AUDIO_PLAY IOS SESSION AVAudioSession created --> The AVAudioSession is prepared for AVAudioSessionCategoryPlayback category and setActive( True ), without errors. 11:23:16.369 (B) - TS4Log: AUD_P: TS4App_Feature_TtsSpeak.Request_Background AV BG enabled 11:23:16.369 (B) - TS4Log: AUD_P: TextToSpeechImplementation.Speak BG granted 11:23:16.369 (B) - TS4Log: AUD_P: TextToSpeechImplementation.Conf_SpeechSynthesizer release 11:23:16.369 (B) - TS4Log: AUD_P: TextToSpeechImplementation.Conf_SpeechSynthesizer re-created 11:23:16.370 (B) - TS4Log: AUD_P: TextToSpeechImplementation.Speak set voice 11:23:16.371 (B) - TS4Log: AUD_P: TextToSpeechImplementation.Speak play (speakUtterance) 11:23:16.372 (B) - TS4Log: BLE_W: <==== BLE TTS BG_NOTE: 7 11:23:17.180 (B) - TS4Log: AUD_P: TextToSpeech speechSynthesizerDidStartSpeechUtterance --> This shows TTS is started, as the event has fired, but its still silent in BG
  21. @Dave Nottage Thanks for the comments, yes I also have considered the data rate. But I have many different test devices, so in this app I tested with about 2 sec., 12. sec., and a manual, transmit on demand device. I can say the data rate is not too fast, since a few bytes every 2 sec. shouldn't be a problem. If the data rate is too low, then this might cause problems. Although I think Aple should be happy with low data rate, as this is energy saving, and all longtime battery operated IoT try to do this. As I said before, I had found one article somewhere where they considered a too low data rate as problem, but there was no answer if yes or no. But I consider this as possible problem too. Even if I do trigger a short text.-to-speech output with every data reception, the app doesn't get killed earlier, I think its not an issue of too much data processing in the CPU. What I do with the data is, to decode it, to store it in an sqlite DB. I can even restart timers in the background during that processing (what I actually of course don't do). In the logs I can see that when data is received, the phones wakes up, and timer start running normally (I tested a 500ms cycle). Then after 5-10 sec. timers fall to sleep again, enough time to process my tasks. Interesting finding, but I don't use timers in the background. What I assume is that the app awakes with more or less normal features and performance, probably on a lower CPU task priority, but since I have no other apps running at the same time there should be no problem. These app killings happen already in testflight, and in debug, so before Apple is asking for a reason. When I add some unused background modes to keep apps running, as workaround, then Apple might ask for the reason I do require this, and I shall explain the functionality. In my last workaround Apple noted that I shouldn't put an unused background mode. So I've tried to remove that, but maybe I could explain to Apple that I need this to keep the app running in background ? Would they accept this, I think they don't but never checked that ? One possibility would be to invent a pseudo-function, which is not really needed in the app, but what I could show and explain to Apple as reason Edit: Another possibility beside the timings could be the ressources: I don't really clean up all available ressources, and since my app runs alone in a huge memory space, thats why I think iOS is likely not getting into an out-of-memory situation. Or did anybody has seen such crashes or other issues by not freeing memory ressources ? Did Delphi implements already some kind of freeing ressources when entering background, like clearing imagelists, etc. ? I'm afraid that is not done. Edit 2: The same app, 1:1, only with added bluetooth-peripheral background mode seems to keep the app active, and not get killed. This are the same findings as I had before, used as workaround, but I think this is against Apples requirements (unused BG mode), und will be likely to be rejected. This cannot be the right solution, although it seems to work, isn't there any other clean option ? Edit 3: Not quite ready with Edit 2, the app seems still active right now, also data is received in the logs, but the text-to-speech function isn't working in background any more (in foreground it still does). Only sometimes this do speak in background, but maybe this issue is something else, maybe still some timer issues I have to check with TTS.
  22. To illustrate the problem I want to show some log file, from the background mode //--> I'm starting BLE connection in foreground, the (F) shows when I'm in FG, the (B) means background 20:47:42.454 (F) - TS4Log: BLE_W: EvOnTimerProcess (2i) IsDiscoveringDev 20:47:42.962 (F) - TS4Log: BLE_W: <==== BLE DEVICE_READY 20:47:42.962 (F) - TS4Log: BLE_W: <==== BLE_MANAGER MEASURE: 1;t1;22;°C;1;12;t2;21;°C;1;2 //--> The BLE MEASURE means: a data package received from the IoT device. 20:47:42.963 (F) - TS4Log: BLE_W: <==== BLE DEVICE_ENTER 20:47:42.964 (F) - TS4Log: BLE_W: <==== BLE TTS BG_NOTE: 1 //--> The BLE TTS means: a test Tts speech output (saying "1") is launched, I can hear the TTS 20:47:44.406 (F) - TS4Log: BLE_W: EvOnTimerProcess (2i) IsDiscoveringDev 20:47:44.906 (F) - TS4Log: BLE_W: EvOnTimerProcess (2i) IsDiscoveringDev 20:47:45.407 (F) - TS4Log: BLE_W: EvOnTimerProcess (2i) IsDiscoveringDev 20:47:45.908 (F) - TS4Log: BLE_W: EvOnTimerProcess (2i) IsDiscoveringDev 20:47:46.408 (F) - TS4Log: BLE_W: EvOnTimerProcess (2i) IsDiscoveringDev 20:47:46.893 (F) - TS4Log: COMMN: <==== APP_EVENTS WillBecomeInactive 20:47:46.893 (F) - TS4Log: COMMN: <==== APP_EVENTS_WILL_BECOME_INACTIVE 20:47:46.893 (F) - TS4Log: BLE_W: TS4App_Feature_BLE.Request_Background (1) begin 20:47:46.893 (F) - TS4Log: BLE_W: TS4App_Feature_BLE.Request_Background (5) end 20:47:46.893 (F) - TS4Log: COMMN: TS4App_Feature_TtsSpeak.DoRefreshSettings: Background grant 20:47:46.893 (F) - TS4Log: COMMN: TS4App_Feature_TtsSpeak.DoRefreshSettings: Background granted 20:47:46.893 (F) - TS4Log: COMMN: TS4App_Feature_TtsSpeak.DoRefreshSettings: Background Audio request 20:47:46.894 (F) - TS4Log: COMMN: TS4App_Feature_TtsSpeak.DoRefreshSettings: Background Audio requested 20:47:47.557 (F) - TS4Log: BLE_W: <==== BLE_MANAGER MEASURE: 1;t1;22;°C;1;12;t2;21;°C;1;2 //--> The MEASURE means: a new data package arrived from the IoT device 20:47:47.558 (F) - TS4Log: BLE_W: <==== BLE TTS BG_NOTE: 2 //--> And the BLE TTS count the no. of received data packages (saying "2") is launched, I can hear the TTS 20:47:47.853 (F) - TS4Log: COMMN: <==== APP_EVENTS EnteredBackground --> From here the app is in in BG mode, see (B)ackground (Timers stopped, receive thread throttled, BLE still receiving) 20:47:47.853 (B) - TS4Log: COMMN: <==== APP_EVENTS_ENTERED_BACKGROUND 20:47:48.245 (B) - TS4Log: BLE_W: TS4App_Feature_BLE.Request_Background (2) permit 20:47:48.245 (B) - TS4Log: BLE_W: TS4App_Feature_BLE.Request_Background (3) OK 20:47:48.245 (B) - TS4Log: BLE_W: TS4App_Feature_BLE.Request_Background (1) begin 20:47:48.245 (B) - TS4Log: BLE_W: TS4App_Feature_BLE.Request_Background (5) end 20:47:52.057 (B) - TS4Log: BLE_W: <==== BLE_MANAGER MEASURE: 1;t1;22;°C;1;12;t2;21;°C;1;2 //--> The first BLE MEASURE in BG mode, all is OK 20:47:52.059 (B) - TS4Log: BLE_W: <==== BLE TTS BG_NOTE: 3 //--> The first BLE TTS in BG: (saying "3"), I can hear the TTS voice, all OK 20:47:56.617 (B) - TS4Log: BLE_W: <==== BLE_MANAGER MEASURE: 1;t1;22;°C;1;12;t2;21;°C;1;2 20:47:56.619 (B) - TS4Log: BLE_W: <==== BLE TTS BG_NOTE: 4 20:48:01.177 (B) - TS4Log: BLE_W: <==== BLE_MANAGER MEASURE: 1;t1;22;°C;1;12;t2;21;°C;1;2 20:48:01.179 (B) - TS4Log: BLE_W: <==== BLE TTS BG_NOTE: 5 20:48:05.737 (B) - TS4Log: BLE_W: <==== BLE_MANAGER MEASURE: 1;t1;22;°C;1;12;t2;21;°C;1;2 20:48:05.741 (B) - TS4Log: BLE_W: <==== BLE TTS BG_NOTE: 6 20:48:10.297 (B) - TS4Log: BLE_W: <==== BLE_MANAGER MEASURE: 1;t1;22;°C;1;12;t2;21;°C;1;2 20:48:10.300 (B) - TS4Log: BLE_W: <==== BLE TTS BG_NOTE: 7 20:48:14.857 (B) - TS4Log: BLE_W: <==== BLE_MANAGER MEASURE: 1;t1;22;°C;1;12;t2;21;°C;1;2 20:48:14.859 (B) - TS4Log: BLE_W: <==== BLE TTS BG_NOTE: 8 20:48:19.417 (B) - TS4Log: BLE_W: <==== BLE_MANAGER MEASURE: 1;t1;22;°C;1;12;t2;21;°C;1;2 20:48:19.419 (B) - TS4Log: BLE_W: <==== BLE TTS BG_NOTE: 9 20:48:23.977 (B) - TS4Log: BLE_W: <==== BLE_MANAGER MEASURE: 1;t1;22;°C;1;12;t2;21;°C;1;2 20:48:23.980 (B) - TS4Log: BLE_W: <==== BLE TTS BG_NOTE: 10 20:48:28.538 (B) - TS4Log: BLE_W: <==== BLE_MANAGER MEASURE: 1;t1;22;°C;1;12;t2;21;°C;1;2 20:48:28.539 (B) - TS4Log: BLE_W: <==== BLE TTS BG_NOTE: 11 20:48:33.098 (B) - TS4Log: BLE_W: <==== BLE_MANAGER MEASURE: 1;t1;22;°C;1;12;t2;21;°C;1;2 20:48:33.100 (B) - TS4Log: BLE_W: <==== BLE TTS BG_NOTE: 12 --> Here suddenly its killed by Apple, but why, why, WHY ??? --> What else can be the reason to get killed suddenly, while TTS and BLE work fin in FG and BG ? --> BTW: In foreground it may run until the battery is down, so its not a leak or something.
  23. Rollo62

    language updates in 10.4?

    @Darian Miller Thanks for the nice article, I also miss inline variables since C/C++. I'm only afraid of the many hidden traps the first implementation might step into, under all strange real life conditions . So probably I will try to use them only carefully step by step, not massively, in the first versions. It's a nice feature, but also I can still live without it, as I did so many years. More important to me is, can the debugger handle this, do I get strange error messages.
  24. Hi there, usually VmWare provides install procedure very nicely: download Macos installer .app from AppStore, then create new VM and drop it into. This works on some Mac, but seems not to work on all Mac's, for some reasons only Apple knows. I had such case with an older MacBook Pro, and wanted to describe the procedure below. After some search in the Web I found a nice article about same issue with Mojave, so I took this as base. Since I'M on Catalina, I had to make some changes. Here are the steps in compressed form: Create VmWare Macos guest from ISO (Catalina) Web : Search "Update Macos Catalina" (or the OS you'll want), to find the right entry in the AppStore AppStore: Download "Install Macos Catalina.app" from AppStore. After download: Cancel the auto-start of installation on the host. Host : /Applications not always usable, as this is a special protected folder. Move "Install Macos Catalina.app" from /Applications to /Documents folder. VmWare : Select “Apple OS X” and then select “macOS 10.15” and Continue. VmWare : Choose “Create a new virtual disk” and continue. Either Finish or Customise Settings of the virtual machine. (e.g. 4 CPU, RAM 4GB, no 3D acceleration, Use full retina display, HD 60GB, etc.) The VM is prepared now, its needed to create a OSX Catalina ISO file. Host : Prepare a OSX Catalina ISO file from the installer. Terminal : Create a temporary virtual disk file in your tmp directory. hdiutil create -o /tmp/Catalina.cdr -size 12000m -layout SPUD -fs HFS+J Wait until finished created: /tmp/Catalina.cdr.dmg Terminal : When done, attach and mount the virtual disk hdiutil attach /tmp/Catalina.cdr.dmg -noverify -mountpoint /Volumes/install_build Wait until finished /dev/disk3 Apple_partition_scheme /dev/disk3s1 Apple_partition_map /dev/disk3s2 Apple_HFS /Volumes/install_build Terminal: [Optional] Check all available mountpoints diskutil list Host : Rename the installer, to be compatible with the following scripts, e.g. by Finder. ren "~/Documents/Install Macos Catalina.app" ~/Documents/MacosInstaller.app Installer is available now under the path: ~/Documents/macOsInstall.app Terminal : Extract and create an installable image from the download (with elevated rights). sudo ~/Documents/macOsInstall.app/Contents/Resources/createinstallmedia --volume /Volumes/install_build Wait until finished Password: Ready to start. To continue we need to erase the volume at /Volumes/install_build. If you wish to continue type (Y) then press return: y Erasing disk: 0%... 10%... 20%... 30%... 100% Copying to disk: 0%... 10%... 20%... 30%... 40%... 50%... 60%... 70%... 80%... 90%... 100% Making disk bootable... Copying boot files... Install media now available at "/Volumes/Install macOS Catalina" Terminal : Move the contents of the virtual disk into a .dmg file on your desktop mv /tmp/Catalina.cdr.dmg ~/Documents/InstallSystem.dmg Terminal : Detach the virtual disk (installer) hdiutil detach /Volumes/Install\ macOS\ Catalina Wait until finished "disk2" ejected. Termnal : Convert the newly created “InstallSystem.dmg” into an .iso file. hdiutil convert ~/Documents/InstallSystem.dmg -format UDTO -o ~/Documents/InstallSystem.iso Wait until finished Driver Descriptor Map (DDM : 0) read … Apple (Apple_partition_map : 1) read … (Apple_Free : 2) read … disk image (Apple_HFS : 3) read … .............................................................................. Time: 1m 39.113s Speed: 121.1M Byte/s Reduction: 0.0 % created: /Users/Rollo/Documents/InstallSystem.iso.cdr Host : Change the filetype of the file “InstallSystem.iso.cdr” in your documents, e.g. with Finder. Select the file and hit enter, now rename the file to “InstallSystem.iso” (with prompt); Select “Use .iso” VMware : In virtual machine manager right click the newly created VM (see above). Choose settings. VMware : Choose “CD/DVD (SATA)” Next GoTO the pull-down menu and browse to the “InstallSystem.iso” file just created. Check “CD/DVD (SATA)” connect checkbox VMware : Boot the new machine and follow Apple installation instructions. These steps worked well for me, and are maybe useful for somebody else too. Maybe in the new VmWare installer provide the Drag'n'Drop for all images flawlessly, in the future, and this won't be necessary any more.
  25. Hi there, I'm wondering if there exists a comparision, or a checklist from a developers API perspective. So far the release notes seems to be close together for both OS. https://developer.apple.com/documentation/ios_ipados_release_notes/ios_ipados_13_5_beta_4_release_notes But the questions are, do we have already incompatibilities in some areas, and what will be the roadmap for both API's breaking changes ? I have not found much useful info yet, if you have some more insights I would be happy if you may share your thoughts.
×