Ответ 1
Благодаря пользователю ahruss очень полезная ссылка, вот решение, которое я нашел:
Я использовал метод, указанный в этом вопросе, для создания файла main.swift. Затем я создал файл AC (и заголовок), содержащий определение этого метода:
typedef int (*command_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
#if !defined(PT_DENY_ATTACH)
#define PT_DENY_ATTACH 31
#endif
//Anti-debug method
void disable_attach() {
void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
command_ptr_t command_ptr = dlsym(handle, "ptrace");
command_ptr(PT_DENY_ATTACH, 0, 0, 0);
dlclose(handle);
}
Я добавил заголовочный файл disableAttach.h в свой мостовой заголовок, а затем вызвал disable_attach()
прямо над моим UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate))
в main.swift.
Вы должны получить файл main.swift, подобный следующему:
import Foundation
import UIKit
disable_attach()
UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer<Int8>.self,
capacity: Int(CommandLine.argc)),
nil,
NSStringFromClass(AppDelegate.self)
)
Как я уже говорил ранее в комментарии, кажется, что жизненный цикл такой же, но директива @UIApplicationMain
скрывает основной файл.
ОБНОВЛЕНИЕ: Начиная с Xcode 10\iOS 12, файл main.swift должен выглядеть следующим образом:
UIApplicationMain(
CommandLine.argc, CommandLine.unsafeArgv,
nil, NSStringFromClass(AppDelegate.self)
)