1查看ios系统调用打电话的弹框如何弹出来的
UIKitCore二进制文件路径
/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 14.4.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UIKitCore.framework/UIKitCore
添加一个下划线,套一个娃
void -[UIApplication openURL:]() {
[rdi _openURL:rdx];
return;
}
/* @class UIApplication */
-(int)_openURL:(int)arg2 {
r14 = arg0;
rax = [arg2 retain];
if (rax != 0x0) {
rbx = rax;
if ([r14 _shouldAttemptOpenURL:rax] != 0x0) {
r15 = [[r14 _urlWithSettingsPrivateURLSchemeIfNeeded:rbx] retain];
[rbx release];
rax = [LSApplicationWorkspace defaultWorkspace];
rax = [rax retain];
r14 = [rax openURL:r15];
[rax release];
rbx = r15;
}
else {
r14 = 0x0;
}
}
else {
rbx = 0x0;
r14 = 0x0;
}
[rbx release];
rax = r14;
return rax;
}
然后是 LSApplicationWorkspace openURL:
属于系统库:MobileCoreService
路径在这里
/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 14.4.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices
[[UIApplication sharedApplication]openURL:tel://00000000]
ios16会产生actionsheet ,
直接跳页的时候它还在,
但是如果切后台自己就会消失
所以先不考虑
UIApplication sharedApplication]openURL: 这个方法大多都是去系统设置页面
解决办法:先不用管
2. UIActionSheet show in view 如何展示出来的
/* @class UIActionSheet */
-(int)showInView:(int)arg2 {
rbx = arg0;
r14 = [arg2 retain];
[rbx _setIsPresented:0x1];
if (r14 != 0x0) {
[&var_90 bounds];
xmm0 = intrinsic_movaps(xmm0, var_90);
var_30 = intrinsic_movaps(var_30, xmm0);
xmm0 = intrinsic_movapd(xmm0, *(int128_t *)(&var_90 + 0x10));
xmm0 = intrinsic_mulpd(xmm0, *(int128_t *)0x130b550);
}
else {
xmm1 = 0x0;
intrinsic_movaps(var_80, xmm1);
var_30 = intrinsic_movapd(var_30, intrinsic_xorpd(xmm0, xmm0));
intrinsic_movaps(var_90, xmm1);
xmm0 = intrinsic_xorpd(xmm0, xmm0);
}
var_60 = intrinsic_movapd(var_60, xmm0);
floor(xmm0);
var_70 = intrinsic_movapd(var_70, xmm0);
xmm0 = intrinsic_movapd(xmm0, var_60);
floor(intrinsic_unpckhpd(xmm0, xmm0));
var_50 = intrinsic_movapd(var_50, intrinsic_addpd(intrinsic_unpcklpd(intrinsic_movapd(xmm1, var_70), xmm0), var_30));
intrinsic_movaps(var_40, intrinsic_movaps(xmm0, *(int128_t *)0x130b560));
rdi = rbx->_presenter;
var_B8 = *__NSConcreteStackBlock;
*(&var_B8 + 0x8) = 0xffffffffc2000000;
*(&var_B8 + 0x10) = ___28-[UIActionSheet showInView:]_block_invoke;
*(&var_B8 + 0x18) = ___block_descriptor_40_e8_32s_e5_v8?0l;
*(&var_B8 + 0x20) = rbx;
[rdi _presentAlertControllerFromRect:r14 inView:0x0 direction:0x1 animated:r9 completion:var_50];
rax = [r14 release];
return rax;
}
主要是这句 [rdi _presentAlertControllerFromRect:r14 inView:0x0 direction:0x1 animated:r9 completion:var_50];
/* @class _UIAlertControllerShimPresenter */
-(void)_presentAlertControllerFromRect:(int)arg2 inView:(int)arg3 direction:(int)arg4 animated:(int)arg5 completion:(int)arg6 {
var_8 = arg6;
var_2C = arg4;
var_60 = arg3;
r12 = [arg2 retain];
var_38 = [arg5 retain];
rax = [r12 window];
rax = [rax retain];
[_UIAlertControllerShimPresenter _cancelPendingTouchesIfAppropriateForWindow:rax];
[rax release];
var_40 = arg0;
rax = [arg0 alertController];
rax = [rax retain];
[rax _setDismissedFromShim:0x0];
[rax release];
rax = [_UIPopoverView popoverViewContainingView:r12];
rax = [rax retain];
r13 = rax;
rax = [rax popoverController];
rax = [rax retain];
var_50 = rax;
if (r13 != 0x0) {
rax = [rax _managingSplitViewController];
rax = [rax retain];
rbx = rax == 0x0 ? 0x1 : 0x0;
[rax release];
}
else {
rbx = 0x0;
}
if (__UIAppUseModernRotationAndPresentationBehaviors() == 0x0) goto loc_1ba55;
loc_1b9be:
var_48 = r13;
r13 = [[r12 _viewControllerForAncestor] retain];
rdx = objc_opt_class(@class(UIPopoverPresentationController));
if ([r13 _isInContextOfPresentationControllerOfClass:rdx effective:0x0] == 0x0) goto loc_1ba48;
loc_1b9fc:
rax = [var_40 alertController];
rax = [rax retain];
rcx = var_2C & 0xff;
rdx = rax;
r15 = var_38;
[r13 presentViewController:rdx animated:rcx completion:r15];
[rax release];
[r13 release];
goto loc_1bd46;
loc_1bd46:
rsi = @selector(presentViewController:animated:completion:);
r13 = var_48;
goto loc_1bd75;
loc_1bd75:
[var_50 release];
[r13 release];
[r15 release];
[r12 release];
return;
loc_1ba48:
[r13 release];
r13 = var_48;
goto loc_1ba55;
loc_1ba55:
if (rbx == 0x0) goto loc_1bad1;
loc_1ba59:
var_58 = r12;
var_48 = r13;
r13 = [[r13 contentView] retain];
rax = objc_alloc_init(@class(UIViewController));
rdi = *(var_40 + 0x18);
*(var_40 + 0x18) = rax;
[rdi release];
r12 = [[*(var_40 + 0x18) view] retain];
if (r13 != 0x0) {
rax = [&var_80 bounds];
}
else {
var_70 = intrinsic_movaps(var_70, 0x0);
var_80 = intrinsic_movaps(var_80, 0x0);
}
[r12 setFrame:var_80, var_70];
rsp = (rsp - 0x20) + 0x20;
[r13 addSubview:r12];
r15 = *(var_40 + 0x18);
rax = [var_40 alertController];
rax = [rax retain];
rcx = var_2C & 0xff;
rdx = rax;
[r15 presentViewController:rdx animated:rcx completion:0x0];
[rax release];
[r12 release];
[r13 release];
r12 = var_58;
r15 = var_38;
goto loc_1bd46;
loc_1bad1:
r15 = var_38;
if ([_UIAlertControllerShimPresenter _shouldPresentActionSheetsFullscreen] != 0x0) {
rsi = @selector(_presentAlertControllerAnimated:completion:);
rdx = var_2C & 0xff;
rcx = r15;
(*_objc_msgSend)(var_40, rsi);
}
else {
rsi = @selector(_shouldPresentActionSheetsFullscreen);
var_E8 = *__NSConcreteStackBlock;
*(&var_E8 + 0x8) = 0xffffffffc2000000;
*(&var_E8 + 0x10) = ___104-[_UIAlertControllerShimPresenter _presentAlertControllerFromRect:inView:direction:animated:completion:]_block_invoke;
*(&var_E8 + 0x18) = ___block_descriptor_97_e8_32s40s48bs_e5_v8?0l;
*(&var_E8 + 0x20) = var_40;
rcx = var_8;
rdx = *(&var_8 + 0x8);
*(&var_E8 + 0x38) = rcx;
*(&var_E8 + 0x40) = rdx;
rcx = *(&var_8 + 0x10);
*(&var_E8 + 0x48) = rcx;
*(&var_E8 + 0x50) = *(&var_8 + 0x18);
var_58 = r12;
rax = [r12 retain];
r12 = rax;
*(&var_E8 + 0x28) = rax;
*(&var_E8 + 0x58) = var_60;
*(int8_t *)(&var_E8 + 0x60) = var_2C;
*(&var_E8 + 0x30) = [r15 retain];
rax = objc_retainBlock(&var_E8);
r14 = rax;
if (__UIAppUseModernRotationAndPresentationBehaviors() != 0x0) {
rax = [r12 _viewControllerForAncestor];
rax = [rax retain];
rbx = rax;
rsi = @selector(transitionCoordinator);
rax = _objc_msgSend_16fe878(rax, rsi);
rax = [rax retain];
[rax release];
[rbx release];
r15 = var_38;
if (rax != 0x0) {
r12 = [[[[r12 _viewControllerForAncestor] retain] transitionCoordinator] retain];
var_110 = *__NSConcreteStackBlock;
*(&var_110 + 0x8) = 0xffffffffc2000000;
*(&var_110 + 0x10) = ___104-[_UIAlertControllerShimPresenter _presentAlertControllerFromRect:inView:direction:animated:completion:]_block_invoke.56;
*(&var_110 + 0x18) = ___block_descriptor_40_e8_32bs_e56_v16?0""8l;
*(&var_110 + 0x20) = [r14 retain];
rsi = @selector(animateAlongsideTransition:completion:);
rdx = 0x0;
rcx = &var_110;
(*_objc_msgSend)(r12, rsi);
[r12 release];
r15 = var_38;
[rax release];
[*(&var_110 + 0x20) release];
}
else {
(*(r14 + 0x10))(r14);
}
}
else {
(*(r14 + 0x10))(r14);
}
[r14 release];
[var_B8 release];
[var_C0 release];
r12 = var_58;
}
goto loc_1bd75;
}
int ___104-[_UIAlertControllerShimPresenter _presentAlertControllerFromRect:inView:direction:animated:completion:]_block_invoke(int arg0) {
r14 = [[*(arg0 + 0x20) _popoverController] retain];
rdx = *(arg0 + 0x28);
rcx = *(arg0 + 0x58);
r8 = *(int8_t *)(arg0 + 0x60) & 0xff;
r9 = *(arg0 + 0x48);
[r14 presentPopoverFromRect:rdx inView:rcx permittedArrowDirections:r8 animated:r9];
rsp = (rsp - 0x20) + 0x20;
rdi = *(arg0 + 0x30);
if (rdi != 0x0) {
(*(rdi + 0x10))();
}
rax = [r14 release];
return rax;
}
void ___104-[_UIAlertControllerShimPresenter _presentAlertControllerFromRect:inView:direction:animated:completion:]_block_invoke.56(int arg0) {
rdi = *(arg0 + 0x20);
(*(rdi + 0x10))(rdi);
return;
}
/* @class _UIAlertControllerShimPresenter */
-(int)_presentAlertControllerFromBarButtonItem:(int)arg2 animated:(int)arg3 completion:(int)arg4 {
r15 = arg3;
r14 = arg0;
rbx = [arg2 retain];
r12 = [arg4 retain];
r13 = [[rbx view] retain];
[rbx release];
if (r13 != 0x0) {
rax = [&var_50 bounds];
}
else {
var_40 = intrinsic_movaps(var_40, 0x0);
var_50 = intrinsic_movaps(var_50, 0x0);
}
[r14 _presentAlertControllerFromRect:r13 inView:0xf direction:r15 & 0xff animated:r12 completion:var_50];
[r13 release];
rax = [r12 release];
return rax;
}
应该调用的是
[r13 presentViewController:rdx animated:rcx completion:r15];
解决办法:可以使用dismissViewControllerAnimated关闭
3.UIApplication windows的内部实现
当弹出actionsheet的时候为什么打印[[UIApplication sharedApplication] windows] 里面没有alert window
但 打印[[UIApplication sharedApplication] keyWindow] 却能打印出_UIAlertControllerShimPresenterWindow
UIApplication windows 是已经不再推荐的方法 需要("Use UIWindowScene.windows on a relevant window scene instead", ios(2.0, 15.0))
function -[UIApplication windows] {
r0 = [UIWindow allWindowsIncludingInternalWindows:0x0 onlyVisibleWindows:0x0];
return r0;
}
void +[UIWindow allWindowsIncludingInternalWindows:onlyVisibleWindows:]() {
[r0 allWindowsIncludingInternalWindows:r2 onlyVisibleWindows:r3 forScreen:0x0];
return;
}
/* @class UIWindow */
+(int)allWindowsIncludingInternalWindows:(int)arg2 onlyVisibleWindows:(int)arg3 forScreen:(int)arg4 {
r22 = [arg4 retain];
r23 = objc_alloc_init();
var_40 = r22;
r22 = [r22 retain];
r0 = [r23 retain];
[arg0 _enumerateWindowsIncludingInternalWindows:arg2 onlyVisibleWindows:arg3 allowMutation:0x0 withBlock:&var_60];
[r0 sortUsingFunction:0xb73504 context:0x0];
r20 = objc_retainAutoreleaseReturnValue(r0);
[r0 release];
[var_40 release];
[r20 release];
[r22 release];
r0 = r20;
return r0;
}
int ___76+[UIWindow allWindowsIncludingInternalWindows:onlyVisibleWindows:forScreen:]_block_invoke(int arg0, int arg1) {
var_20 = r22;
stack[-40] = r21;
r31 = r31 + 0xffffffffffffffd0;
var_10 = r20;
stack[-24] = r19;
saved_fp = r29;
stack[-8] = r30;
r29 = &saved_fp;
r19 = arg1;
r20 = arg0;
if (*(arg0 + 0x20) != 0x0) {
r0 = [r19 screen];
r0 = [r0 retain];
r21 = r0;
r22 = *(r20 + 0x20);
r0 = [r0 release];
if (r21 == r22) {
r0 = *(r20 + 0x28);
r0 = [r0 addObject:r19];
}
}
else {
r0 = *(r20 + 0x28);
r0 = [r0 addObject:r19];
}
return r0;
}
/* @class UIWindowScene */
-(int)_allWindowsIncludingInternalWindows:(int)arg2 onlyVisibleWindows:(id)arg3 {
var_20 = r22;
stack[-40] = r21;
r31 = r31 + 0xffffffffffffffd0;
var_10 = r20;
stack[-24] = r19;
saved_fp = r29;
stack[-8] = r30;
r29 = &saved_fp;
r20 = arg2;
r0 = arg0->_contextBinder;
r8 = &@selector(attachedBindables);
if (r3 != 0x0) {
if (!CPU_FLAGS & NE) {
r8 = &@selector(enrolledBindables);
}
else {
r8 = &@selector(attachedBindables);
}
}
r0 = objc_msgSend(r0, *r8);
r29 = r29;
r19 = [r0 retain];
if (r20 != 0x0) {
r20 = [r19 retain];
}
else {
r21 = [[NSPredicate predicateWithBlock:0x15f3a98] retain];
r20 = [[r19 filteredArrayUsingPredicate:r21] retain];
[r21 release];
}
[r19 release];
r0 = [r20 autorelease];
return r0;
}
bool ___72-[UIWindowScene _allWindowsIncludingInternalWindows:onlyVisibleWindows:]_block_invoke(void * _block, struct UIWindow * arg1, struct NSDictionary * arg2) {
r0 = [arg1 retain];
r20 = [r0 isInternalWindow];
[r0 release];
r0 = r20 ^ 0x1;
return r0;
}
主要看 enumerateWindowsIncludingInternalWindows
/* @class UIScene */
-(int)_enumerateWindowsIncludingInternalWindows:(int)arg2 onlyVisibleWindows:(int)arg3 asCopy:(int)arg4 stopped:(int)arg5 withBlock:(int)arg6 {
r31 = r31 - 0x120;
var_40 = r26;
stack[-72] = r25;
var_30 = r24;
stack[-56] = r23;
var_20 = r22;
stack[-40] = r21;
var_10 = r20;
stack[-24] = r19;
saved_fp = r29;
stack[-8] = r30;
r29 = &saved_fp;
r19 = arg5;
r21 = arg3;
r22 = arg2;
r23 = arg0;
r20 = [arg6 retain];
if ([r23 _hostsWindows] == 0x0) goto loc_49470;
loc_49390:
var_100 = q0;
r0 = [r23 _allWindowsIncludingInternalWindows:r22 onlyVisibleWindows:r21];
r0 = [r0 retain];
r21 = r0;
r0 = [r0 countByEnumeratingWithState:r2 objects:r3 count:r4];
if (r0 == 0x0) goto loc_49468;
loc_493e4:
r23 = r0;
r24 = *var_100;
goto loc_493f0;
loc_493f0:
r25 = 0x0;
goto loc_493f4;
loc_493f4:
if (*var_100 != r24) {
objc_enumerationMutation(r21);
}
(*(r20 + 0x10))(r20, *(var_108 + r25 * 0x8), &var_C9);
if (var_C9 != 0x0) goto loc_4945c;
loc_4942c:
r25 = r25 + 0x1;
if (r25 < r23) goto loc_493f4;
loc_49438:
r0 = [r21 countByEnumeratingWithState:r2 objects:r3 count:r4];
r23 = r0;
if (r0 != 0x0) goto loc_493f0;
loc_49468:
[r21 release];
goto loc_49470;
loc_49470:
var_48 = **___stack_chk_guard;
r0 = [r20 release];
if (**___stack_chk_guard != var_48) {
r0 = __stack_chk_fail();
}
return r0;
loc_4945c:
if (r19 != 0x0) {
*(int8_t *)r19 = 0x1;
}
goto loc_49468;
}
使用他推荐的UIWindowScene.windows试试
[[UIApplication sharedApplication] connectedScenes]
打印还是只有两个