2020-02-11 17:15:03 youshaoduo 阅读数 1438

iOS 上获取 Wifi 列表其实有很大限制,在 iOS 9 以前是不能获取Wifi列表的,只能获取当前连接的 Wifi 信息,也就表示只有连接了 Wifi 才能确定位置。
Apple 在 iOS 9 以后,提供了获取Wifi列表的API,但是获取Wifi列表是有门槛的,主要步骤有:


  1. 向 Apple 申请开发 Network Extension 权限
  2. 申请包含 Network Extension 的描述文件
  3. 配置 Info.plist
  4. 配置 entitlements
  5. iOS 获取 Wifi 列表代码实现
  6. 获取Wifi列表回调

向 Apple 申请开发 Network Extension 权限

首先要先写封邮件给 networkextension@apple.com ,问苹果要开发 Network Extension 的权限。 苹果收到邮件后会自动回复邮件,在 https://developer.apple.com/contact/network-extension/ 里面填写申请表格,内容包括:

Organization:               

Company / Product URL:             

What's your product's target market?              

What's your company's primary function?             

Describe your application and how it will use the Network Extension framework.            

What type of entitlement are you requesting?                     

...

申请后大概两周左右能收到 Aplle的 确认信,如:

Hi, 

Thanks for your interest in the Network Extension APIs.

We added a new template containing the Network Extension entitlements to your team.

......

申请包含 Network Extension 的描述文件

选择包含 Network Extension 的描述文件,后点击下载,下载完成双击描述文件。

xcode中开启Network Extensions权限

在这里插入图片描述

配置 entitlements

xxx.entitlements(xxx是项目名称) 里添加 Key-Value: com.apple.developer.networking.HotspotHelper -> YES,没有此文件需要先创建一个:
在这里插入图片描述

iOS 获取 Wifi 列表代码实现

#import <NetworkExtension/NetworkExtension.h>
- (void)getWifiList {

    if (![[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {return;}
    dispatch_queue_t queue = dispatch_queue_create("com.leopardpan.HotspotHelper", 0);
    [NEHotspotHelper registerWithOptions:nil queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
        if(cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {
            for (NEHotspotNetwork* network  in cmd.networkList) {
                NSLog(@"network.SSID = %@",network.SSID);
            }
        }
    }];
}

kNEHotspotHelperCommandTypeFilterScanList: 表示扫描到 Wifi 列表信息。

NEHotspotNetwork 里有如下信息


SSID:Wifi 名称
BSSID:站点的 MAC 地址
signalStrength: Wifi信号强度,该值在0.0-1.0之间
secure:网络是否安全 (不需要密码的 Wifi,该值为 false)
autoJoined: 设备是否自动连接该 Wifi,目前测试自动连接以前连过的 Wifi 的也为 false 。
justJoined:网络是否刚刚加入
chosenHelper:HotspotHelper是否为网络的所选助手


获取Wifi列表回调

当你把上面的代码写完,并成功运行项目后,发现并没有Wifi列表的回调。因为你还没刷新Wifi列表,你需要:

打开手机系统设置 -> WLAN -> 系统 Wifi 列表加载出来时,上面代码部分才会回调,才能获取到 Wifi 列表。
这个时候你就能看到控制台源源不断的Log。

注意事项

1、获取Wifi列表功能由于是需要申请后台权限,所以能后台激活App(应用程序),而且激活后App的进程能存活几个小时。
2、整个获取Wifi列表不需要App用户授权,也就是在App用户无感知下获取设备的Wifi列表信息,使用时请正当使用。
3、Wifi列表获取 NetworkExtension 是 iOS 9以后才出的,目前 iOS 9 已经覆盖很广了。

2017-01-18 15:36:52 knaht 阅读数 1380

方法一:

在iOS10更新后,系统设置跳转被禁用,只能跳转App设置,但是最近发现苹果又更新了URLscheme,亲测可用,建议iOS10已下,还用原来的scheme

            NSString * urlString = @"App-Prefs:root=WIFI";

            if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:urlString]]) {

                if ([[UIDevice currentDevice].systemVersion doubleValue] >= 10.0) {

                    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString] options:@{} completionHandler:nil];

                } else {

                    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=WIFI"]];

                }

            }


方法二:

用到了私有API,慎用,若想使用并通过审核,可以对私有方法名等加密,但是在ios10.3.1上又用不了了。

NSURL*url=[NSURL URLWithString:@"Prefs:root=WIFI"]; 

Class LSApplicationWorkspace = NSClassFromString(@"LSApplicationWorkspace"); 

[[LSApplicationWorkspace performSelector:@selector(defaultWorkspace)] performSelector:@selector(openSensitiveURL:withOptions:) withObject:url withObject:nil];


其他设置调整的写法:


无线局域网 App-Prefs:root=WIFI
蓝牙 App-Prefs:root=Bluetooth
蜂窝移动网络 App-Prefs:root=MOBILE_DATA_SETTINGS_ID
个人热点 App-Prefs:root=INTERNET_TETHERING
运营商 App-Prefs:root=Carrier
通知 App-Prefs:root=NOTIFICATIONS_ID
通用 App-Prefs:root=General
通用-关于本机 App-Prefs:root=General&path=About
通用-键盘 App-Prefs:root=General&path=Keyboard
通用-辅助功能 App-Prefs:root=General&path=ACCESSIBILITY
通用-语言与地区 App-Prefs:root=General&path=INTERNATIONAL
通用-还原 App-Prefs:root=Reset
墙纸 App-Prefs:root=Wallpaper
Siri App-Prefs:root=SIRI
隐私 App-Prefs:root=Privacy
Safari App-Prefs:root=SAFARI
音乐 App-Prefs:root=MUSIC
音乐-均衡器 App-Prefs:root=MUSIC&path=com.apple.Music:EQ
照片与相机 App-Prefs:root=Photos
FaceTime App-Prefs:root=FACETIME



2019-10-09 10:35:13 ccnu027cs 阅读数 19

前言: iOS 9 发布之后,推出NetworkExtension, 它可给系统WiFi列表列表里边的WiFi设置密码 、标签(副标题)。 还可获取整个WiFi列表。
首先你得向苹果申请一个权限,人家允许你使用了,你再在工程里面配置一下,这样你才可以使用.苹果会给你发个问卷调查,根据你自己的情况填写.这儿谢谢我初中学霸,专业的英语翻译果然6.
1-1.框架申请链接:https://developer.apple.com/contact/network-extension

 


根据自己的实际情况填写.里面有个产品介绍,最好找个英文好的...

 

1-2 调查表填写完成后,大概过了2 ,3小时,苹果会回复给你一封邮件,并且返回给你一个fllowup.(注意,这并不是代表你已经申请成功了,邮件里面只是确认你填写的问卷信息!)

 

1-3 接下来,就只能等了.逛苹果论坛,据说要等三星期,可是,我TM等了5星期是什么鬼.所以当超过三星期的时候我也没闲着,打电话 :4006701855 , 虽然得到的回复还是等...
而且,值得一提的是:有人遇见过这种情况,一直没有收到苹果拒绝或者同意的邮件.但是可以使用这个类.所以当超过3星期以后,我是每天都登录到开发者账号 配置描述文件,如果发现这儿多了一个选项.如下图,这也说明你申请成功

 

1-5 所以呢,打了两次电话,重发了5 ,6 次邮件之后,大概苹果也觉得不好意思了吧,终于通过了.此时你会收到这也一封邮

件:

 

恭喜您,通过了.但是不得不说,这只成功了一小半.后面你可能遇见更痛苦的事情.

2下面就来来说更痛苦的事情.
2-1 配置工程
a .新建一个App ID.

 

 

b. 添加iCloud 和Wireless Accessory

添加iCloud 和Wireless Accessory.png

c.新建iCloud Containers

新建iCloud Containers.png

d.打开刚刚创建的App ID 发现这个是黄色的,下面就要编辑这个App ID

 

 

编辑刚刚创建的AppID.png

 

e


 

f

g 配置App ID完成

 

 

2-2 配置描述文件 .

配置好这个之后,可以到苹果提供的检测环境检测一下配置文件的正确性
附上网址 :https://forums.developer.apple.com/message/75928#75928

这一步很重要:就是检测你的工程配置的描述文件和这个账号使用权限是否对等.后面有小伙伴遇到一个bug就是ruternType一直返回NO,获取不到wifi列表,然后通过上面验证发现,证书的权限和申请使用的权限不相同.
所以这儿有个建议,如果发现获取列表时返回值是NO,把测试证书删掉,重新创建.然后再走一遍上面的流程.(我遇到的BUG奇怪的很,对着英文文档走了好几遍,确定文件没什么问题,就是返回值一直都是NO,后来,在创建iCoud的时候,把那个id改成和App ID不一样,就是按照他下面的要求创建,就奇怪的好了.)

注意 :创建完描述文件别忘了安装到Xcode,直接下载,完了双击就ok了.

3.配置Xcode工程了;
3-1 配置plist文件 (允许后台运行)
通过xml添加
<key>UIBackgroundModes</key>
<array>
<string>network-authentication</string>
</array>

通过xml方式添加.png

3-2 targets->Capabilities->iCloud 和Wireless-Accessory-Configuration

打开并配置icould

打开Wireless-Accessory-Configuration.png

配置完上面两个你就会发现工程左边会多了一个.entitlements结尾的文件.
然后还要向这个文件里面添加一个BOOL值为YES的字段 

com.apple.developer.networking.HotspotHelper

 

配置.entitlements文件.png

3-3 Tagarts-->Build Settings -> code Signing

配置Build Settings

3-4 上代码 (也是蛮辛苦的)

Register a Hotspot Helper

+ (BOOL)registerWithOptions:(NSDictionary*)options queue:(dispatch_queue_t)queue handler:(NEHotspotHelperHandler)handler

@param options 

 kNEHotspotHelperOptionDisplayName :WIFI的注释tag字符串// 此处设置的内容会在WiFi列表中每个WiFi下边展示出来 

@param queue dispatch_queue_t 用来调用handle的block 

@param handler NEHotspotHelperHandler block 用于执行处理 helper commands.

 @return 注册成功YES, 否则NO. 

@discussion 一旦这个API调用成功,应用程序有资格在后台启动,并参与各种热点相关的功能。 当应用程序启动此方法应该调用一次。再次调用它不会产生影响,并返回NO。

这个方法是主要的.




+ (BOOL)logoff:(NEHotspotNetwork *)network

@param network 对应当前关联的WiFi网络NEHotspotNetwork

 @return 注销命令已成功进入队列YES, 否则NO. 

@discussion 调用此方法使kNEHotspotHelperCommandTypeLogoff型的NEHotspotHelperCommand向应用程序发出的“handler”模块 网络参数必须符合当前关联的WiFi网络,即它必须来自对NEHotspotHelperCommand网络属性或方法supportedInterfaces

+ (NSArray *)supportedNetworkInterfaces

@return 如果没有网络接口被管理,返回nil。否则,返回NEHotspotNetwork对象数组。 

@discussion 每个网络接口由NEHotspotNetwork对象表示。当前返回的数组包含一个NEHotspotNetwork对象代表Wi-Fi接口。

 这种方法的主要目的是当没有得到一个命令来处理它时,让一个热点助手偶尔提供在UI里其准确的状态。 此方法加上NEHotspotNetwork的isChosenHelper方法允许应用程序知道它是否是当前处理的网络。

//最后奉上我的实现代码,获取wifi列表,并给指定ssid做标记;

+(void)getWifiList{

    NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
    [options setObject:@"??新网程-点我上网??" forKey:kNEHotspotHelperOptionDisplayName];
    
    dispatch_queue_t queue = dispatch_queue_create("com.pronetwayXY", NULL);
    BOOL returnType = [NEHotspotHelper registerWithOptions:options queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
        NEHotspotNetwork* network;
        NSLog(@"COMMAND TYPE:   %ld", (long)cmd.commandType);
        [cmd createResponse:kNEHotspotHelperResultAuthenticationRequired];
        if (cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType ==kNEHotspotHelperCommandTypeFilterScanList) {
            NSLog(@"WIFILIST:   %@", cmd.networkList);
            for (network  in cmd.networkList) {
                // NSLog(@"COMMAND TYPE After:   %ld", (long)cmd.commandType);
                if ([network.SSID isEqualToString:@"ssid"]|| [network.SSID isEqualToString:@"proict_test"]) {
                    
                    double signalStrength = network.signalStrength;
                    NSLog(@"Signal Strength: %f", signalStrength);
                    [network setConfidence:kNEHotspotHelperConfidenceHigh];
                    [network setPassword:@"password"];
                    
                    NEHotspotHelperResponse *response = [cmd createResponse:kNEHotspotHelperResultSuccess];
                    NSLog(@"Response CMD %@", response);
                    
                    [response setNetworkList:@[network]];
                    [response setNetwork:network];
                    [response deliver];
                }
            }
        }
    }];
    NSLog(@"result :%d", returnType);
    NSArray *array = [NEHotspotHelper supportedNetworkInterfaces];
    NSLog(@"wifiArray:%@", array);
    NEHotspotNetwork *connectedNetwork = [array lastObject];
    NSLog(@"supported Network Interface: %@", connectedNetwork);
    
}

注意 :运行一遍,然后需要打开系统设置连wifi界面,才能在控制台查看打印信息的.

2019-04-15 16:04:11 CC1991_ 阅读数 5837

前段时间在开发过程中遇到一个问题,就是之前设置的获取手机连接WiFi名称的方法不起作用了,后来经查发现是因为新系统需要申请开启相对应的权限才能获取到手机连接的WiFi名称等信息,本章就来讲一下iOS12.0以上系统获取WiFi名称的方法。

一、iOS12.0以下系统获取WiFi名字和mac地址信息的方法

在iOS有关WiFi开发中,苹果官方提供了NetworkExtension框架让iOS开发者实现VPN以及WiFi热点相应的功能,虽然在iOS9.0系统以后,这个框架的很多功能都被苹果官方屏蔽,想要使用这些被屏蔽的功能,需要开发者去申请权限才能用,但是简单的获取WiFi名字和WiFi的mac地址信息等方法还是可以正常使用的。

1、获取WiFi相关信息的时候需要引入一下头文件

#import <SystemConfiguration/CaptiveNetwork.h>

#import <NetworkExtension/NetworkExtension.h>

想要获取iPhone手机连接到的WiFi名字和WiFi的mac地址,需要用到CNCopySupportedInterfaces和CNCopyCurrentNetworkInfo两个类,具体的实现方法如下所示:

①获取SSID(Service Set Identifier):服务集标识,即WiFi网络的名称。

+ (NSString *)wiFiName {

    NSArray *wiFiName = CFBridgingRelease(CNCopySupportedInterfaces());

    id info1 = nil;

    for (NSString *wfName in wiFiName) {

        info1 = (__bridge_transfer id)CNCopyCurrentNetworkInfo((CFStringRef) wfName);

        if (info1 && [info1 count]) {

            break;

        }

    }

    NSDictionary *dic = (NSDictionary *)info1;

    NSString *ssidName = [[dic objectForKey:@"SSID"] lowercaseString];

    return ssidName;

}

 

②获取BSSID,即WiFi的mac地址。

+ (NSString *)wifiMac {

    NSArray *wfMac = CFBridgingRelease(CNCopySupportedInterfaces());

    id info1 = nil;

    for (NSString *macName in wfMac) {

        info1 = (__bridge_transfer id)CNCopyCurrentNetworkInfo((CFStringRef) macName);

        if (info1 && [info1 count]) {

            break;

        }

    }

    NSDictionary *dic = (NSDictionary *)info1;

    NSString *wifiMac = [dic objectForKey:@"BSSID"];

    return wifiMac;

}

 

 

二、iOS12.0以上系统获取WiFi信息的方法

1、苹果开发者官网官方的解释如下:

Important

To use this function in iOS 12 and later, enable the Access WiFi Information capability for your app in Xcode. When you enable this capability, Xcode automatically adds the Access WiFi Information entitlement to your entitlements file and App ID.

重要提示

要在iOS 12及以后系统中使用此功能,请在Xcode中为应用程序启用WiFi信息访问功能。当您启用此功能时,Xcode会自动将访问WiFi信息权限添加到您的权限文件和应用程序App ID中。

 

2、步骤

通过上面的苹果的官方解释可以知道,要想在iOS12.0及以上系统中继续使用该方法,就需要申请获取授权。若使用的是自动签名,授权之后Xcode会自动在App ID和应用的权限列表中增加WiFi使用的权限。若使用的是手动签名,则还需要去App ID中配置一下权限,并生成新的profile文件。具体的操作步骤如下所示:

设置Xcode里面Capabilities的步骤:Target —> Capabilities —> Access WiFi Information —> ON

 

若项目使用的是手动签名,则在上面打开Access WiFi Information选项之后,会造成Add the Access WiFi Information feature to your App ID这一项会报错,需要开发者手动去App ID账号中操作设置。具体操作步骤如下所示:

打开添加Access WiFi Information之后,项目会在.entitlements文件中添加Access WiFi Information信息,如果创建的时候没有.entitlements文件,会同时创建该文件。

操作以上步骤之后,在iOS12.0及以上系统中获取WiFi名字和WiFi的mac信息的方法就可以正常获使用了。若采用的是手动签名,需要在开发者账号中找到App IDs,并配置Access WiFi Information,编辑App ID,勾选相应的选项,然后保存即可。具体操作步骤如下所示:

 

最后再重新生成项目的Provisioning Profiles文件,包括Distribution的和Development两个不同的模式,下载双击打开,项目就可正常签名,就可以正常的获取到手机连接的WiFi的相关信息了。

3、使用场景实例

以下实例是按照实际使用场景来说明的,具体如下所示:

 

以上就是本章全部内容,欢迎关注三掌柜的微信公众号、微博,欢迎关注!

三掌柜的微信公众号:

三掌柜的新浪微博:

 

2017-04-10 14:04:26 spicyShrimp 阅读数 11880

#iOS10跳转系统设置、WIFI、蓝牙…

注意: 目前苹果新的规则已经禁止使用此方式了,此方法的会导致上架被拒…

iOS自我们熟悉以来,就一直与Android有着不一样的体验,
系统更加流畅,使用更加舒适,
同时较高与Android的价格也导致了它的特殊性,
iOS系统的封闭和很多权限的限制导致了我们在开发的时候经常会遇到很多无法条件无法实现
就比如iOS10以前,我们开发的应用想要跳转到系统设置,跳转到蓝牙,跳转到WIFI…
iOS开发工程师们都很熟悉,系统给我们提供了一套URL,我们只要使用这一套就OK了
在iOS10以前,
可能会用到的这些

蜂窝网络:prefs:root=MOBILE_DATA_SETTINGS_ID
Wi-Fi:prefs:root=WIFI
定位服务:prefs:root=LOCATION_SERVICES
个人热点:prefs:root=INTERNET_TETHERING
关于本机:prefs:root=General&path=About
辅助功能:prefs:root=General&path=ACCESSIBILITY
飞行模式:prefs:root=AIRPLANE_MODE
锁定:prefs:root=General&path=AUTOLOCK
亮度:prefs:root=Brightness
蓝牙:prefs:root=Bluetooth
时间设置:prefs:root=General&path=DATE_AND_TIME
FaceTime:prefs:root=FACETIME
设置:prefs:root=General
设置 prefs:root=SETTING
定位服务 prefs:root=LOCATION_SERVICES
键盘设置:prefs:root=General&path=Keyboard
iCloud:prefs:root=CASTLE
iCloud备份:prefs:root=CASTLE&path=STORAGE_AND_BACKUP
语言:prefs:root=General&path=INTERNATIONAL
定位:prefs:root=LOCATION_SERVICES
音乐:prefs:root=MUSIC


我们在想要跳转的时候只要简单的几行代码

NSURL *url = [NSURL URLWithString:@"prefs:root=Bluetooth"];
if ([[UIApplication sharedApplication]canOpenURL:url]) {
    [[UIApplication sharedApplication]openURL:url];
}

但是万恶的iOS10来了,就一切都变了
以上的全部都失效了,一切都没有用了
无论是prefs:root=Bluetooth 还是 Prefs:root=Bluetooth 都没有用
那么怎么跳转呢?
但是网上面又有说Prefs:root=Bluetooth 这种是可以的?
后来经测试这个只在Widge里有效,App中无效!

于是有大神想到了私有的API

NSURL*url=[NSURL URLWithString:@"Prefs:root=Bluetooth"];
Class LSApplicationWorkspace = NSClassFromString(@"LSApplicationWorkspace");
[[LSApplicationWorkspace performSelector:@selector(defaultWorkspace)] performSelector:@selector(openSensitiveURL:withOptions:) withObject:url withObject:nil];

因为是私有的API,可能会过不了审核,于是又有了下面的变种
利用ASCII值进行拼装组合方法。这样可绕过审核。

SignedByte classOneByte[] = {0x4c,0x53,0x41,0x70,0x70,0x6c,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x57,0x6f,0x72,0x6b,0x73,0x70,0x61,0x63,0x65};
NSString *classOneString = [[NSString alloc] initWithData:[NSData dataWithBytes:classOneByte length:sizeof(classOneByte)] encoding:NSASCIIStringEncoding];
Class classOne = NSClassFromString(classOneString);
        
SignedByte selectOneByte[] = {0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x57,0x6f,0x72,0x6b,0x73,0x70,0x61,0x63,0x65};
NSString *selectOneString = [[NSString alloc] initWithData:[NSData dataWithBytes:selectOneByte length:sizeof(selectOneByte)] encoding:NSASCIIStringEncoding];
SEL selectOne = NSSelectorFromString(selectOneString);
        
if ([classOne respondsToSelector:selectOne]) {
     Class classTwo = [classOne performSelector:selectOne];
            
     SignedByte selectTwoByte[] = {0x6f,0x70,0x65,0x6e,0x53,0x65,0x6e,0x73,0x69,0x74,0x69,0x76,0x65,0x55,0x52,0x4c,0x3a,0x77,0x69,0x74,0x68,0x4f,0x70,0x74,0x69,0x6f,0x6e,0x73,0x3a};
     NSString *selectTwoString = [[NSString alloc] initWithData:[NSData dataWithBytes:selectTwoByte length:sizeof(selectTwoByte)] encoding:NSASCIIStringEncoding];
     SEL selectTwo = NSSelectorFromString(selectTwoString);
            
     SignedByte urlByte[] = {0x50,0x72,0x65,0x66,0x73,0x3a,0x72,0x6f,0x6f,0x74,0x3d,0x42,0x6c,0x75,0x65,0x74,0x6f,0x6f,0x74,0x68};
     NSString *urlString = [[NSString alloc] initWithData:[NSData dataWithBytes:urlByte length:sizeof(urlByte)] encoding:NSASCIIStringEncoding];
      NSURL *url = [NSURL URLWithString:urlString];
            
      if ([classTwo respondsToSelector:selectTwo]) {
          [classTwo performSelector:selectTwo withObject:url withObject:nil];
      }
}
          

是不是完全看不懂?其实就是把那些字符串,那些类,那些方法都使用ASCII进行了转换而已…

但是热更新事件来的很突然,审核系统开始对于respondsToSelector:和performSelector:有了一点关注,担心上面的方法会失效,毕竟是私有,不靠谱,
那么有没有靠谱的不是私有的?

答案是有!
千百次尝试,终于找到了!!

Wi-Fi: App-Prefs:root=WIFI
蓝牙: App-Prefs:root=Bluetooth
蜂窝移动网络: App-Prefs:root=MOBILE_DATA_SETTINGS_ID
个人热点: App-Prefs:root=INTERNET_TETHERING
运营商: App-Prefs:root=Carrier
通知: App-Prefs:root=NOTIFICATIONS_ID
通用: App-Prefs:root=General
通用-关于本机: App-Prefs:root=General&path=About
通用-键盘: App-Prefs:root=General&path=Keyboard
通用-辅助功能: App-Prefs:root=General&path=ACCESSIBILITY
通用-语言与地区: App-Prefs:root=General&path=INTERNATIONAL
通用-还原: App-Prefs:root=Reset
墙纸: App-Prefs:root=Wallpaper
Siri: App-Prefs:root=SIRI
隐私: App-Prefs:root=Privacy
定位: App-Prefs:root=LOCATION_SERVICES
Safari: App-Prefs:root=SAFARI
音乐: App-Prefs:root=MUSIC
音乐-均衡器: App-Prefs:root=MUSIC&path=com.apple.Music:EQ
照片与相机: App-Prefs:root=Photos
FaceTime: App-Prefs:root=FACETIME
...

之前的prefs或者Prefs 替换成最新的 App-Prefs
当前iOS10全部支持!亲测!不是私有方法!不是私有方法!不是私有方法!
过审核不是问题!全部支持!
其他的不用说啦!炫耀去吧…

再补充一个跳转到应用设置

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication]canOpenURL:url]) {
    [[UIApplication sharedApplication]openURL:url];
}

欢迎访问我的系列博客,刚刚开始写…
系列:iOS开发-前言+大纲
http://blog.csdn.net/spicyShrimp/article/details/62218521

没有更多推荐了,返回首页