你能否将iOS设备的WiFi设置传递给ExternalAccessory对象?

32

我听说iOS 5引入了一个功能,即iOS设备可以通过ExternalAccessory框架与停靠的配件共享其wifi配置。问题是,我在SDK文档中找不到任何有关实现此类方案的具体细节。

经过我的研究,我开始怀疑它是通过“iPhone配置实用程序”实现的,但这仍然似乎是在设备上实施的一种混乱方法。

有人有什么想法吗?

一旦wifi设置数据可用,将很容易将其打包并通过ExternalAccessory框架发送到设备,我将相应地构建协议支持。

谢谢


1
我现在更倾向于使用CaptiveNetwork接口中的CNCopyCurrentNetworkInfo函数。 - njt
2
我找到了一种硬件相关的方法来实现这个,但它看起来也像是魔法。我认为这是特定于苹果/硬件供应商的,不是公开可访问的方法。 - njt
4
使用专用的AirPlay流模块,不太清楚其工作原理,更多信息可能会侵犯保密协议...抱歉。 - njt
3
是的,这部分属于MFi保密协议。 - Rok Jarc
1
你能找到可靠的信息,唯一的途径就是申请MFi计划。但是进入这个计划并不容易。 - ppaulojr
显示剩余5条评论
5个回答

12

是的!你当然可以。但是,要使用HomeKit(你需要的库),你首先需要成为认证的MFi(Made For iDevice-iPhone-iPod-iPad)开发人员。这使您能够允许用户查看所有可用的WiFi网络并选择链接设备。

其中之一示例是Withings的Aura睡眠辅助器。请参见启动体验中的屏幕截图:

输入图像描述

然后,用户可以选择安全地与新设备共享其家庭WiFi信息。

输入图像描述


坏消息是获得批准有点繁琐。对于小公司来说需要付出很多努力,但对最终用户来说肯定是值得的。它提供了更专业、无缝的设置过程——基本上与您设置Gen 4 AppleTV时使用的相同过程! - Ethan Parker

2
有点晚了,但是configureAccessory是iOS 8.0中引入的方法(属于ExternalAccessory),您可以使用它来配置WiFi配件:

https://developer.apple.com/documentation/externalaccessory/eawifiunconfiguredaccessorybrowser/1613907-configureaccessory

这是 EAWiFiUnconfiguredAccessoryBrowser 类的一部分:

https://developer.apple.com/documentation/externalaccessory/eawifiunconfiguredaccessorybrowser

showBluetoothAccessoryPicker 是用于蓝牙产品的一个函数:

https://developer.apple.com/documentation/externalaccessory/eaaccessorymanager/1613913-showbluetoothaccessorypicker

这是 EAAccessoryManager 类的一部分:

https://developer.apple.com/documentation/externalaccessory/eaaccessorymanager


2

嗨,我已经注册了MFI计划,现在我正在尝试读取wifi网络。但由于我之前没有使用过HomeKit,我不知道如何读取wifi网络。是否有任何教程或示例可用于实现相同的功能。请分享一下。 - shasha

1

我怀疑苹果公司是否会允许普通开发者访问私人数据,例如wifi连接设置。也许可信任的第三方配件提供商可以,但你可能不行。

Wifi设置是私人的,并包含密码。一个普通(非高级)用户使用更多或更少相同/类似的密码,包括他们的Wifi网络。如果一个应用程序可以轻松读取它,那么它可能会被严重利用。

同样,您无法获取Apple id,更别说密码了。


4
在iOS 5中是存在的。我从未真正想要阅读这些数据,只是将其传递给主机MCU。现在我的产品可以正常工作了。 - njt
我刚开始研究一个产品的相关事宜,似乎遇到了你曾经遇到的问题。你能提供任何提示吗? - Greg Price
恐怕我不能透露,因为这会违反两个保密协议。如果你拥有MFi许可证,那么应该能够找到这个信息。 - njt

1

你看过这个吗:iPhone无需私有库获取SSID

询问应用用户安全网络密码是否不可行?

你至少可以获取未加密网络的SSID,并使用getter将其传递给你的附件,例如:

#import <SystemConfiguration/CaptiveNetwork.h>


@implementation DeviceWifiSSID

//https://dev59.com/fG435IYBdhLWcg3w0ThP#5198968
+(NSString *)deviceSSID
{
    NSArray *ifs = (__bridge id)CNCopySupportedInterfaces();


    id info = nil;
    for (NSString *ifnam in ifs) {
        info = (__bridge id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);

        if ([info objectForKey:@"SSID"] != nil)
        {
            return [info objectForKey:@"SSID"];
        }
    }


    return nil;
}

@end

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