Xcode16 iOS18 编译问题适配

news2024/12/30 2:13:30

问题1:ADClient编译报错问题

报错信息

Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_ADClient", referenced from:
       in ViewController.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
相关代码(demo)

原因

苹果对AdClicent API加了一个标识
ADCLIENT_DEPRECATED_IOS_90_145_OBSOLETED_180
表示:iOS7.1-iOS14.5可用,iOS18彻底废弃,会在iOS18系统上编译失败。

解决办法

使用AdService库的AAAttribution替代,注意iOS14.3才可以使用。

代码
if (@available(ios 14.3, *)) {
        NSError *error;
        NSString *token = [AAAttribution attributionTokenWithError:&error];
        if (token != nil) {
            ...
        }
}
参考

https://developer.apple.com/forums/thread/759156
https://developer.apple.com/documentation/iad?language=objc

问题2:Xcode16(正式版)运行时,YYCache导致crash

报错信息

原因

在 iOS18 中,需要提前对 sqlite3_stmt 执行 sqlite3_finalize。

解决办法

代码
- (BOOL)_dbClose {
    if (!_db) return YES;
    
    int  result = 0;
    BOOL retry = NO;
    BOOL stmtFinalized = NO;
    
    if (@available(iOS 18, *)) {
        if (_dbStmtCache) {
            CFIndex size = CFDictionaryGetCount(_dbStmtCache);
            CFTypeRef *valuesRef = (CFTypeRef *)malloc(size * sizeof(CFTypeRef));
            CFDictionaryGetKeysAndValues(_dbStmtCache, NULL, (const void **)valuesRef);
            const sqlite3_stmt **stmts = (const sqlite3_stmt **)valuesRef;
            for (CFIndex i = 0; i < size; i ++) {
                sqlite3_stmt *stmt = stmts[i];
                sqlite3_finalize(stmt);
            }
            free(valuesRef);
            CFRelease(_dbStmtCache);
        }
    } else {
        if (_dbStmtCache) CFRelease(_dbStmtCache);
        _dbStmtCache = NULL;
    }
    
    do {
        retry = NO;
        result = sqlite3_close(_db);
        if (result == SQLITE_BUSY || result == SQLITE_LOCKED) {
            if (!stmtFinalized) {
                stmtFinalized = YES;
                sqlite3_stmt *stmt;
                while ((stmt = sqlite3_next_stmt(_db, nil)) != 0) {
                    sqlite3_finalize(stmt);
                    retry = YES;
                }
            }
        } else if (result != SQLITE_OK) {
            if (_errorLogsEnabled) {
                NSLog(@"%s line:%d sqlite close failed (%d).", __FUNCTION__, __LINE__, result);
            }
        }
    } while (retry);
    _db = NULL;
    return YES;
}
参考

https://giters.com/ibireme/YYCache/issues/166

问题3:Xcode16正式版,addSubView crash (maskView)

报错信息

*** Assertion failure in -[TestMaskView _addSubview:positioned:relativeTo:], UIView.m:18496
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Set `maskView` (<UIView: 0x14a21ddd0; frame = (0 0; 0 0); layer = <CALayer: 0x60000314b480>>) to `nil` before adding it as a subview of <TestMaskView: 0x153e08350; frame = (0 0; 393 852); layer = <CALayer: 0x60000314b440>>'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001063540ec __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x00000001048bede8 objc_exception_throw + 72
    2   Foundation                          0x0000000109d21aa8 _userInfoForFileAndLine + 0
    3   UIKitCore                           0x0000000128c0151c -[UIView(Internal) _addSubview:positioned:relativeTo:] + 1124
    4   ADClientTest                        0x0000000104609660 -[TestMaskView initWithFrame:] + 276
    5   ADClientTest                        0x0000000104609434 -[ViewController viewDidLoad] + 164
    6   UIKitCore                           0x0000000127f1e69c -[UIViewController _sendViewDidLoadWithAppearanceProxyObjectTaggingEnabled] + 80
    7   UIKitCore                           0x0000000127f23238 -[UIViewController loadViewIfRequired] + 908
    8   UIKitCore                           0x0000000127f234e0 -[UIViewController view] + 20
    9   UIKitCore                           0x00000001286c3a08 -[UIWindow addRootViewControllerViewIfPossible] + 132
    10  UIKitCore                           0x00000001286c343c -[UIWindow _updateLayerOrderingAndSetLayerHidden:actionBlock:] + 168
    11  UIKitCore                           0x00000001286c4288 -[UIWindow _setHidden:forced:] + 228
    12  UIKitCore                           0x00000001286d3344 -[UIWindow _mainQueue_makeKeyAndVisible] + 36
    13  UIKitCore                           0x000000012892dcd8 -[UIWindowScene _performDeferredInitialWindowUpdateForConnection] + 204
    14  UIKitCore                           0x0000000127af58f0 +[UIScene _sceneForFBSScene:create:withSession:connectionOptions:] + 1164
    15  UIKitCore                           0x000000012868f45c -[UIApplication _connectUISceneFromFBSScene:transitionContext:] + 808
    16  UIKitCore                           0x000000012868f70c -[UIApplication workspace:didCreateScene:withTransitionContext:completion:] + 304
    17  UIKitCore                           0x000000012815ec08 -[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:] + 260
    18  FrontBoardServices                  0x0000000113090ce4 __95-[FBSScene _callOutQueue_didCreateWithTransitionContext:alternativeCreationCallout:completion:]_block_invoke + 260
    19  FrontBoardServices                  0x00000001130910a4 -[FBSScene _callOutQueue_coalesceClientSettingsUpdates:] + 60
    20  FrontBoardServices                  0x0000000113090b64 -[FBSScene _callOutQueue_didCreateWithTransitionContext:alternativeCreationCallout:completion:] + 408
    21  FrontBoardServices                  0x00000001130bdd50 __93-[FBSWorkspaceScenesClient _callOutQueue_sendDidCreateForScene:transitionContext:completion:]_block_invoke.156 + 216
    22  FrontBoardServices                  0x000000011309d618 -[FBSWorkspace _calloutQueue_executeCalloutFromSource:withBlock:] + 160
    23  FrontBoardServices                  0x00000001130bc220 -[FBSWorkspaceScenesClient _callOutQueue_sendDidCreateForScene:transitionContext:completion:] + 388
    24  libdispatch.dylib                   0x000000010bdea7b8 _dispatch_client_callout + 16
    25  libdispatch.dylib                   0x000000010bdee3bc _dispatch_block_invoke_direct + 388
    26  FrontBoardServices                  0x00000001130e0b58 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 44
    27  FrontBoardServices                  0x00000001130e0a34 -[FBSMainRunLoopSerialQueue _targetQueue_performNextIfPossible] + 196
    28  FrontBoardServices                  0x00000001130e0b8c -[FBSMainRunLoopSerialQueue _performNextFromRunLoopSource] + 24
    29  CoreFoundation                      0x00000001062b8324 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
    30  CoreFoundation                      0x00000001062b826c __CFRunLoopDoSource0 + 172
    31  CoreFoundation                      0x00000001062b7a2c __CFRunLoopDoSources0 + 324
    32  CoreFoundation                      0x00000001062b20b0 __CFRunLoopRun + 788
    33  CoreFoundation                      0x00000001062b1960 CFRunLoopRunSpecific + 536
    34  GraphicsServices                    0x0000000117edfb10 GSEventRunModal + 160
    35  UIKitCore                           0x000000012868db40 -[UIApplication _run] + 796
    36  UIKitCore                           0x0000000128691d38 UIApplicationMain + 124
    37  ADClientTest                        0x0000000104609064 main + 140
    38  dyld                                0x00000001047cd410 start_sim + 20
    39  ???                                 0x000000010490a274 0x0 + 4371554932
)
libc++abi: terminating due to uncaught exception of type NSException
原因

iOS 18 对 UIView的maskView 增加了断言,导致如果业务代码里有同名属性可能导致触发该断言。

经测试发现:
1.自定义UIView子视图,存在同名属性maskView,会崩溃
2.自定义cell,添加到cell视图上会崩溃,添加到contentView上,则不会崩溃
3.控制器里的maskView视图属性,添加到控制器view,不会崩溃

解决办法

修改自定义视图,将自定义子组件名为maskView的视图进行重命名。

问题4:"__mh_execute_header", referenced from:

Undefined symbols for architecture arm64: "__mh_execute_header", referenced from:

报错信息

解决办法:

dladdr(&_mh_execute_header, &info); 修改为 dladdr(&_MH_EXECUTE_SYM, &info);

 参考链接:https://www.jianshu.com/p/cca4d4d8145d

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2167459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

<Java>String类型变量的使用

两边有一个string就是连接&#xff0c;否则做加法 ‘ ’是char&#xff0c;“ ”是string&#xff0c;char能做加法&#xff0c;string只能连接

STM32F407_05

RTC实时时钟 主要特性: 由于RTC实时时钟提供了三种时钟源可供选择(LSI,LSE,HSE) ,一般我们选择低速外部时钟源(32.768KHZ)来作为RTC的时钟源 另外&#xff0c;RTC实时时钟可以由系统主电源供电&#xff0c;但是也可以由备份电源供电&#xff08;系统主电源不工作时&#xff09…

微电网与大电网主动同步控制

前言 大电网正常运行时&#xff0c;微电网通过大电网得到正常的电压频率参数支撑&#xff0c;大电网故障时&#xff0c;微电网的电压和频率支撑需要通过分布式电源提供&#xff0c;从而保持自身独立运行。分布式电源提供的电压信息会因为自身的下垂特性随本地负荷的改变不断变…

leetcode331. 验证二叉树的前序序列化

序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时&#xff0c;我们可以记录下这个节点的值。如果它是一个空节点&#xff0c;我们可以使用一个标记值记录&#xff0c;例如 #。 例如&#xff0c;上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,…

【含文档】基于Springboot+Vue的高校师资管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

构建高效线上培训体系的知识库策略

在数字化时代&#xff0c;线上培训已成为企业提升员工技能、促进知识传递的重要手段。然而&#xff0c;如何构建一个高效、系统的线上培训体系&#xff0c;确保培训内容的准确性与时效性&#xff0c;是许多企业面临的共同挑战。其中&#xff0c;知识库作为培训资源的核心载体&a…

Arduino中实现定时器中断

1、使用MsTimer2库文件 使用之前需要先添加库 &#xff08;1&#xff09;实现功能 &#xff08;2&#xff09;代码 /*MsTimer2 is a small and very easy to use library to interface Timer2 withhumans. Its called MsTimer2 because it "hardcodes" a resolutio…

99页PPT | 智慧城市运营大数据平台解决方案

方案内容综述 这是一套综合性的解决方案&#xff0c;旨在通过先进的数据分析和处理技术&#xff0c;提升城市管理的智能化水平。平台基于运营商的运营理论构建&#xff0c;通过整合城市各个层面的数据资源&#xff0c;实现对城市运行状态的全面监测、分析和优化。 城市大数据公…

MySQL的登录、访问、退出

一、登录&#xff1a; 访问MySQL服务器对应的命令&#xff1a;mysql.exe ,位置&#xff1a;C:\Program Files\MySQL\MySQL Server 8.0\bin &#xff08;mysql.exe需要带参数执行&#xff0c;所以直接在图形界面下执行该命令会自动结束&#xff09; 执行mysql.exe命令的时候出…

【Linux】进程的标识符、状态(超详解)

目录 进程的概念 进程标识符PID 系统调用创建进程-fork初识 进程状态 R状态&#xff08;运行状态&#xff09; S&#xff0c;D状态&#xff08;休眠状态&#xff09; T&#xff0c;t状态 Z状态&#xff08;僵尸进程&#xff09; 孤儿进程 X状态&#xff08;死亡状态&a…

深度学习500问——Chapter15:异构计算,GPU和框架选型(1)

文章目录 异构计算&#xff0c;GPU和框架选型指南 15.1 什么是异构计算 15.2 什么是GPU 15.3 GPU架构简介 15.3.1 如何通俗理解GPU的架构 15.3.2 CUDA的核心是什么 15.3.3 为什么要使用GPU 异构计算&#xff0c;GPU和框架选型指南 深度学习训练和推理的过程中&#xff0c;会涉…

塑封芯片多大才需要点胶加固保护?

塑封芯片多大才需要点胶加固保护&#xff1f; 塑封芯片是否需要点胶加固保护&#xff0c;并不完全取决于芯片的大小&#xff0c;而是由多种因素共同决定的。以下是一些影响是否需要点胶加固保护的主要因素&#xff1a; 芯片的应用场景&#xff1a;如果芯片所处的环境较为恶劣&a…

四种msvcp120.dll丢失的解决方法,简单几步将丢失的msvcp120.dll修复

如果你在使用电脑的时候遇到了msvcp120.dll文件丢失的问题应该怎么办呢&#xff1f;如何修复丢失的msvcp120.dll的问题呢&#xff1f;今天那就和大家聊聊msvcp120.dll丢失的解决办法&#xff0c;详细说说msvcp120.dll的解决办法步骤。 修复“msvcp120.dll”丢失问题的详细方法 …

Vue3使用vue-quill富文本编辑器

安装依赖 npm install vueup/vue-quill quill quill-image-uploader自定义字体 把自定义字体样式放入font.css中在main.js中导入 .ql-snow .ql-picker.ql-font .ql-picker-label[data-valueSimSun]::before, .ql-snow .ql-picker.ql-font .ql-picker-item[data-valueSimSun]…

GitLab发送邮件功能详解:如何配置自动化?

GitLab发送邮件的设置指南&#xff1f;怎么优化GitLab发送邮件&#xff1f; GitLab作为一个强大的代码管理平台&#xff0c;不仅提供了代码托管、CI/CD等功能&#xff0c;还集成了发送邮件的功能&#xff0c;使得开发团队能够及时获取项目动态。AokSend将详细介绍如何配置GitL…

暗黑破坏神4第六赛季开荒攻略,如何高效开荒刷图打装备?

暗黑破坏神4的第六赛季将于10月8日开启&#xff01;要是你总觉得电脑开荒刷图打装备效率低&#xff0c;想知道有什么办法在手机上玩暗黑破坏神4&#xff1f;那这款专为游戏玩家打造的远程控制软件——网易GameViewer远程&#xff0c;就太适合你了&#xff01;不仅可以在手机上玩…

Linux下文件/目录操作的相关函数

1.文件系统 把一个磁盘分成一个或多个分区。每个分区可用包含一个文件系统 文件系统是&#xff0c;一组规则&#xff0c;规定对文件的存储及读取的一般方法。文件系统在磁盘格式化过程中指定。 常见的文件系统有&#xff1a;fat32 ntfs exfat ext2 、ext3 、ext4 inode是固定…

WSL进阶体验:gnome-terminal启动指南与中文显示问题一网打尽

起因 我们都知道 wsl 启动后就死一个纯命令行终端&#xff0c;一直以来我都是使用纯命令行工具管理Linux的。今天看到网上有人在 wsl 中启动带图形界面的软件。没错&#xff0c;就是在wsl中启动带有图形界面的Linux软件。比如下面这个编辑器。 ​​ 出于好奇&#xff0c;我就…

革新体验:细数3D在线预览在多个行业的广泛应用

‌3D在线预览展示技术的应用领域非常广泛&#xff0c;涵盖了从电子商务、产品设计、建筑设计到文化遗产保护等多个方面。‌ ‌1、电子商务‌&#xff1a; 在电商领域&#xff0c;3D展示技术为商品提供了全方位的展示&#xff0c;包括产品的外观、功能和卖点。这种交互式的购物…

影刀RPA实战:java结合影刀同步采购订单数据

1.实战目标 本次实战我们用java语言结合影刀&#xff0c;实现从自用ERP系统同步订单到旺店通中&#xff0c;在工作中&#xff0c;有时候我们的运营数据不是直接在旺店通ERP中操作&#xff0c;比如我们有自己的ERP&#xff0c;完成一些特定的内部工作后&#xff0c;再把数据同步…