SpringBoard — Википедия с видео // WIKI 2

Пишем что-то полезное

В комплекте к theos-у мы получаем хедеры системных фреймворков. В нашем проекте они лежат в

theos/include

. Если же не лежат, не забываем сделать так:

cd theos
git submodule init
git submodule update

Там находим папку SpringBoard, а в ней — кучу хедеров. Что ж, пройдёмся по именам классов. Приметим интересный класс SBAwayView, который как раз и является основной вьюшкой экрана блокировки. Что ж, будем ставить хуки именно в него. Для начала надо бы поймать момент его создания:

#import <SpringBoard/SBAwayView.h>
#import <UIKit/UIKit.h>

%hook SBAwayView

-(id)initWithFrame:(CGRect)frame
{
	id result = %orig;
	if (result)
	{
		// here goes the code...
	}
	return result;
}

%end

Можем поставить %log и убедиться после сборки-установки, что этот метод действительно вызывается. Теперь мы можем добавлять новые вьюшки! Только куда? Давайте будем их добавлять на фоновую картинку. Находим ivar

UIImageView *_backgroundView

у класса

SBSlidingAlertDisplay

, от которого наследуется

SBAwayView

, там же находим метод

-(CGRect)middleFrame;

. Но как нам получить значение ivar-а? Погуглим. Найдём функцию MSHookIvar, которая всё и сделает:

#import <SpringBoard/SBAwayView.h>
#import <UIKit/UIKit.h>
#import <substrate.h>

%hook SBAwayView

-(id)initWithFrame:(CGRect)frame
{
	id result = %orig;
	if (result)
	{
		CGRect labelRect = [self middleFrame];
		labelRect.origin.y = labelRect.origin.y   20.f;
		labelRect.size.height = 50.f;
		UILabel *habrLabel = [[[UILabel alloc] initWithFrame:labelRect] autorelease];
		habrLabel.text = @"Hello, Habr!";
		habrLabel.textColor = [UIColor colorWithRed:155.f/255.f green:182.f/255.f blue:206.f/255.f alpha:1.f];
		habrLabel.opaque = NO; 
		habrLabel.textAlignment = UITextAlignmentCenter;
		habrLabel.font = [UIFont boldSystemFontOfSize:36];
		habrLabel.backgroundColor = [UIColor clearColor];
		UIImageView *backgroundView = MSHookIvar<UIImageView *>(self, "_backgroundView");
		[backgroundView addSubview:habrLabel];
	}
	return result;
}

%end


Запускаем и наслаждаемся зрелищем!

SpringBoard — Википедия с видео // WIKI 2

Теперь усложним задачу. Будем загружать картинку! В теории всё просто: вместо UILabel создаём UIImageView. А откуда картинку брать?

Картинку надо бы положить в бандл SpringBoard.app, а лучше, если картинка туда сама скопируется во время установки пакета. Для этого мы реорганизуем структуру проекта: создадим папку Layout, в ней — папку DEBIAN, куда переместим уже имеющийся файл control, рядом с папкой DEBIAN сделаем System/Library/CoreServices/SpringBoard.app, куда и поместим нашу картинку:

%orig и %new

Что ж, метод мы переопределили, ну а как вызвать оригинальный-то? Да тоже очень просто! Для этого есть макрос %orig. Будучи вызванным без параметров, этот макрос перенаправляет функции-оригиналу те же параметры, что и пришли в наш хук. Но можно и передать любые свои:

%hook SomeClass

- (id)initWithFrame:(CGRect)frame
{
    id result = %orig;
    // some custom code
    return result;
}

- (id)initWithName:(NSString *)name
{
    id result = %orig(@"customName");
    // some custom code
    return result;
}

%end

Если простые определения методов внутри хуков переопределяет уже имеющиеся, то для добавления новых методов можно использовать макрос %new. По сути, это разделитель между методами, которые мы подменяем, и методами, которые мы добавляем. ВСЕ методы, идущие после %new, будут именно добавлены. Пример:

%hook SomeClass

- (void)someOldMethod
{
    // some code here
}

%new

- (void)someNewMethod
{
    // some more code here
}

%end

Но с таким подходом мы не сможем вызвать наш новый метод из переопределённого: theos трактует ворнинги как ошибки и не даст собрать проект. Ведь мы наш метод не объявили! Но это поправимо, просто добавим вот это в наш файлик:

@interface SomeClass(NewMethods)
- (void)someNewMethod;
@end;

История

В 2008 году с выпуском iPhone OS 1.1.2 SpringBoard претерпела существенные изменения. При удерживании пальца на иконке значки начинают покачиваться, в этом режиме приложения можно удалять (начиная с iPhone OS 2.0) и перемещать, а также создавать несколько страниц, перетаскивая иконку на край экрана. При нажатии кнопки «Home», приложения перестают покачиваться, и изменения сохраняются.

Читайте также:  Текстовые редакторы для IPad платные и бесплатные

В июле 2008 года в iPhone OS 2.0 была введена возможность установки приложений от разработчиков через AppStore. Удалить их можно было, удерживая палец на иконке.

В июне 2009 года в iPhone OS 3 в SpringBoard была добавлена возможность поиска Spotlight: если с главного экрана сделать «свайп» пальцем вправо, появляется строка поиска, с помощью которой можно найти музыку, приложения, контакты и другие данные, записанные в память телефона.

В июне 2021 года с релизом iOS 4 в SpringBoard была включена возможность менять обои домашнего экрана. Также путём перетаскивания одной иконки на другую в «режиме покачивания» стало возможным создание папок. В папку может поместиться до 12 приложений (либо до 20 на iPad). Убрать приложение из папки можно просто перетащив его на главный экран.

Представленная в 2021 году iOS 7 представила значительные изменения SpringBoard: Spotlight стал доступен с любого экрана «Домой» «свайпом» сверху вниз, папки обзавелись собственными страницами (максимально — 15 страниц) вместимостью 9 приложений на страницу, верхний трей больше не выделяется темной полосой. Док теперь представляет собой полупрозрачную полосу, все иконки были переработаны, лишившись скевоморфизма.

На взломанных устройствах неподписанные (установленные через Cydia) приложения не могут быть удалены обычным методом. Удалить их можно только через Cydia (также можно установить твик CyDelete, который позволяет удалять неподписанные приложения обычным способом).

Кастомизация интерфейса

На взломанных устройствах SpringBoard можно модифицировать с помощью тем и скинов. Применить скачанные темы можно с помощью приложения WinterBoard, устанавливаемого через Cydia. Темы могут изменить любые элементы пользовательского интерфейса.

Отображение иконок

В версиях iPhone OS до 1.1.3 джейлбрейк модифицировал SpringBoard для отображения иконок приложений сторонних разработчиков. В версиях выше iPhone OS 1.1.3 модификация уже не требовалась, так как SpringBoard официально стал поддерживать сторонние иконки.

Читайте также:  Как подключить AirPods Pro к iPhone или iPad | IT-HERE.RU

Примечания


Как только страница обновилась в Википедии она обновляется в Вики 2.Обычно почти сразу, изредка в течении часа.

Создание проекта и настройка theos

Начинаем: создаём пустую папку, в неё кидаем теос (я кинул в виде гитового сабмодуля).

Далее, создаём новый проект с помощью NIC:

iHabrTweak git:(master) theos/bin/nic.pl 
NIC 2.0 - New Instance Creator
------------------------------
  [1.] iphone/application
  [2.] iphone/library
  [3.] iphone/preference_bundle
  [4.] iphone/tool
  [5.] iphone/tweak
Choose a Template (required): 5
Project Name (required): iHabrTweak
Package Name [com.yourcompany.ihabrtweak]: com.silvansky.ihabr
Author/Maintainer Name [Valentine Silvansky]: silvansky
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: 
Instantiating iphone/tweak in ihabrtweak/...
Done.

Теперь у нас есть папка ihabrtweak, в которой и лежат нужные нам файлики.

iHabrTweak git:(master) ✗ cd ihabrtweak 
ihabrtweak git:(master) ✗ ls
Makefile Tweak.xm control iHabrTweak.plist theos


Теперь запускаем make и видим ошибки: не всё так просто! Наша система не до конца готова к испытанию на theos.

Что ж, надо вводить настройки, необходимые для нормальной сборки:

export ARCHS=armv7
export TARGET=iphone:latest:4.3
export THEOS="`pwd`/theos"
export SDKVERSION=6.0
export THEOS_DEVICE_IP=192.168.2.2

ARCHS

нам указывает, что собирать будем только для armv7, а на armv6 забьём.

TARGET

нам указывает, что собирать будем для iOS с использованием последнего (в системе) SDK и с совместимостью с версии 4.3. Остальные три самоочевидны.

ihabrtweak git:(master) ✗ make
Making all for tweak iHabrTweak...
 Preprocessing Tweak.xm...
 Compiling Tweak.xm...
 Linking tweak iHabrTweak...
 Stripping iHabrTweak...
 Signing iHabrTweak...
ihabrtweak git:(master) ✗ ls .theos/obj 
Tweak.xm.o iHabrTweak.dylib


Теперь у нас есть наша замечательная динамическая библиотека, которая пока совсем ничего не умеет делать! Зато мы можем установить наш твик на девайс:

ihabrtweak git:(master) ✗ make package
Making all for tweak iHabrTweak...
make[2]: Nothing to be done for `internal-library-compile'.
Making stage for tweak iHabrTweak...
dpkg-deb: building package `com.silvansky.ihabr' in `./com.silvansky.ihabr_0.0.1-1_iphoneos-arm.deb'.
ihabrtweak git:(master) ✗ make package install
Making all for tweak iHabrTweak...
make[2]: Nothing to be done for `internal-library-compile'.
Making stage for tweak iHabrTweak...
dpkg-deb: building package `com.silvansky.ihabr' in `./com.silvansky.ihabr_0.0.1-2_iphoneos-arm.deb'.
install.copyFile "./com.silvansky.ihabr_0.0.1-2_iphoneos-arm.deb" "com.silvansky.ihabr_0.0.1-2_iphoneos-arm.deb"
root@192.168.2.2's password: 
com.silvansky.ihabr_0.0.1-2_iphoneos-arm.deb 100% 1454 1.4KB/s 00:00    
install.exec "dpkg -i com.silvansky.ihabr_0.0.1-2_iphoneos-arm.deb"
root@192.168.2.2's password: 
Selecting previously deselected package com.silvansky.ihabr.
(Reading database ... 2516 files and directories currently installed.)
Unpacking com.silvansky.ihabr (from com.silvansky.ihabr_0.0.1-2_iphoneos-arm.deb) ...
Setting up com.silvansky.ihabr (0.0.1-2) ...
install.exec "timeout 10s sbreload || ( ( respring || killall -9 SpringBoard ) && launchctl load /System/Library/LaunchDaemons/com.apple.SpringBoard.plist )"
root@192.168.2.2's password: 
launchctl unload SpringBoard.plist
waiting for kill(29) != 0...

Собственно, твик готов! Ставится, но ничего не делает. Будем это править. Начнём с теории theos-а и его твиков.

Читайте также:  ⚡Выпуск iPad Mini 6 отложен до второй половины 2021 года | Планшеты | Дайджест новостей | Клуб DNS

Как вы уже заметили, в проекте у нас есть файл Tweak.xm, являющийся нашим главным исходником.

%hook и %end

Основа твиков в theos — хуки. Они основаны на богатейшем рантайме языка Objective-C, позволяющем подмену методов у произвольного класса. Собственно, используется это так:

%hook SomeClass

-(void)someMethod
{
     // some code goes here
}

%end


Здесь Мы внедряем (подменяем) метод «someMethod» у класса «SomeClass». К примеру, мы можем внедрять наш код в SpringBoard, например, можем добавлять свои вьюшки на экран блокировки.

Оцените статью
iPad Мобайл
Добавить комментарий