UIApplication openURL 的内部实现 和 UIActionSheet showInView的内部实现 和 UIApplication windows的内部实现

 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: 这个方法大多都是去系统设置页面

  • 拨号(Phone Number)
  • 调用短信(SMS)
  • 调用浏览器(Safari Browser)
  • 调用应用商店(AppStore)

解决办法:先不用管

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]

打印还是只有两个

你可能感兴趣的:(ios,ios)