То, что я сделал, я протестировал два сценария, один - вернуть приложение на передний план, нажав на значок, другой - по вызову sys URL, и сравнил все переменные внутри UIApplication, и, к удивлению, я наконец нашел то, чтоискал в UIApplication.h:
struct {
unsigned int isActive:1;
unsigned int isSuspended:1;
unsigned int isSuspendedEventsOnly:1;
unsigned int isLaunchedSuspended:1;
unsigned int calledNonSuspendedLaunchDelegate:1;
unsigned int isHandlingURL:1;
unsigned int isHandlingRemoteNotification:1;
unsigned int isHandlingLocalNotification:1;
unsigned int statusBarShowsProgress:1;
unsigned int statusBarRequestedStyle:4;
unsigned int statusBarHidden:1;
unsigned int blockInteractionEvents:4;
unsigned int receivesMemoryWarnings:1;
unsigned int showingProgress:1;
unsigned int receivesPowerMessages:1;
unsigned int launchEventReceived:1;
unsigned int isAnimatingSuspensionOrResumption:1;
unsigned int isResuming:1;
unsigned int isSuspendedUnderLock:1;
unsigned int isRunningInTaskSwitcher:1;
unsigned int shouldExitAfterSendSuspend:1;
unsigned int shouldExitAfterTaskCompletion:1;
unsigned int terminating:1;
unsigned int isHandlingShortCutURL:1;
unsigned int idleTimerDisabled:1;
unsigned int deviceOrientation:3;
unsigned int delegateShouldBeReleasedUponSet:1;
unsigned int delegateHandleOpenURL:1;
unsigned int delegateOpenURL:1;
unsigned int delegateDidReceiveMemoryWarning:1;
unsigned int delegateWillTerminate:1;
unsigned int delegateSignificantTimeChange:1;
unsigned int delegateWillChangeInterfaceOrientation:1;
unsigned int delegateDidChangeInterfaceOrientation:1;
unsigned int delegateWillChangeStatusBarFrame:1;
unsigned int delegateDidChangeStatusBarFrame:1;
unsigned int delegateDeviceAccelerated:1;
unsigned int delegateDeviceChangedOrientation:1;
unsigned int delegateDidBecomeActive:1;
unsigned int delegateWillResignActive:1;
unsigned int delegateDidEnterBackground:1;
unsigned int delegateWillEnterForeground:1;
unsigned int delegateWillSuspend:1;
unsigned int delegateDidResume:1;
unsigned int userDefaultsSyncDisabled:1;
unsigned int headsetButtonClickCount:4;
unsigned int isHeadsetButtonDown:1;
unsigned int isFastForwardActive:1;
unsigned int isRewindActive:1;
unsigned int disableViewGroupOpacity:1;
unsigned int disableViewEdgeAntialiasing:1;
unsigned int shakeToEdit:1;
unsigned int isClassic:1;
unsigned int zoomInClassicMode:1;
unsigned int ignoreHeadsetClicks:1;
unsigned int touchRotationDisabled:1;
unsigned int taskSuspendingUnsupported:1;
unsigned int isUnitTests:1;
unsigned int requiresHighResolution:1;
unsigned int disableViewContentScaling:1;
unsigned int singleUseLaunchOrientation:3;
unsigned int defaultInterfaceOrientation:3;
} _applicationFlags;
Это, возможно, содержит всю информацию, к которой программист хотел бы иметь доступ, когда приложение возвращается на передний план, в частности, я хотел бы получить доступ к флагуisHandlingURL, который говорит 1, если приложение выводится на передний план с помощью sys-вызова, 0, если приложение выводится на передний план пользователем.
Далее я посмотрел адрес "application" и "_applicationFlags ", заметил, что они смещены на 0x3C, что составляет 60, поэтому я решил использовать адресные операции, чтобы получить мой необходимый бит:
- (void)applicationWillEnterForeground:(UIApplication *)application
{
/*
Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
*/
id* app = [UIApplication sharedApplication];
app = app+15; //address increments by long words, don't know if it will be the same on device
NSLog(@"Test:%x",*app);
}
, который печатает test: 4a40012 ,или 0x04a40012 , если я напишу полный формат длинного слова.Это дает мне в двоичном виде 0000 0100 1010 0100 0000 0000 0001 0010 .Возвращаясь к _applicationFlags, это даст нам «isHandlingURL» на 6-м бите от LSB, который равен 0. Теперь, если я попытаюсь перевести приложение в фоновый режим и вернуть его с помощью вызова sys URL, я получу отпечаток 4a40032 который в двоичном виде равен 0000 0100 1010 0100 0000 0000 0011 0010 , и у меня включен бит isHandlingURL!Итак, все, что осталось сделать, это завершить оператор с помощью операций сдвига битов, и окончательный код будет выглядеть следующим образом:
- (void)applicationWillEnterForeground:(UIApplication *)application
{
/*
Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
*/
id* app = (id*)[UIApplication sharedApplication]+15;
BOOL isHandlingURL = ((Byte)*app>>5&0x1);
if (isHandlingURL) {
//do whatever I wanna do here
}
}
Я могу продолжить и написать полную функцию, чтобы разобрать все_applicationFlag, но в этой точке неясно, будет ли фиксированный приращение адреса равным 15 как на симуляторе, так и на цели, моей следующей целью будет замена на магическое число '15' каким-либо макроопределением или значениями из системы, поэтомуЯ могу быть уверен, что он всегда будет сдвигаться на 0x3C по мере необходимости, и мне нужно заглянуть в заголовок UIApplication, чтобы убедиться, что _applicationFlag всегда будет сдвигаться на 0x3C.
На этом пока все!