Сенсорные уведомления iOS 7

Я хочу получить x, y координаты прикосновения. Я пробовал это решение, но оно не работает для IOS 7. Я получаю следующую ошибку:

Tweak.xm:96:2: ошибка: нет соответствующей функции для вызова 'IOHIDEventSystemClientScheduleWithRunLoop' IOHIDEventSystemClientScheduleWithRunLoop(ioHIDEventSystem, CFRu... ^~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~ /home/agiera/theosprojects/phoneit/theos/include/IOKit/hid/IOHIDEventSystemClient.h:72:7: примечание: функция-кандидат не работает: невозможно преобразовать аргумент неполного типа 'void *' в 'IOHIDEventSystemClientRef' (также известный как '__IOHIDEventSystemClient *') ioHIDEventSystem, ха... ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/ home/agiera/theosprojects/phoneit/theos/include/IOKit/hid/IOHIDEventSystemClient.h:68:7: примечание: функция-кандидат не работает: невозможно преобразовать аргумент неполного типа 'void *' в 'IOHIDEventSystemClientRef' (он же '__IOHIDEventSystemClient *') void IOHIDEventSystemClientRegisterEventCallback(IOHIDEventSyste... ^ 2 ошибки.

Есть ли обновленная реализация или другие средства для получения этой функциональности для IOS 7?


редактировать:

код:

#include <IOKit/hid/IOHIDEventSystem.h>
#include <IOKit/hid/IOHIDEventSystemClient.h>
#include <stdio.h>
//Touch Events
void handle_event (void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) {
    NSLog(@"handle_event : %d", IOHIDEventGetType(event));
    if (IOHIDEventGetType(event)==kIOHIDEventTypeDigitizer){
        IOHIDFloat x=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerX);
        IOHIDFloat y=IOHIDEventGetFloatValue(event, (IOHIDEventField)kIOHIDEventFieldDigitizerY);
        NSLog(@" x %f : y %f", x, y);
    }
}

static void initTouchEventHandling() {
    void *ioHIDEventSystem = IOHIDEventSystemClientCreate(kCFAllocatorDefault);

    IOHIDEventSystemClientScheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
    IOHIDEventSystemClientRegisterEventCallback(ioHIDEventSystem, handle_event, NULL, NULL);
    IOHIDEventSystemClientUnregisterEventCallback(ioHIDEventSystem, handle_event, NULL, NULL);
    IOHIDEventSystemClientUnscheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
}

initTouchEventHandling вызывается в моем конструкторе. Я добавил IOKit в свой личный фреймворк и внедрил это исправление.


редактировать2:

Я думаю, что что-то не так с тем, как я добавляю фреймворк IOKit. Пробовал менять на более старую версию, та же ошибка. Затем я попытался удалить его полностью и получил те же ошибки. Может быть, кто-то может что-то исправить в моем make-файле:

ARCHS = armv7 arm64
TARGET = iphone:clang:latest:7.0

export THEOS_DEVICE_IP = 192.168.1.104

include theos/makefiles/common.mk

TWEAK_NAME = phoneit
phoneit_FILES = Tweak.xm
phoneit_FRAMEWORKS = UIKit QuartzCore
phoneit_PRIVATE_FRAMEWORKS = IOKit

include $(THEOS_MAKE_PATH)/tweak.mk

after-install::
    install.exec "killall -9 SpringBoard"
SUBPROJECTS += prefs
include $(THEOS_MAKE_PATH)/aggregate.mk

person user2089636    schedule 26.08.2014    source источник
comment
Можете ли вы опубликовать код о том, как вы получаете координаты. stackoverflow.com/a/15633639/334091 проверьте это тоже   -  person Tamil    schedule 26.08.2014
comment
Я получил ту же ошибку, используя это. Как вы думаете, может ли это исправить замена моего iokit версией xcode 4? Есть известные проблемы с iokit из xcode 5, но не только у меня.   -  person user2089636    schedule 26.08.2014


Ответы (2)


Вы можете написать свой код следующим образом в initTouchEventHandling() :

static void initTouchEventHandling() {

    IOHIDEventSystemClientRef ioHIDEventSystem = IOHIDEventSystemClientCreate(kCFAllocatorDefault);

    IOHIDEventSystemClientScheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
    IOHIDEventSystemClientRegisterEventCallback(ioHIDEventSystem, (IOHIDEventSystemClientEventCallback)handle_event, NULL, NULL);

    //add other custom code...
}

Этот метод работает для меня. Надеюсь, что это поможет вам.

person wugensan    schedule 10.12.2014
comment
Не могли бы вы опубликовать пример makefile и импорта? И, может быть, также ваш источник файлов заголовков? Мой компилятор не распознает эти классы. - person user2089636; 14.12.2014

У вас есть два способа получить местоположение касания пользователя:

1- Использование метода touchesBegan:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  UITouch *touch = [touches anyObject];

  // Get the specific point that was touched
  CGPoint point = [touch locationInView:self.view]; 
  NSLog(@"X location: %f", point.x);
  NSLog(@"Y Location: %f",point.y);

}

2- Использование UITapGestureRecognizer:

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTapped:)];
[tapRecognizer setNumberOfTapsRequired:1];
[tapRecognizer setDelegate:self];
[self.view addGestureRecognizer:tapRecognizer];
person Mutawe    schedule 26.08.2014
comment
Спасибо за ваш код. Я должен был быть более четким, хотя. Я делаю настройку cydiasubstrate и хочу получить местоположение касания из любого места, включая экран блокировки и клавиатуру. У меня есть представление системного изображения, к которому я мог бы подключить распознаватель жестов, или класс, к которому я мог бы подключить метод touchesBegan, который не испортил бы ситуацию? Спасибо - person user2089636; 26.08.2014