在iPhone SDK中编程打开蓝牙?

18

我看到了很多关于这个问题的提问,但实际上没有人提供真正的答案(需要导入哪些框架、实际代码等)。他们只是说使用私有API会导致您的应用程序被App Store拒绝。

我知道使用私有API会导致我的应用程序被拒绝,但我想知道如何在个人使用情况下做到这一点。(iPhone SDK 3.1.2,iPod touch 2g)

6个回答

10

我也一直在研究这个问题。你需要在项目中包含bluetoothmanager框架和头文件。它应该在

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/System/Library/PrivateFrameworks/BluetoothManager.framework/

如果没有相应的头文件,你需要获取从库生成的.h文件并将其包含到你的项目中。我用谷歌找到了一个,这是其中一个链接:

http://iphone-dev.googlecode.com/svn/branches/include-1.2-sdk/include/BluetoothManager/

当这些添加到你的项目后,如果头文件已经在框架中,你的导入应该像这样:

#import <BluetoothManager/BluetoothManager.h>

如果你已经将自己的BluetoothManager.h文件添加到项目中,则可以使用以下方法:

#import "BluetoothManager.h

以下是切换蓝牙的代码:

BluetoothManager *manager = [BluetoothManager sharedInstance];
[manager setEnabled:![manager enabled]];    

我已经构建了一个实用程序来完成这个操作,并且它能够工作。请注意,如果你只想创建一个不带任何用户界面的蓝牙切换实用程序并退出,请在XCode中创建一个新项目并使用基于窗口的应用模板。将代码添加到didFinishLaunchingWithOptions方法中,并将 [window makeKeyAndVisible] 替换为 exit(0)


1
只是一个更新。这个解决方案在OS 3.x上运行得很好,但在iOS 4.0停止工作了。 - Nate
我找到了诀窍,它适用于iOS 4.3.5。从指定的网站下载头文件,然后不要将其放入您的项目中,而是只需复制到PrivateFramework中! 您需要在/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/PrivateFrameworks/BluetoothManager.framework/下创建“Headers”文件夹,然后复制所有下载的4个文件,然后在您的项目中导入BluetooothManager框架(您需要选择使用“添加其他”,然后上述代码即可运行! - Achille
@Achille,你能告诉我你的导入语句到底是什么意思吗? - mheavers
@mheavers 只需要 #import <BluetoothManager/BluetoothManager.h>,然后我就能调用以下语句: Class BluetoothManager = objc_getClass("BluetoothManager"); id btCont = [BluetoothManager sharedInstance]; - Achille

7

您需要确保二进制文件和头文件都在以下路径的PrivateFrameworks文件夹中:

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/System/Library/PrivateFrameworks

这将允许您在应用程序中导入PrivateFrameworks,例如BluetoothManager.framework,而不会出现错误。您可以在线上找到如何获取头文件的方法。这适用于3.1.2+,因为我正在编写一个应用程序,它在我的设备和模拟器上都能完美运行。

如果要在模拟器中进行测试,请使用以下内容:

#if TARGET_IPHONE_SIMULATOR
        //This is where simulator code goes that use private frameworks
#else
        /* this works in iOS 4.2.1 */
        Class BluetoothManager = objc_getClass("BluetoothManager");
        id btCont = [BluetoothManager sharedInstance];
        [btCont setPowered:YES];
#endif

我尝试过这个,虽然我正确加载了BluetoothManager类并获取了它的共享实例...但它就是不起作用。调用enabled总是返回NO,即使蓝牙已启用。调用setEnabled从未改变其状态。我尝试的每一个其他BluetoothManager调用总是返回NO、nil、0元素数组等。简而言之,返回的BluetoothManager似乎完全被削弱了。(我正在我的4.2.1 iPhone上运行,而不是模拟器。)人们是如何让它工作的?谢谢。 - Greg Maletic
1
上述代码肯定无法在iOS 4.2.1上运行。它适用于3.x版本,而WrightsCS显然通过将3.x替换为4.2来更新了他的评论。它可以编译,但在真实设备上无法工作。 - Nate

5
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

#if TARGET_IPHONE_SIMULATOR
    exit( EXIT_SUCCESS ) ;
#else
    /* this works in iOS 4.2.3 */
    Class BluetoothManager = objc_getClass( "BluetoothManager" ) ;
    id btCont = [BluetoothManager sharedInstance] ;
    [self performSelector:@selector(toggle:) withObject:btCont afterDelay:1.0f] ;
#endif
    return YES ;
}

#if TARGET_IPHONE_SIMULATOR
#else
- (void)toggle:(id)btCont
{
    BOOL currentState = [btCont enabled] ;
    [btCont setEnabled:!currentState] ;
    [btCont setPowered:!currentState] ;

}
#endif

以上方法适用于iOS 4.2.3。


3
要让BluetoothManager私有api工作,您需要执行以下操作: 1.获取Harkonian指示的4个标头文件,并将它们添加到您的SDK文件中(将标头文件添加到您的项目中) 2.将框架添加到您的项目中(将二进制文件添加到您的项目中) 3.创建一个变量,用于与BluetoothManager服务一起工作 例如:btManager = [BluetoothManager sharedInstance]; 4.使用BluetoothManager的方法,您可以在BluetoothManager.h中查看所有方法。
我提供了一个完整的示例,可在此处找到:http://www.pocketmagic.net/?p=2827 希望这可以帮助您, Radu

这是为 OS 5.1 开发的,并在实际硬件 iPod 上进行了测试。只是添加这些信息,因为许多用户抱怨在较新的 OS 版本上实现此功能存在问题。它仍然可以正常工作! - radhoo
XCode 5.1.1iOS 7.1 上运行良好。 - Jonathan F.

0

我认为解决方案是通过调用launchctl系统调用,因为它是启动/停止系统服务的守护进程。


这是一个指向launchctl man页面的链接:http://developer.apple.com/Mac/library/documentation/Darwin/Reference/ManPages/man1/launchctl.1.html%5D - Epsilon Prime
sudo launchctl load com.apple.BTServer - Epsilon Prime
sudo launchctl unload com.apple.BTServer - Epsilon Prime
运行 launchctl list 命令可以查看所有服务的列表。 - Epsilon Prime

0

使用 iPhone 5s
[btCont setEnabled:!currentState] ; [btCont setPowered:!currentState] ;
无法运行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接