iOS 14 SDK开发的iPhone应用在M1 Mac运行时如何强制使用指定设备布局
根因说明
- Apple Silicon Mac运行未适配macOS的iPhone/iPad应用时,会通过iOS兼容层模拟iOS运行环境,此时
UIDevice的userInterfaceIdiom返回值、UIScreen的bounds尺寸都不是固定值,会根据系统缩放设置动态变化。你现有的硬编码屏幕尺寸判断逻辑,会把兼容层返回的虚拟尺寸误判为iPhone 4s的参数,走到错误的布局分支。
实现方案
1. 新增Apple Silicon Mac运行环境检测宏
在现有宏定义的代码块中追加如下逻辑,用于精准识别当前是否处于Mac兼容运行环境:
#define IS_RUNNING_ON_APPLE_SILICON_MAC ({\ BOOL isMacRuntime = NO;\ if (@available(iOS 14.0, *)) {\ // 兼容层注入的环境标记,可匹配全系列Apple Silicon芯片的Mac运行场景 isMacRuntime = [NSProcessInfo processInfo].environment[@"APPLE_SILICON_MAC_RUNTIME"] != nil;\ } else {\ // 低版本系统兜底检测,通过设备硬件型号判断 struct utsname systemInfo;\ uname(&systemInfo);\ NSString *deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];\ isMacRuntime = [deviceModel hasPrefix:@"Mac"];\ }\ isMacRuntime;\ })
2. 调整布局判断规则
将原来仅匹配真实iPhone 12屏幕尺寸的判断条件,扩展为双触发逻辑,只要满足任意一个条件,就直接加载iPhone 12 Pro对应的Main12布局:
- 真实运行在屏幕长边为844pt的iPhone 12/12 Pro设备上
- 检测到当前处于Apple Silicon Mac的运行环境
3. 修正原有启动逻辑的代码错位问题
你现有代码存在引用顺序错误:先从旧window中获取导航控制器引用,之后才重新初始化新的window,此时拿到的导航控制器不属于新窗口,会导致后续核心数据上下文的赋值完全失效。调整后的完整启动逻辑如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 合并多场景的布局判断条件 BOOL needLoadIPhone12Layout = IS_IPHONE_12 || IS_RUNNING_ON_APPLE_SILICON_MAC; if (needLoadIPhone12Layout) { UIStoryboard *iPhone12Storyboard = [UIStoryboard storyboardWithName:@"Main12" bundle:nil]; NSLog(@"Using Main12 storyboard"); UIViewController *initialViewController = [iPhone12Storyboard instantiateInitialViewController]; // 按正确顺序初始化窗口、关联根控制器 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.rootViewController = initialViewController; // 从新窗口的控制器栈中获取引用,完成数据上下文赋值 UINavigationController *navController = (UINavigationController *)self.window.rootViewController; ViewController *controller = (ViewController *)navController.topViewController; controller.managedObjectContext = self.managedObjectContext; [self.window makeKeyAndVisible]; } // 保留原有其他设备的布局分支逻辑 return YES; }
效果说明
调整完成后,应用在M1系列Mac上启动时,会跳过错误的虚拟尺寸判断流程,直接匹配iPhone 12 Pro对应的布局,不会再出现被误识别为iPhone 4s的异常问题。
内容的提问来源于stack exchange,提问作者OscarTheGrouch
相关产品推荐
相关产品推荐

