如何在没有 URL 方案且不触摸非越狱 iDevice 上的图标的情况下启动应用程序?
Posted
技术标签:
【中文标题】如何在没有 URL 方案且不触摸非越狱 iDevice 上的图标的情况下启动应用程序?【英文标题】:How to launch Applications without URL Schemes and without touching the icon on a non jailbroken iDevice? 【发布时间】:2013-01-03 18:22:53 【问题描述】:我喜欢构建一个应用程序来查看没有 URL 方案的特定应用程序我听说过一个名为 SpringBoardServices 的框架,但总是有一个链接器错误
到目前为止,我将此代码与 SpringBoardServices.h 文件一起使用
SpringBoardServices.h:
#define SPRINGBOARDSERVICES_H
#if __OBJC__
#if __cplusplus
extern "C"
#endif
#include <CoreFoundation/CoreFoundation.h>
#include <Availability.h>
mach_port_t SBSSpringBoardServerPort();
#pragma mark -
#pragma mark Application launching
/// Launch an application given the display ID.
/// Equivalent to -[UIApplication launchApplicationWithIdentifier:suspended:].
/// @return 0 on success, nonzero on failure. Feed the result to SBSApplicationLaunchingErrorString() to get the error string.
int SBSLaunchApplicationWithIdentifier(CFStringRef displayIdentifier, Boolean suspended) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_3_0);
/// Launch an application for debugging.
/// The parameters are not known yet...
int SBSLaunchApplicationForDebugging(void* unknown, ...) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_3_0);
/// Get the error string from error code returned by SBSLaunchApplicationWithIdentifier().
CFStringRef SBSApplicationLaunchingErrorString(int error);
#pragma mark -
#pragma mark Watchdog assertion
typedef struct __SBSWatchdogAssertion* SBSWatchdogAssertionRef;
CFTypeID SBSWatchdogAssertionGetTypeID();
void SBSWatchdogAssertionCancel(SBSWatchdogAssertionRef assertion);
SBSWatchdogAssertionRef SBSWatchdogAssertionCreateForPID(CFAllocatorRef allocator, pid_t pid);
int SBSWatchdogAssertionRenew(SBSWatchdogAssertionRef assertion);
CFTimeInterval SBSWatchdogAssertionGetRenewalInterval(SBSWatchdogAssertionRef assertion);
#pragma mark -
CFArrayRef SBSCopyApplicationDisplayIdentifiers(Boolean onlyActive, Boolean unknown);
CFStringRef SBSCopyIconImagePathForDisplayIdentifier(CFStringRef dispIden);
CFStringRef SBSCopyLocalizedApplicationNameForDisplayIdentifier(CFStringRef dispIden);
/*
SB functions should be generated by MIG!
#pragma mark -
#pragma mark SB functions - Media
void SBSetMediaVolume(mach_port_t port, int volume) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_3_0);
void SBSetDisableNowPlayingHUD(mach_port_t port, Boolean disable) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_3_0);
void SBSetNowPlayingInformation(mach_port_t port, void* info);
#pragma mark -
#pragma mark SB functions - Accessibility
void SBSetZoomTouchEnabled(mach_port_t port, Boolean enable) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_3_0);
void SBSetDisplayColorsInverted(mach_port_t port, Boolean inverted) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_3_0);
#pragma mark -
#pragma mark SB functions - Remote
void SBApplicationSetSimpleRemoteRoutingPriority(mach_port_t port, int priority) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_3_0);
#pragma mark -
#pragma mark SB functions - Watchdog
void SBCancelWatchdogAssertionForProcess(mach_port_t port, pid_t pid, void* unknown);
void SBReloadApplication(mach_port_t port) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_3_0);
*/
#if __cplusplus
#endif
#endif
这是我在 ViewController.m 文件中使用的代码:
#import "SpringBoardServices.h"
-(IBAction)AdSheed
SBSLaunchApplicationWithIdentifier(CFSTR("com.apple.preferences"), false);
有人知道我该如何解决这个问题吗?
【问题讨论】:
您可以see this similar answer I posted了解如何使用SBSLaunchApplicationWithIdentifier()
。问题是它也要求您的应用程序具有特殊权利,而要做到这一点,我认为需要越狱(至少,我不知道如何添加它,没有越狱)。
【参考方案1】:
这是一个私有框架。你不应该使用它。如果不使用方案,您将无法做到这一点。
【讨论】:
我不打算将它提交到 AppStore,这是针对 Weblin、iPwnStore、iClaashStore、WebBreak 等替代 AppStores 的。而且一定有办法,因为一位优秀的德国开发人员告诉我这是可能的。 在这种情况下,我建议您在 goodgermandeveloperoverflow.com 上询问以上是关于如何在没有 URL 方案且不触摸非越狱 iDevice 上的图标的情况下启动应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
cocos2d-x 显示触摸操作(显示水波点击效果,用于视频演示)