как открыть телефонное приложение без схемы URL в iOS

Я работаю над настройкой экрана блокировки. В моем пользовательском представлении экрана блокировки есть кнопка, которую вы можете использовать для блокировки и открытия родного приложения для телефона. Я использую IDE iOSOpenDev.

Я пробовал эти методы:

  1. Схема URL: я не хочу отображать циферблат, поэтому забросил.

  2. SBSLaunchApplicationWithIdentifier. Это самый популярный метод, например:

void* sbServices = dlopen("/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices", RTLD_LAZY);
int (*SBSLaunchApplicationWithIdentifier)(CFStringRef identifier, Boolean suspended) =
   dlsym(sbServices, "SBSLaunchApplicationWithIdentifier");
int result = SBSLaunchApplicationWithIdentifier((CFStringRef)bundleId, false);
dlclose(sbServices);

но в файле .xm мне компилятор говорит

Невозможно инициализировать переменную типа "int (*)(CFStringRef, Boolean)" с rvalue типа "void *"".

Как я могу это сделать? Спасибо!


person user2822881    schedule 28.10.2013    source источник


Ответы (1)


Я не уверен, какой компилятор вы используете, который выдает эту ошибку... Компилятор Apple LLVM (4.2 или 5.0) принимает показанный вами код без проблем.

Но, я думаю, вы должны просто исправить эту ошибку компиляции, приведя возвращаемое значение dlsym() к (int (*)(CFStringRef, Boolean)):

int (*SBSLaunchApplicationWithIdentifier)(CFStringRef identifier, Boolean suspended) =
   (int (*)(CFStringRef, Boolean))dlsym(sbServices, "SBSLaunchApplicationWithIdentifier");
person Nate    schedule 28.10.2013
comment
Я добавил эти слова (int (*) (CFStringRef, Boolean)), но iphone был бы зомби, вы должны принудительно перезагрузить компьютер. - person user2822881; 28.10.2013
comment
Это приведение исправит ошибку компилятора, которую вы указали в своем вопросе. Если ваш твик крашит ваше устройство, то это отдельная проблема. - person Nate; 28.10.2013
comment
Должен ли я добавить файл прав для настройки? - person user2822881; 29.10.2013
comment
Мой код такой:%new(v@:) -(void)httpButtonPressed{ int (openApp)(CFStringRef, Boolean); void sbServices = dlopen(/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices, RTLD_LAZY); openApp= (int(*)(CFStringRef, Boolean))dlsym(sbServices, SBSLaunchApplicationWithIdentifier); openApp(CFSTR(com.apple.Preferences), ЛОЖЬ); dlclose(sbServices); } - person user2822881; 29.10.2013
comment
Пожалуйста, не публикуйте новые вопросы/код здесь, в комментариях. Во-первых, вы можете прочитать код, который вы разместили выше? Я не могу. Во-вторых, этот вопрос касался того, как исправить ошибку компилятора. Я сказал вам, как. Пожалуйста, примите этот ответ, нажав на значок V рядом с вопросом. Если у вас есть дополнительные вопросы по этому проекту, опубликуйте новый вопрос. Что касается прав, это зависит от того, в какое приложение вводится ваш код. Если приложение, в котором оно работает (например, SpringBoard), уже имеет право запускать приложения, вам не нужно ничего добавлять. Если нет, то у вас проблемы. - person Nate; 29.10.2013
comment
Что касается прав снова, если ваш код работает без прав, он просто не сможет успешно открыть приложение. Отсутствие права не приведет к сбою. - person Nate; 29.10.2013
comment
Но у меня был этот журнал: Права com.apple.springboard.launchapplications, необходимые для использования kern_return_t _SBXXLaunchApplication(...). Означает ли это, что мне нужно кодировать dylib с правом - person user2822881; 31.10.2013
comment
@ user2822881, я ответил на ваш другой вопрос. - person Nate; 31.10.2013