Ответ 1
Ответ немного зависит от того, подходит ли это для приложения, которое просто не будет отправлено в App Store (корпоративное приложение или личное/хобби-приложение), или будет ли он выполняться на телефонах с вредоносными программами.
Если вы можете полагаться на джейлбрейк-телефон и утилиты для джейлбрейка, такие как MobileSubstrate, то я считаю, что вы можете реализовать метод, чтобы открыть Siri так же, как Ryan Petrich libActivator делает, поскольку я показываю в этом другом ответе.
Однако, если вы строите для обычных, заключенных в тюрьму телефонов, я все же думаю, что вы можете "взломать" его (с помощью Private API), смоделируя способ, которым пользователь открывает Siri. Сначала нажмите кнопку "Домой", удерживайте ее немного, затем отпустите.
Этот код работает для меня (iOS 6.1):
#import "GSEvent.h"
и
- (void)launchSiri {
[self simulateTouchEvent: kGSEventMenuButtonDown];
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self simulateTouchEvent: kGSEventMenuButtonUp];
});
}
- (void)simulateTouchEvent: (GSEventType)type
{
struct GSEventRecord record;
memset(&record, 0, sizeof(record));
record.type = type;
record.timestamp = GSCurrentEventTimestamp();
GSSendSystemEvent(&record);
}
Это зависит от наличия заголовка GSEvent.h, который не является частью публичного набора заголовков. По-моему, я получил здесь а также GSWindow.h, который он втягивает. Очевидно, что вам нужно будет загрузить эти два заголовка и добавить их в свой проект.
Этот код находится в частной структуре GraphicsServices, поэтому вам также необходимо добавить эту инфраструктуру в свой проект. Сделайте это так же, как добавление обычной рамки, но вам нужно найти где-то вроде
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/PrivateFrameworks/GraphicsServices.framework
чтобы найти его (путь отредактирован для вашего установочного каталога Xcode и SDK).
Отказ от ответственности: я тестировал это на джейлбрейк-телефоне, но он определенно находился в обычном приложении, установленном в области песочницы /var/mobile/Applications/
, и я на 99% уверен, что не сделал ничего, что зависит на том, что он был взломан.