If a server is sending a push to an app, then how can it know whether it should be sending the push using the Apple sandbox push server, or the production server?
If the app is on the app store or testflight then it needs to be using the sandbox server, but if the app is being run via XCode interactively as devs are developing/testing then the push needs to be sent via the sandbox server.
But the server itself has no idea if the app was installed via Testflight/app store/XCode/ or a development .ipa. So the server can't know how to send the push.
The app has to send the push token to the server anyway, so the app could inform the server which environment it should be sent over. But then how can the app detect that itself?
A naive answer is to use #ifdef DEBUG to detect this, but that is incorrect. Which environment a push should be sent over is not correlated with that. For example an app could be being run with a debug scheme or a release scheme, but in both cases if the app is installed/running via xcode then the push environment has to be the sandbox.
So my question is, is there a way the app can detect which push environment a push should be sent over in order than it can instruct the server accordingly?
Post
Replies
Boosts
Views
Activity
Many months ago Apple stated:
"From Fall 2023 you’ll receive an email from Apple if you upload an app to App Store Connect that uses required reason API without describing the reason in its privacy manifest file"
Yet it seems nobody has received them?
So whats the latest situation with this, if there's a mandatory requirement to add the privacy manifest by Spring how can people meet that now looming deadline if they haven't received the email that was due in the Fall?
I reported this first here: https://developer.apple.com/forums/thread/746539
But have since discovered more findings. In that report there is a hang stack trace (from an .ips file) showing the 3rd party library KKMV featuring. However since posting that I have discovered that my app is hanging all over the place at random places, I've been collecting .ips files and they are all different - expect they all have one thing in common, which is that it always involves __ulock_wait2 / NSLog. There's one example posted in the linked post, but here's a different example but with the same last lines of __ulock_wait2/NSLog
Here's another snippet from a hang, again, just like all the others, it finishes with NSLog/__ulock_wait2
318 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 148 (CoreFoundation + 194472) [0x1988a27a8]
318 @objc CallExtensionManager.appBecameActive() + 28 (Myapp + 296292) [0x100ba8564]
317 CallExtensionManager.appBecameActive() + 912 (Myapp + 295912) [0x100ba83e8]
317 specialized static Logger.always(_:) + 316 (CallFilterFast + 108104) [0x100b7a648]
317 specialized withVaList<A>(_:_:) + 428 (Foundation + 5337508) [0x197c381a4]
317 _NSLogv + 164 (Foundation + 603072) [0x1977b43c0]
317 _CFLogvEx3 + 252 (CoreFoundation + 652276) [0x1989123f4]
317 _CFLogvEx2Predicate + 352 (CoreFoundation + 652792) [0x1989125f8]
317 __CFLogCString + 84 (CoreFoundation + 652948) [0x198912694]
317 _logToStderr + 144 (CoreFoundation + 653980) [0x198912a9c]
317 __ulock_wait2 + 8 (libsystem_kernel.dylib + 59708) [0x1e1a7193c]
*317 ??? (<7ABFF6F3-9E55-3D7B-8DB8-8CF19FB41EFE> + 5068548) [0xfffffff008229704]
Every time the app hangs, in the .ips logging is featured when the ips is opened in XCode or when the ips is examined it always features in the Heaviest stack for the main thread of the target process.
I've drastically reduced the amount of logging within the app in case it was too much, but it made no difference.
When the app hangs there's no crash, I'm running the app either from Testflight, or installing via XCode but then running it from XCode.
If its installed via XCode then a dialog pops up saying it crashed, but there is not crash stack (there's no .crash files on the iPhone, only .ips files, there's no crash reported to crashlytics, and if reported via Testflight there's also no crash info).
Why is NSLog featuring in every .ips file when this happen but at a different location everytime?
If the app is hanging and blocking the main thread, then why isn't it being terminated by Watchdog and thus not producing a .crash file?
I've got an app which is hanging, I turned on Hang Detection and got an .ips file and the top of the hang stack has this:
Dispatch queue: com.apple.main-thread (0)
0 __ulock_wait2
7 NSLog
8 _MMKVLogWithLevel
<snip>
MMKV is a 3rd party library being used in the app. But this looks like MMKV is calling NSLog and then that is hanging? Is that correct, if so then how and why is NSLog hanging and how to solve this issue?
Here's an image of the full stack from XCode when the .ips file is imported:
And here is the heaviest stack info when the .ips is opened as a text file:
Heaviest stack for the main thread of the target process:
411 start + 2240 (dyld + 23940) [0x1bcacad84]
411 main + 96 (MyApp + 108384) [0x10232e760]
411 UIApplicationMain + 340 (UIKitCore + 2270528) [0x19ad20540]
411 -[UIApplication _run] + 888 (UIKitCore + 2273028) [0x19ad20f04]
411 GSEventRunModal + 164 (GraphicsServices + 13536) [0x1dd8554e0]
411 CFRunLoopRunSpecific + 608 (CoreFoundation + 211304) [0x1988a6968]
397 __CFRunLoopRun + 1996 (CoreFoundation + 213528) [0x1988a7218]
397 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 16 (CoreFoundation + 226588) [0x1988aa51c]
397 _dispatch_main_queue_callback_4CF + 44 (libdispatch.dylib + 74168) [0x1a07831b8]
396 _dispatch_main_queue_drain + 1060 (libdispatch.dylib + 75244) [0x1a07835ec]
396 _dispatch_client_callout + 20 (libdispatch.dylib + 15828) [0x1a0774dd4]
396 _dispatch_call_block_and_release + 32 (libdispatch.dylib + 8508) [0x1a077313c]
396 __49-[RCTCxxBridge _prepareModulesWithDispatchGroup:]_block_invoke + 156 (MyApp + 11155392) [0x102db77c0]
396 -[RCTModuleData instance] + 816 (MyApp + 11498212) [0x102e0b2e4]
396 RCTUnsafeExecuteOnMainQueueSync + 52 (MyApp + 11906956) [0x102e6ef8c]
396 __25-[RCTModuleData instance]_block_invoke + 44 (MyApp + 11499132) [0x102e0b67c]
392 -[RCTModuleData setUpInstanceAndBridge:] + 1324 (MyApp + 11490784) [0x102e095e0]
392 __115-[RCTModuleData initWithModuleClass:bridge:moduleRegistry:viewRegistry_DEPRECATED:bundleManager:callableJSModules:]_block_invoke + 36 (MyApp + 11488056) [0x102e08b38]
392 -[MMKVNative init] + 100 (MyApp + 20934364) [0x10370aedc]
392 RCTExecuteOnMainQueue + 52 (MyApp + 11906684) [0x102e6ee7c]
392 __18-[MMKVNative init]_block_invoke + 232 (MyApp + 20934688) [0x10370b020]
392 +[MMKV initializeMMKV:] + 48 (MyApp + 9265708) [0x102bea22c]
392 +[MMKV initializeMMKV:logLevel:] + 80 (MyApp + 9265800) [0x102bea288]
392 _MMKVLogWithLevel(mmkv::MMKVLogLevel, char const*, char const*, int, char const*, ...) + 348 (MyApp + 9518596) [0x102c27e04]
392 NSLog + 56 (Foundation + 602868) [0x1977b42f4]
392 _NSLogv + 164 (Foundation + 603072) [0x1977b43c0]
392 _CFLogvEx3 + 252 (CoreFoundation + 652276) [0x1989123f4]
392 _CFLogvEx2Predicate + 352 (CoreFoundation + 652792) [0x1989125f8]
392 __CFLogCString + 84 (CoreFoundation + 652948) [0x198912694]
392 _logToStderr + 144 (CoreFoundation + 653980) [0x198912a9c]
392 __ulock_wait2 + 8 (libsystem_kernel.dylib + 59708) [0x1e1a7193c]
*392 ??? (<7ABFF6F3-9E55-3D7B-8DB8-8CF19FB41EFE> + 5068548) [0xfffffff008229704]
I've got a .ips file from a handset that had hang detection turned on.
Its not fully symbolicated, how can I symbolicate it?
On that topic, the instructions for symbolicating a .crash file are out of date:
https://developer.apple.com/documentation/xcode/adding-identifiable-symbol-names-to-a-crash-report
It says "click the Device Logs button in the Devices and Simulators window, then drag and drop the crash report file into the list of device logs."
However with XCode 15.1 there is no Device Logs button in the Devices and Simulators window.
(If there were that button, presumably these instructions only apply for logs collected from the same device as listed in Devices and Simulators. What if you have a log collected from a device to which you don't have access for it to be in Devices and Simulators?)
An hour ago I received a new iPhone 15 Pro, however I can't enable developer mode for it.
Developer mode doesn't appear in the Setting | Privacy & Security | Security section. However I read thats to be expected now for iOS 17, and that it can be enable within XCode (although I didn't have to do that with any of my other phones which have iOS 17 on them, and for all of those Developer Mode does appear in Settings).
However XCode (v15, release version not beta version) doesn't recognize the device.
On the iPhone I've Trusted the Mac and restarted the phone and XCode but XCode just won't see it.
Apple Configurator 2 has no problem seeing/connecting to the iPhone, nor does the iExplorer app, but XCode just won't.
What can I try next?
Seeing a sudden influx of crashlytics error in an old version as soon as the new version is released
Last week we released an update to the app in the app store, version N.0.
It was on a phased rollout. Several users reported a crash so the roll out was paused.
A fix to the crash was released to the app store this morning, version N.1 and the rollout resumed.
However immediately following the release of N.1 to the app store there are lots of crash reports arriving in Crashlytics all of a sudden for version N.0.
Its as if N.0 has suddenly become available on the app store and everybody is downloading it, but that isn't the case, its definately N.1 displayed in the app store.
I don't understand why all these reports from a version of the app that is now no longer available has started arriving? Could be there some caching of versions in the app store or something and when N.1 release and the rollout resumed, the app store is actually automatically updateing people's phones with N.0 instead?
(There's a small number of non crash reports being reported in Crashlytics for N.1, proving its live and downloaded on some phones)
In this Apple documentation https://developer.apple.com/documentation/xcode/acquiring-crash-reports-and-diagnostic-logs
it says "If a customer reports a crash, they can transfer the crash report to either a Mac or Windows computer. See Find device crash and energy logs on a Mac or Windows computer."
In the page that links to (https://help.apple.com/xcode/mac/current/#/dev0f3181c2c) it says "When an app crashes or uses excessive CPU on a device, the operating system creates a log of that event. The next time you connect the device to your Mac, the system downloads those records (known as crash or energy logs) to your Mac. "
But where on your Mac, it doesn't say where. Where does it the Mac download the crash reports to?
Released app repeatedly crashing on launch, Crashlytics is enabled but no crash reports getting sent
I've users reporting a crash on app launch which I'm unable to reproduce. The app has Crashlytics but none of the crashes are getting sent to the Crashlytics console (Crashlytics is set up correctly and reports can get through for when the app doesn't crash on startup, but not getting sent for this).
I've managed to get a crash report off a phone, but can't see anything useful. Are there any clues in here as to the possible cause?
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Termination Reason: SIGNAL 6 Abort trap: 6
Terminating Process: AppName [566]`
Last Exception Backtrace:
0 CoreFoundation 0x192622870 __exceptionPreprocess + 164
1 libobjc.A.dylib 0x18a94fc00 objc_exception_throw + 59
2 AppName 0x1046b7450 0x10401c000 + 6927440
3 AppName 0x104683990 0x10401c000 + 6715792
4 AppName 0x10468542c 0x10401c000 + 6722604
5 AppName 0x1040b5900 0x10401c000 + 628992
6 AppName 0x1040b593c 0x10401c000 + 629052
7 AppName 0x10408a3b0 0x10401c000 + 451504
8 AppName 0x10407f320 0x10401c000 + 406304
9 AppName 0x10407f4a4 0x10401c000 + 406692
10 AppName 0x1040346c0 0x10401c000 + 100032
11 UIKitCore 0x194969ddc -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 319
12 UIKitCore 0x194968f44 -[UIApplication _callInitializationDelegatesWithActions:forCanvas:payload:fromOriginatingProcess:] + 2855
13 UIKitCore 0x194967f28 -[UIApplication _runWithMainScene:transitionContext:completion:] + 855
14 UIKitCore 0x194967b74 -[_UISceneLifecycleMultiplexer completeApplicationLaunchWithFBSScene:transitionContext:] + 131
15 UIKitCore 0x1948e4434 _UIScenePerformActionsWithLifecycleActionMask + 111
16 UIKitCore 0x19496bb70 __101-[_UISceneLifecycleMultiplexer _evalTransitionToSettings:fromSettings:forceExit:withTransitionStore:]_block_invoke + 215
17 UIKitCore 0x19489329c -[_UISceneLifecycleMultiplexer _performBlock:withApplicationOfDeactivationReasons:fromReasons:] + 219
18 UIKitCore 0x194891d14 -[_UISceneLifecycleMultiplexer _evalTransitionToSettings:fromSettings:forceExit:withTransitionStore:] + 607
19 UIKitCore 0x19489167c -[_UISceneLifecycleMultiplexer uiScene:transitionedFromState:withTransitionContext:] + 247
20 UIKitCore 0x19489154c __186-[_UIWindowSceneFBSSceneTransitionContextDrivenLifecycleSettingsDiffAction _performActionsForUIScene:withUpdatedFBSScene:settingsDiff:fromSettings:transitionContext:lifecycleActionType:]_block_invoke + 147
21 UIKitCore 0x194891454 +[BSAnimationSettings(UIKit) tryAnimatingWithSettings:fromCurrentState:actions:completion:] + 735
22 UIKitCore 0x194890cdc _UISceneSettingsDiffActionPerformChangesWithTransitionContextAndCompletion + 223
23 UIKitCore 0x19489098c -[_UIWindowSceneFBSSceneTransitionContextDrivenLifecycleSettingsDiffAction _performActionsForUIScene:withUpdatedFBSScene:settingsDiff:fromSettings:transitionContext:lifecycleActionType:] + 315
24 UIKitCore 0x194c13520 __64-[UIScene scene:didUpdateWithDiff:transitionContext:completion:]_block_invoke.225 + 611
25 UIKitCore 0x19488fb10 -[UIScene _emitSceneSettingsUpdateResponseForCompletion:afterSceneUpdateWork:] + 215
26 UIKitCore 0x19488f980 -[UIScene scene:didUpdateWithDiff:transitionContext:completion:] + 243
27 UIKitCore 0x1949a826c -[UIApplication workspace:didCreateScene:withTransitionContext:completion:] + 507
28 UIKitCore 0x1949a8004 -[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:] + 287
29 FrontBoardServices 0x1ab0766d4 -[FBSScene _callOutQueue_didCreateWithTransitionContext:completion:] + 323
30 FrontBoardServices 0x1ab076570 __92-[FBSWorkspaceScenesClient createSceneWithIdentity:parameters:transitionContext:completion:]_block_invoke.108 + 279
31 FrontBoardServices 0x1ab07519c -[FBSWorkspace _calloutQueue_executeCalloutFromSource:withBlock:] + 167
32 FrontBoardServices 0x1ab080f8c __92-[FBSWorkspaceScenesClient createSceneWithIdentity:parameters:transitionContext:completion:]_block_invoke + 351
33 libdispatch.dylib 0x19a4cf300 _dispatch_client_callout + 19
34 libdispatch.dylib 0x19a4d2d48 _dispatch_block_invoke_direct + 283
35 FrontBoardServices 0x1ab071520 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 51
36 FrontBoardServices 0x1ab0714a0 -[FBSMainRunLoopSerialQueue _targetQueue_performNextIfPossible] + 239
37 FrontBoardServices 0x1ab071378 -[FBSMainRunLoopSerialQueue _performNextFromRunLoopSource] + 27
38 CoreFoundation 0x19256d31c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 27
39 CoreFoundation 0x19256c598 __CFRunLoopDoSource0 + 175
40 CoreFoundation 0x19256adac __CFRunLoopDoSources0 + 339
41 CoreFoundation 0x192569a88 __CFRunLoopRun + 827
42 CoreFoundation 0x192569668 CFRunLoopRunSpecific + 607
43 GraphicsServices 0x1d648f5ec GSEventRunModal + 163
44 UIKitCore 0x1949850d4 -[UIApplication _run] + 887
45 UIKitCore 0x194984710 UIApplicationMain + 339
46 AppName 0x10402bba8 0x10401c000 + 64424
47 dyld 0x1b5be6d44 start + 2103
Thread 0 posted as comment
I'm trying to find what/if the iOS equivalent to Android's Sip range of APIs is. For example SipAudioCall is for handling the audio calls, SipManager for initiating SIP connections.
I'm aware of iOS's CallKit component and have read its documentation, however all it seems to provide basically is a listening mechanism for Voip Pushes indicating a Voip call request and a means of integrating Voip Calls with the native call screens/system.
I can't see anything in the Callkit documentation or tutorials to do things like initiate a SIP connection, or register SIP identify/IP, or start a VoIP call, or actually manage an incomming VoIP call.
Could somebody point me to the documentation for those APIs if they exist, if they don't, does that mean if you want to develop a VoIP app you have to implement a load of stuff from scratch?