- 客服
- UIAppearance
- NetworkExtension
- ATS
- 跳转到设置
- 链接
- 模拟器
- core image
- lldb
- 常用工具
- OTA
- dsymutil
- cputype cpusubtype
- ios 能力
客服
- https://developer.apple.com/support/D-U-N-S/cn/
- nomadli studio
- Room 0713, 840 Qinzhou Road, Xuhui District, Shanghai.
- Shanghai
- Shanghai
- 200233
- dzym79@gmail.com
- 请求ID是:102122-648680
- 20000027563488
-
- Xingyu intelligence
- 102122-653765
- 3001#12345#
UIAppearance
- 统一更换样式
NetworkExtension
- 连接VPN
- 代理
- 网络设置密码、权限验证
- 流量监控
- NEHotspotHelper
ATS
- ATS (App Transport Security)
- NSAppTransportSecurity NSAllowsArbitraryLoads NSExceptionDomains
- netname NSExceptionAllowsInsecureHTTPLoads true
- NSAppTransportSecurity NSAllowsArbitraryLoads true
- NSAppTransportSecurity AppTransportSecurity allow Arbitary Loads true
- NSAppTransportSecurity NSAllowsArbitraryLoadsInWebContent true
跳转到设置
- [[UIApplication sharedApplication] openURL:];
- wifi @”prefs:root=WIFI”
- gps @”prefs:root=LOCATION_SERVICES”
- faceTime @”prefs:root=FACETIME”
- music @”prefs:root=MUSIC”
- 墙纸 @”prefs:root=Wallpaper”
- 蓝牙 @”prefs:root=Bluetooth”
- icloud @”prefs:root=CASTLE”
链接
- -ObjC 所有oc符号
- -all_load 所有符号
- -force_load=xxx\xxx\xx.a
- -order_file 按照指定顺序排列符号
- -order_file_statistics 指定符号不存在警告输出
- lipo xx.a -thin arm64 -output xxx.a && ar -x xxx.a xxx.o 取静态文件 && ar -rv xx.a *.o合并
- objdump -r -section=__mod_init_func xxx.o 获取需要静态初始化的符号在linkmap查找符号的地址 地址起始 长度
- objdump -d –start-address=xxx –stop-address=xxx xxx 反汇编 bl指令是子函数调用命令
- ios系统日志
//打印库加载日志 os_log_t logger = os_log_create("bund-id", "category"); os_signpost_id_t signPostId = os_signpost_id_make_with_pointer(logger, sign); os_signpost_interval_begin(logger, signPostId, "Launch","%{public}s", ""); os_signpost_interval_end(logger, signPostId, "Launch");
模拟器
- xcrun xctrace list devices 显示模拟器列表
- xcrun instruments -w ‘iPhone X’ 运行某模拟器
- xcrun simctl install booted path/xx.app 安装 可以直接拖上去安装
core image
- [CIFilter filterNamesInCategories:@[kCICategoryBuiltIn]]; 获取支持的GL shader名称 nil 要所有的
- f = [CIFilter filterWithName:@”CIGaussianBlur”]; 根据需要的shader名称获取实例
- f.outputKeys f.inputKeys shader的输入输出参数名称
- f.attributes 输入输出参数的详细信息,最大最小值及其它
- [f setValue:10.0 forKey:”inputRadius”]; 根据名称设置shader的参数
- f.outputImage 获取输出图像CIIMage
- gl = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3]; 创建当前GL
- [CIContext contextWithEAGLContext:gl]; 将core image与gl关联, 可以互操作
lldb
- 源码->AST->LLVM IR->LLVM Bytecode->ASM->Native
- watchpoint set expression (int*)&intvalue 监控地址
- watchpoint set expression -w read – address 读监控
- watchpoint set expression -w read_write – address 读写
- watchpoint set expression -w write – address 写
- watchpoint set variable -w write -s byte_size 变量名
- watchpoint delete num
- watchpoint modify -c 表达式
- pro hand -p true -s false SIGABRT/… 允许信号xcode不中断指定信号
-
breakpoint br br set -r . -s 在指定项目中正则设置断点 - br set -n name 在指定名称上设置断点
- br set -S alignLeftEdges: 指定参数名设置断点
- br set -l num -f filename
- br set -a mem_address
- br set -F ‘functionname’ -c ‘((int*)$esp)[1] == 0xxxxx’ 模拟器
- br set -F ‘functionname’ -c ‘$r0 == 0xxxxx’ 设备
- br set –func-regex 函数正则
- br set –shlib xx.dylib –name funcname
-
br set –method –name “-[xxx xxx]” - br set –selector xxx 第OC所有的函数上设置断点
- br command add 断点序号
- br set -F funcname 对导出函数设置断点
- br xx -o condition
- br xx -i ignone_times
- br clear -l num -f filename
- br l 显示所有断点
-
expression expr expr $r6=1 设置r6寄存器的值 - expr $r6 显示r6寄存器值
- expr xxx = xxx
- x十六进制、d十进制 u十进制格无符号 o八进制 t二进制 a十六进制 i地址 c字符 f浮点
- b单字节 h双字节 w四字节 g八字节
-
expr 变量 表达式 显示变量或者表达式的值。 -
expr -f h – 变量 表达式 以16进制格式显示变量或表达式的内容 -
expr -f b – 变量 表达式 以二进制格式显示变量或者表达式的内容。 - expr -o – oc对象 等价于po oc对象
- expr -P 3 – oc对象 显示对象内数据成员的结构,P后面的数字展开显示的层次。
- expr my_struct->a = my_array[3] //给my_struct的a成员赋值。
- expr (char*)_cmd //显示某个oc方法的方法名。
- expr (IMP)[self methodForSelector:_cmd] //执行某个方法调用.
- expr @import UIKit 当po v.frame 错误时导入
- expr -i0 - function() 调用函数并且使 lldb 断点可用, call function() 会使用lldb的线程,如果设置断点会报异常
-
backtrace bt 打印调用栈 - frame info 当前帧信息
- frame select 0 选择栈帧
-
run r 运行程序 -
process continue c 继续执行 -
step s 源码单步并进入 -
stepi si 指令级别单步并进入 -
next n 源码单步 -
nexti ni 指令级单步 - finish 运行到函数返回
- return 直接从函数返回
- thread list 打印线程
- image list 显示所有库
- image list -f -o 模块列表
- image list -f -o xxx 查找SALR偏移
- image lookup -a 查找原始地址信息
- image lookup -r -n funcname 查找有调试符号的函数
- image lookup -r -s funcname 查找无调试符号的函数
- disassemble -a 地址 反汇编
-
disassemble -A thumbv4t thumbv5 thumbv5e thumbv6 thumbv6m thumbv7 thumbv7f thumbv7s thumbv7k thumbv7m 48umbv7em -
memory read 起始地址 结束地址 寄存器 -outfile filepath –binary -force - memory read -t type -c number c array
-
memory write 寄存器 地址 数据 - x address 读取内存显示为字符串
-
register read/x d 读寄存器显示为十六或十进制 - register write r9 数据 写寄存器
- display 表达式 每次单步执行后打印表达式的值
- po [xx.button allTargets] 找按钮事件函数
- p/x po/x x十六进制、d十进制 u十进制格无符号 o八进制 t二进制 a十六进制 i地址 c字符 f浮点
- xxx alias 别名
- 1st argument rdi oc函数是self
- 2nd argument rsi oc函数是 name of the method
- 3rd argument rdx
- 4th argument rcx
- 5th argument r8
- 6th argument r9
- 7th+ argument rsp+ (on the stack)
- command script import lldb.macosx.heap 系统自带内存脚本
- command script import sys 导入python库 script print sys.version 打印python版本
- command script import xx/xx/filename.py
- command script add -f filename.funcname aname
- command source path/lldbinit 重新加载脚本
```python
~/.lldbinit begin
command script import ~/xx.py
command script add -f xx.aaa aaa
command script import ~/yy.py
command script add -f yy.bbb bbb
plugin load /x/x/xxx.dylib
~/.lldbinit end
import lldb
import commands
import optparse
import shlex
def __lldb_init_module(debugger, internal_dict):
debugger.HandleCommand(‘command script add -f xx.print_frame print_frame’) print ‘The “print_frame” python commandis ready for use.’
def create_print_frame_options():
usage = “usage: %prog [options]”
description=’'’This command uses two parameters to filter frame printing.’’’
parser = optparse.OptionParser(description=description, prog=’print_frame’,usage=usage)
parser.add_option(‘-p’, ‘–prefix’, type=’string’, dest=’prefix’, help=’Class prefix to filter.’)
parser.add_option(‘-m’, ‘–message’, type=’string’, dest=’message’, help=’splite message.’)
return parser
def print_frame(debugger, command, result, internal_dict): command_args = shlex.split(command) parser = create_print_frame_options() try: (options, args) = parser.parse_args(command_args) except: result.SetError (“option parsing failed”) return
if options.message:
print >>result, "************ Tracing: %s %s" % (options.message," ************")
target = debugger.GetSelectedTarget()
process = target.GetProcess()
thread = process.GetSelectedThread()
for frame in thread:
if options.prefix:
if str(frame.GetFunctionName()).find(options.prefix) != -1:
print >>result, str(frame)
else:
print >>result, str(frame) ``` 73. 用lldb在命令行调试 ```shell (lldb) target create "xx/xx.app/Contents/MacOS/xxxx" (lldb) set set $(target.run-args xx xx) (lldb) run
ios ./debugserver *:1234 -a “YourAPPName” 附加进程 debugserver -x backboard *:1234 /Applications/MobileNotes.app/MobileNotes 直接启动进程
(lldb) platform select remote-ios (lldb) process connect connect://localhost:1234
brew install usbmuxd iproxy 2222 22 UUID ssh –p 2222 root@127.0.0.1
image list -o -f 查看模块基地址 image lookup -r -n funcname 找偏移 br s -a 基地址+偏移
## clang
01. clang -ccc-print-phases *.m 显示编译步骤
02. clang -E *.c | less 只执行到预处理
03. clang -Xclang -dump-tokens *.m 语法解析标记
04. clang -Xclang -ast-dump -fsyntax-only *.m 语法树
05. clang -S -fobjc-arc -emit-llvm *.m 生成IR中间代码, 前端完成
06. clang -O3 -emit-llvm \*.c -c -o *.bc 二进制码
07. llvm-dis < hello.bc | less 查看二进制码
08. clang -rewrite-objc *.m 转object 到 c 代码
09. clang -S -emit-llvm demo.c -o - | opt -analyze -dot-callgraph && dot -Tpng -ocallgraph.png callgraph.dot 生成函数调用关系
## bluetooth
01. CBCentralManager
02. CBPeripheral
03. CBCharacteristic
04. CBCentralManagerDelegate
05. CBPeripheralDelegate
06. CBPeripheralManager
07. CBMutableCharacteristic
08. CBPeripheralManagerDelegate
## Xcode 参数
- 文件模板头 /Users/xxx/Library/Developer/Xcode/UserData/IDETemplateMacros.plist
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>FILEHEADER</key>
<string>#if !(defined(DEBUG) || defined(Debug) || defined(_DEBUG))
#line 3 "___FILENAME___"
#endif
//
// ___FILENAME___
// ___PROJECTNAME___/___PACKAGENAME___
//
// Created by ___FULLUSERNAME___ on ___DATE___.
// Copyright © ___YEAR___ ___FULLUSERNAME___. All rights reserved.
//
</string>
</dict>
</plist>
- ArgumentsPassedonLaunchd AppleLanguages NSDoubleLocalizedStrings NSShowNonLocalizedStrings UIViewShowAlignmentRect -com.apple.CoreData.SQLDebug -com.apple.CoreData.SyntaxColoredLogging -com.apple.CoreData.MigrationDebug
- Environment Variables NSZombieEnabled NSDeallocateZombies MallocScribble MallocGuardEdges MallocStackLogging MallocStackLoggingNoCompact NSUnbufferedIO DYLD_PRINT_STATISTICSvalue 打印启动前耗时
-
/Library/LaunchAgents/***.plist BinaryOrderPreference integer-array RemoteServices dic NoEnvironmentVariables dic no_key value … key value PublishesEvents dic xxx com.apple.xpc.activity dic JetsamProperties dic JetsamMemoryLimit 4000 JetsamPriority -49 _AdditionalProperties dic RunningBoard dic VariableEUID true Version 1.0.47 SHAuthorizationRight system.preferences DisabledInSafeBoot true DrainMessagesAfterFailedInit true DrainMessagesOnFailedInit true POSIXSpawnType Adaptive|_AdaptiveUtility|Interactive AuxilliaryBootstrapper true MaterializeDatalessFiles true MultipleInstances true CFBundleIdentifier xxx EventMonitor true RunLoopType NSRunLoop MinimalBootProfile true BeginTransactionAtShutdown true HopefullyExitsLast true _LimitLoadFromBootMode fvunlock SessionCreate false _LimitLoadFromVariant IsRecovery EfficiencyMode Efficient BootShell true IgnoreProcessGroupAtShutdown true TransactionTimeLimitEnabled false _LimitLoadToVariant HasFullLogging CFBundleDevelopmentRegion English CFBundleInfoDictionaryVersion 6.0 CFBundleName name
xx.sh : RAMDISK_PATH=”/Volumes/build-disk” RAMDISK_SIZE=$((2048 * 512)) readonly RAMDISK_PATH if [ ! -d $”RAMDISK_PATH” ]; then diskutil erasevolume HFS+ “${RAMDISK_PATH##/}” (hdiutil attach -nomount ram://$RAMDISK_SIZE) else diskutil unmount “${RAMDISK_PATH##/}” fi ```xml <?xml version=”1.0” encoding=”UTF-8”?> <!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
04. 修改模板 Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates
05. \_\_\_FILEHEADER\_\_\_ 模板
新建 IDETemplateMacros.plist
key FILEHEADER
内容第一行会自动添加//
___FULLUSERNAME___ ___DATE___ ___YEAR___ ___COPYRIGHT___ ___FILENAME___
___PACKAGENAME___ ___ORGANIZATIONNAME___ ___PRODUCTNAME___
___PROJECTNAME___ ___TARGETNAME___ ___TIME___ ___WORKSPACENAME___
保存<ProjectName>.xcodeproj/xcuserdata/[username].xcuserdatad/ 当前工程
保存<ProjectName>.xcodeproj/xcshareddata/ 当前工程所用人
保存<WorkspaceName>.xcworkspace/xcuserdata/[username].xcuserdatad/当前项目
保存<WorkspaceName>.xcworkspace/xcshareddata/ 当前项目所有人
~/Library/Developer/Xcode/UserData/ 所有项目所用人
## symbole
- [carsh符号单独介绍](./2016-01-04-crash log.md)
- 静态库与其它库使用了相同的静态库,但版本不一样
- Symbols hidden by default Yes 所有符号私有
- Build Phases>Compile Sources>Compiler Flags 给需要导出符号的文件设置-fvisibility=default
- 或者在函数及类前添加 __attribute__((visibility("default")))
- Mach-O type选Relocatable Object File,将所有.o链接到一个.o进行符号隐藏
- Stripped Linked Product Yes 会删除所有设置为私有的符号
- 代码级隐藏 __attribute__((visibility("hidden")))
- 文件级隐藏 -fvisibility=hidden
## 签名
- security find-identity -v -p codesigning 列出所有可用证书
- codesign -f -s 'iPhone Developer: name (number)' path.app 签名
- codesign -vv -d path.app 查看签名信息
- codesign --verify path.app 校验签名 如果正确无任何输出
- codesign -vvv --deep --strict path.app 更可读的校验
- codesign -d --entitlements - path.app 查看授权
- codesign -dvv path.app 查看是否有安全时间戳
- pkgutil --check-signature path.pkg 查看pkg的签名
- security cms -D -i name.mobileprovision 查看配置文件信息
- spctl -vvv --assess --type exec path.app 查看app在安全策略下是否可以执行
- 服务器推送签名导出
证书公私钥导出p12(公钥 cer、私钥 key)
openssl x509 -in aps.cer -inform der -out public.pem
openssl pkcs12 -nocerts -out private.pem -in private.p12
openssl rsa -in private.pem -out private-noenc.pem 删除密码
cat public.pem private.pem > apns-dev.pem 合并密钥
## Date
1. x 数字时区 +0800、+08:00 (x,xx,xxx,xxxx,xxxxx)
2. a 上下午 AM/PM
3. A 今天的第多少毫秒
4. c 本周第几天(c,cc,ccc,cccc)
5. d 本月第几天
6. e 本周第几天 (e,EEE,EEEE)
7. F 本月第几周
8. g julian day (since 1/1/4713 BC)
9. G era designator (G=GGG,GGGG)
10. h hour (1-12, zero padded)
11. H hour (0-23, zero padded)
12. L month of year (L,LL,LLL,LLLL)
13. m minute of hour (0-59, zero padded)
14. M month of year (M,MM,MMM,MMMM)
15. Q quarter of year (Q,QQ,QQQ,QQQQ) 季节
16. s seconds of minute (0-59, zero padded)
17. S fraction of second 毫秒
18. u zero padded year 公元年
19. v general timezone (v=vvv,vvvv)
20. w week of year (0-53, zero padded)
21. y year (y,yy,yyyy)
22. z specific timezone (z=zzz,zzzz)
23. Z timezone offset +0000
## Draw
01. shouldRasterize后,CALayer会被光栅化为bitmap并做为贴图进入GPU内存,动态变化的Layer不能用,否则。。。
02. CATiledLayer将图层再次分割成独立更新的小块在多个线程中为每个小块同时调用-drawLayer:inContext:方法。
03. drawsAsynchronously属性对传入-drawLayer:inContext:延缓绘制命令的执行,命令加入队列,在后台线程真正绘制。
## simulator
01. 关机->cmd+r->开机->磁盘工具挂载主盘->控制台->mkdir /Volumes/Macintosh\ HD/AppleInternal
## 代码尺寸问题
- 修改代码段名
```shell
Other Linker Flags
-Wl,-rename_section,__TEXT,__cstring,__RODATA,__cstring
-Wl,-rename_section,__TEXT,__const,__RODATA,__const
-Wl,-rename_section,__TEXT,__objc_methname,__RODATA,__objc_methname
-Wl,-rename_section,__TEXT,__objc_classname,__RODATA,__objc_classname
-Wl,-rename_section,__TEXT,__objc_methtype,__RODATA,__objc_methtype
常用工具
- xcodebuild -list获取scheme、configration
- xcodebuild -project x.xcodeproj -scheme a -configuration Release CONFIGURATION_BUILD_DIR=’~/Desktop/build/arm’
- xcrun -sdk iphoneos -v PackageApplication x.app -o x.ipa
- libtool -static -o 3.a 1.a 2.a
- ar -d lib.a conflict.o 删除
- arm neon 指令集
- Drafter 代码阅读、调用关系
- Infer 静态分OC、Java、C
- xcpretty xcodebuild输出格式化工具
OTA
- ipa 企业帐号签名,用户只需信任企业开发者就能安装
- adhoc 须要描述文件中包含的设备才能安装
- icon 1024x1024 和 57x57
- manifest.plist ```xml <?xml version=”1.0” encoding=”UTF-8”?> <!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
- html 静态页面
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>标题</title>
</head>
<body>
<a href="itms-services://?action=download-manifest&url=manifest.plist的地址">点击安装</a>
</body>
</html>
dsymutil
-
dsymutil -s /x/x grep N_OSO 判断是否debug版本
cputype cpusubtype
- armv7k 12 (CPU_TYPE_ARM) 12(CPU_SUBTYPE_ARM_V7K)
- arm64 16777228(CPU_TYPE_ARM64) 0 (CPU_SUBTYPE_ARM64_ALL)
- arm64_32 33554444(CPU_TYPE_ARM64_32) 1 (CPU_SUBTYPE_ARM64_32_V8)
- i386 7 (CPU_TYPE_I386) 3 (CPU_SUBTYPE_I386_ALL)
- x86_64 16777223(CPU_TYPE_X86_64) 3 (CPU_SUBTYPE_X86_64_ALL)
otool -h xxx
lipo -detailed_info xxx
xxd -s 8 -l 8 -c 16 xxx
ios 能力
- ❌5G Network Slicing 5G网络切片可以虚拟多链路网络、多播等, 与运营商有关
- ✅Access Wi-Fi Information 获取当前链接的wifi信息的权利
- ❌App Attest 通过服务器判断是否app被串改或重新打包
- ✅App Groups共享资源
- ❌Apple Pay Later Merchandising 支持分期付款
- ❌Apple Pay Payment Processing 苹果支付追踪
- ❌Associated Domains 网站链接唤起App
- ✅AutoFill Credential Provider为其它App提供自动填充输入的功能比如password1
- ✅ClassKit使App可以跟苹果自己的课堂App链接提供教学服务
- ❌Communication Notifications自定义推送图标
- ❌Custom Network Protocol自定义网络2层协议
- ✅Data Protection应用数据保护, 选择数据保护的基本
- ✅DriverKit (development)最底层设备驱动开发接口
- ✅DriverKit Allow Third Party (development)UserClients驱动使用授权
- ✅DriverKit Communicates with Drivers(development)驱动与app通信
- ✅DriverKit Family Audio (development)
- ✅DriverKit Family HID Device (development)
- ✅DriverKit Family HID EventService (development)
- ✅DriverKit Family Networking (development)
- ✅DriverKit Family SCSIController (development)
- ✅DriverKit Family Serial (development)
- ✅DriverKit Transport HID (development)
- ✅DriverKit USB Transport (development)
- ✅Extended Virtual Addressing 使用扩展内存地址空间
- ✅Family Controls (Development) 家长控制
- ✅FileProvider Testing Mode 测试使用, 为三方提供文件服务
- ✅Fonts安装三方字体, 所有App都可以使用
- ✅Game Center游戏榜单等功能
- ✅Group Activities 类组播利用FaceTime一起看电影
- ✅HealthKit健康和健身数据 勾选后只会出现在iphone和watch的应用商店
- ✅HealthKit Estimate Recalibration 允许重新校准算法
- ✅HLS Interstitial Previews多媒体广告插入
- ✅Low Latency HLS启用低延时流媒体协议
- ✅HomeKit访问智能网络设备
- ✅Hotspot使用热点管理器配置wifi网络
- ✅iCloud使用apple网络存储
- ❌ID Verifier - Display Only符合 ISO18013-5 标准的ID卡 身份证
- ✅In-App Purchase App内购
- ✅Increased Memory Limit 尝试要求系统提高应用最大内存限制
- ✅Inter-App Audio 音频播放类App与系统交互
- ✅Journaling Suggestions 个人事件选取器, 比如刚刚截屏让其选择截图, 刚刚接电话选取来电号码
- ✅Manage Thread Network Credentials (development) 控制无线网状网络如homepod仅测试开发,单独申请权限
- ✅Managed App Installation UI 启用托管应用, 如企业内部应用在app stroe托管,可以管理用户是否可启动
- ✅Maps 应用提供地图导航服务
- ✅Matter Allow Setup Payload允许通过二维码添加智能网络设备
- ✅MDM Managed Associated Domains SSO单点登陆、设备登陆允许、自动填充允许等
- ✅Media Device Discovery 在本地网络或蓝牙设备中搜索第三方媒体接收器
- ✅Messages Collaboration 通过iMessage增强用户交互
- ✅Multipath 使用多路径协议, 在wifi和移动网络选择更快链接成功的网络
- ✅Network Extensions IP栈扩展
- ✅NFC Tag Reading NFC读取, 不支持模拟ID IC
- ❌On Demand Install Capable for App Clip Extensions内嵌轻应用
- ✅Personal VPN 创建修改系统VPN权限
- ❌Push Notifications 推送接收
- ❌Push to Talk 推送直接语音文字聊天, 如果ip电话
- ✅Sensitive Content Analysis 视频、照片显示前提供成人内容检查
- ✅Shallow Depth and Pressure访问设备浸入水中的数据, 如水压、深度、温度
- ✅Shared with You与其它App共享内容
- ✅Sign In with Apple用苹果ID登陆,可以用于本地锁
- ✅Siri 支持Siri控制app
- ✅Sustained Execution让系统限制App突发的性能飙升
- ✅System Extension 控制Macos一些系统设置
- ✅Time Sensitive Notifications 紧急通知, 可以后台运行本地通知
- ✅User Management 区分Apple TV 上多个用户的权利
- ✅VMNet 虚拟机网络配置接口
- ✅Wallet 管理钱包 车票、发票等
- ✅WeatherKit 天气数据接口
- ✅Wireless Accessory Configuration 配置使用MFi Wi-Fi与硬件连接
- ✅Mac Catalyst macos版本的ipad应用跟cpu架构无关