一.iPhone创建个人热点

iPhone/iOS双环上网,即iPhone通过创建个人热点(Personal Hotspot)实现共享上网,支持便携式Wi-Fi热点、蓝牙共享网络和USB共享网络。

1.若iPhone已开启了WiFi(和蓝牙),则直接创建成功。

其他设备可通过WiFi(或蓝牙)搜索热点名称并连接实现共享上网。

需要说明的是:苹果的蓝牙协议是封闭的,只支持苹果的设备(iPhone/iPad/iMac)间连接,无法与Android等设备的蓝牙进行发现配对!

2.若iPhone只开启了蓝牙,未开启WiFi,则提示

若选择【打开"Wi-Fi"】(Turn on Wi-Fi),则其他设备可通过WiFi搜索热点名称并连接实现共享上网。

若选择【仅蓝牙和USB】(Bluetooth and USB Only),则其他设备可通过蓝牙或USB连接到该iPhone搜索热点名称并连接实现共享上网。

3.若iPhone未开启蓝牙和WiFi,则提示

若选择【打开"Wi-Fi"和蓝牙】(Turn on Wi-Fi and Bluetooth),则其他设备可通过蓝牙/WiFi搜索热点名称并连接实现共享上网。

若选择【仅USB】(USB Only),则其他设备可通过USB连接到该iPhone搜索热点名称并连接实现共享上网。

二.iMac通过USB连接iPhone共享个人热点上网

当iPhone新建了个人热点,iMac(Mac OS X)通过USB连接上iPhone时,将自动连接上iPhone的个人热点(the first 1 Connection)。

在Mac/Xcode上调试iPhone真机时,若只想调试iPhone/Android连接个人热点的情形(以便测试有热点栏和无热点栏的情况),则可在Network Preferences中删除iPhone USB接口(interface),防止Mac自动通过USB连接上iPhone热点对调试造成干扰。

三.iPhone/iOS个人热点状态栏

iPhone作为个人热点且有连接时,系统状态栏下面会多一行热点连接提示栏"Personal Hotspot: * Connection",纵向会下压20pt;当所有连接都断开时,热点栏消失,纵向高度恢复正常。

1.系统状态栏

APP_STATUSBAR_HEIGHT=[UIApplication sharedApplication].statusBarFrame.size.height,包含热点栏(如有)高度,标准高度为20pt,当有个人热点连接时,高度为40pt

// iOS系统版本

#define SYSTEM_VERSION    [[[UIDevice currentDevice] systemVersion] doubleValue]

// 标准系统状态栏高度

#define SYS_STATUSBAR_HEIGHT                        20
// 热点栏高度
#define HOTSPOT_STATUSBAR_HEIGHT            20
// 导航栏(UINavigationController.UINavigationBar)高度
#define NAVIGATIONBAR_HEIGHT                44
// 工具栏(UINavigationController.UIToolbar)高度
#define TOOLBAR_HEIGHT                              44
// 标签栏(UITabBarController.UITabBar)高度
#define TABBAR_HEIGHT                              44
// APP_STATUSBAR_HEIGHT=SYS_STATUSBAR_HEIGHT+[HOTSPOT_STATUSBAR_HEIGHT]
#define APP_STATUSBAR_HEIGHT                (CGRectGetHeight([UIApplication sharedApplication].statusBarFrame))
// 根据APP_STATUSBAR_HEIGHT判断是否存在热点栏
#define IS_HOTSPOT_CONNECTED                (APP_STATUSBAR_HEIGHT==(SYS_STATUSBAR_HEIGHT+HOTSPOT_STATUSBAR_HEIGHT)?YES:NO)
// 无热点栏时,标准系统状态栏高度+导航栏高度
#define NORMAL_STATUS_AND_NAV_BAR_HEIGHT    (SYS_STATUSBAR_HEIGHT+NAVIGATIONBAR_HEIGHT)
// 实时系统状态栏高度+导航栏高度,如有热点栏,其高度包含在APP_STATUSBAR_HEIGHT中。
#define STATUS_AND_NAV_BAR_HEIGHT                    (APP_STATUSBAR_HEIGHT+NAVIGATIONBAR_HEIGHT)

2.UIViewController.view.bounds.height

  • SYSTEM_VERSION < 7.0,UIViewController.view.bounds.height包含导航栏高度,不包含系统状态栏高度,也不包含热点栏(如果有)。
  • SYSTEM_VERSION ≥ 7.0,UIViewController.view.bounds.height包含标准系统状态栏高度和导航栏高度,但不包含热点栏(如果有)。

也即当有热点栏时,UIViewController.view.bounds.height都自动扣除了热点栏的高度,iOS<7.0不包含标准系统状态栏,iOS≥7.0包含标准系统状态栏。
由于iOS7把整个屏幕高度(包括状态栏,不包括热点栏)都作为了视图控制器的有效高度,因此从iOS6升级到iOS7时,会出现视图整体上移了一个状态栏的高度(20pt),并和上层的状态栏交叠在一起。
解决方法:设置extendedLayoutIncludesOpaqueBars属性为NO,设置edgesForExtendedLayout为UIRectEdgeNone。

3.UIViewController适应热点栏示例代码

// MyViewController接口继承自UIViewController
@interface MyViewController : UIViewController

// MyViewController* myViewController入栈
MyViewController* myViewController = [[MyViewController alloc] init];
[self.navigationController pushViewController:myViewController animated:YES];

- (id)init

{

// ...

// 初始非全屏
    _bFullScreen = NO;
    // 进入该UIViewController之前的状态
    _lastStatusBarStyle = [[UIApplication sharedApplication] statusBarStyle];

_lastBarTranslucent = self.navigationController.navigationBar.translucent;

// ...

}

// 排版时,注意logical coordinate space和device coordinate space的区别,注意frame和bounds的区别!

- (void)loadView

{

// ...

// 计算Custom Content View的Rect
    if (!_supportFullScreen)
    {
        CGFloat contentSatrtY = 0;
        
        if (IS_HOTSPOT_CONNECTED) { // iPhone4(s)-iOS6/iOS7屏幕坐标系下:hostView.frame={{0, 40}, {320, 440}}/{{0, 20}, {320, 460}}
            contentSatrtY = STATUS_AND_NAV_BAR_HEIGHT; // 84
            if (SYSTEM_VERSION >= 7.0) { // 如果设置了edgesForExtendedLayout=UIRectEdgeNone
                contentSatrtY -= HOTSPOT_STATUSBAR_HEIGHT;// 64(有热点栏时,会自动下移20)
            }
        } else { // iPhone4(s)-iOS6/iOS7屏幕坐标系下:hostView.frame={{0, 20}, {320, 460}}/{{0, 0}, {320, 480}}
            contentSatrtY = NORMAL_STATUS_AND_NAV_BAR_HEIGHT; // 64
        }
        
        // contentSatrtY基于UIViewController.view所在的屏幕坐标系进行排版
        contentRect = CGRectMake(0, contentSatrtY, hostView.width, SCREEN_HEIGHT-STATUS_AND_NAV_BAR_HEIGHT-TOOLBAR_HEIGHT);
    }
    else // 针对iOS6/7分别配置了wantsFullScreenLayout=YES/edgesForExtendedLayout=UIRectEdgeAll,全屏隐藏状态栏(包括热点栏)、导航栏和工具栏之后高度为SCREEN_HEIGHT
    {
        contentRect = CGRectMake(0, 0, hostView.width, hostView.height);
    }

// ...

}

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

// ...

if (_bFullScreen)
    {
        if (SYSTEM_VERSION >= 7.0)
        {
            self.extendedLayoutIncludesOpaqueBars = YES;
            self.edgesForExtendedLayout = UIRectEdgeAll;
        }
        else
        {
            self.wantsFullScreenLayout = YES;
            self.navigationController.navigationBar.translucent = YES; // iOS 6下保证导航栏透明
        }
    }
    else
    {
        [[UIApplication sharedApplication] setStatusBarStyle:_lastStatusBarStyle];
        if (SYSTEM_VERSION >= 7.0)
        {
            // 设置后:有个人热点连接时,UIViewController.view自动下移20;无个人热点连接时,UIViewController.view自动上移20
            self.extendedLayoutIncludesOpaqueBars= NO;
            self.edgesForExtendedLayout = UIRectEdgeNone;
        }
        else
        {
            self.wantsFullScreenLayout = NO;
            self.navigationController.navigationBar.translucent = _lastBarTranslucent;
        }

}

// ...

}

// 手动点击内容区域实现全屏
- (void)setFullScreen:(BOOL)bFull

{

_bFullScreen = bFull;

// 全屏(非全屏)隐藏(显示)系统状态栏
    [[UIApplication sharedApplication] setStatusBarHidden:bFullScreen];
    // 全屏(非全屏)隐藏(显示)顶部导航栏
    [self.navigationController setNavigationBarHidden:bFullScreen animated:YES];
    // 全屏(非全屏)隐藏(显示)底部工具栏

[self.navigationController setToolbarHidden:bFullScreen animated:YES];

// ...

}

#pragma mark UIApplicationWillChangeStatusBarFrameNotification
// 如有必要,需监听系统状态栏变更通知:UIApplicationWillChangeStatusBarFrameNotification

- (void)handleUIApplicationWillChangeStatusBarFrameNotification:(NSNotification*)notification
{
    CGRect newStatusBarFrame = [(NSValue*)[notification.userInfo objectForKey:UIApplicationStatusBarFrameUserInfoKey] CGRectValue];

// 根据系统状态栏高判断热点栏的变动
    BOOL bPersonalHotspotConnected = (CGRectGetHeight(newStatusBarFrame)==(SYS_STATUSBAR_HEIGHT+HOTSPOT_STATUSBAR_HEIGHT)?YES:NO);

CGPoint newCenter = CGPointZero;
    CGFloat OffsetY = bPersonalHotspotConnected?+HOTSPOT_STATUSBAR_HEIGHT:-HOTSPOT_STATUSBAR_HEIGHT;
    if (SYSTEM_VERSION >= 7.0) { // 即使设置了extendedLayoutIncludesOpaqueBars=NO/edgesForExtendedLayout=UIRectEdgeNone,对没有自动调整的部分View做必要的手动调整
        newCenter = self.someSubView.center;
        newCenter.y += OffsetY;
        self.someSubView.center = newCenter;
    } else { // Custom Content对应的view整体调整
        newCenter = self.contentView.center;
        newCenter.y += OffsetY;
        self.contentView.center = newCenter; // contentView为Custom Content对应的view
    }
}

@end

四.iPhone/iOS个人热点的interface

iPhone开启个人热点(桥接上网)时,会多出bridge接口。

iPhone5s/iOS8.2开启个人热点时,遍历可发现多出3个活跃的bridge100接口(IFF_UP),sa_family分别是AF_LINK(18)、AF_INET6(30)、AF_INET(2)。

遍历interface的代码片段如下:

struct ifaddrs *interfaces = nil;

if(!getifaddrs(&interfaces))

{

for(structifaddrs *interface = interfaces; interface; interface = interface->ifa_next) {

if ((interface->ifa_flags&IFF_UP) ==IFF_UP) {

log_notice("ifa_name : %s, ifa_addr->sa_family : %d", interface->ifa_name, interface->ifa_addr->sa_family);

}

}

}

if (interfaces) {

freeifaddrs(interfaces);

interfaces = NULL;

}

iOS开启个人热点的纵向适配相关推荐

  1. iPhone/iOS开启个人热点的纵向适配小结

    http://blog.csdn.net/phunxm/article/details/42967035 一.iPhone创建个人热点 iPhone/iOS双环上网,即iPhone通过创建个人热点(P ...

  2. iPhone/iOS开启个人热点的相关位置调整小结

    冬至已到,圣诞将近,最近公司项目实在太多,三四个项目反复的切换真的让人焦头烂额,趁今天有点空,把维护的三个项目顺利送出,刚好可以缕缕思路,记录一下最近遇到的问题.说不着急那是假的,客户一天天的催的确实 ...

  3. html5开发之ios屏幕适配,iOS开发屏幕尺寸以及屏幕适配等问题(转载内容)

    原帖地址:http://blog.csdn.net/phunxm/article/details/42174937/ 仅供我个人收藏学习,原博主如不同意请联系qq651263878进行删除,在此表示感 ...

  4. iOS 屏幕尺寸、分辨率、适配

    1.iPhone尺寸规格 设备 iPhone 宽 Width 高 Height 对角线 Diagonal 逻辑分辨率(point) Scale Factor 设备分辨率(pixel) PPI 3GS ...

  5. iOS 屏幕尺寸、分辨率、适配、UI规范

    .iPhone尺寸规格 设备 iPhone 宽 Width 高 Height 对角线 Diagonal 逻辑分辨率(point) Scale Factor 设备分辨率(pixel) PPI 3GS 2 ...

  6. 58 同城 iOS 客户端 iOS11 及 iPhone X 适配实践

    一.前言 前段时间 WWDC 大会上苹果推出了 iOS11 系统 和 iPhone X 新机型,相信各个 iOS 团队的开发者都已经在计划新系统和新机型的适配工作了.不得不说,新系统和新机型的发布确实 ...

  7. iOS 15个人热点无法连接?10个修复技巧分享

    iPhone的个人热点类似一个随身Wi-Fi,使用蜂窝数据将设备变成Wi-Fi热点,从而与其他设备共享网络数据. 但是升级到iOS 15后,很多iPhone 用户反馈个人热点停止工作.无法连接.频繁掉 ...

  8. win10如何开启移动热点

    1.先点击开启wifi 2.win10显示我们无法开启移动热点错误 1)打开控制面板搜索设备管理 2)启动wifi网络适配 3)重新设置热点即可 3.手机依然无法连接无线网,显示无法获取ip地址 打开 ...

  9. C#中调用命令行程序开启wifi热点

    为什么80%的码农都做不了架构师?>>>    最近想在win7上开启wifi热点,于是就弄出下面这个小东西,里面涉及如何在控制台上输入命令,分享一下.首先在VS中创建一个windo ...

最新文章

  1. python tkinter设置窗口大小_Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例...
  2. ParaEngine 一个同事的公司的开源引擎
  3. java之Map和Collection
  4. 七点人脸姿态估计_Github开源库简单配置即可上线的3D人脸检测工具箱
  5. 移植uboot之修改代码支持NorFlash记录续集
  6. myeclipse 10.7安装过程与初次启动
  7. 配置jupyter notebook到conda env虚拟环境里可运行
  8. H3C Private VLAN(私有vlan) 实验
  9. kali linux怎么装软件,linux安装软件的几种方式(kali平台)和一些实用的软件(持续更新)...
  10. 罗技鼠标键盘没法使用,可以尝试安装此驱动
  11. 弹性系数和线径的计算公式_弹簧弹力计算公式详解
  12. 【解决办法】adobe audition打不开 显示MSVCR71.dll丢失
  13. 人脸实战之关键点检测
  14. JS 设置适配屏幕分辨率大小
  15. 裁员浪潮,互联网人该何去何从?
  16. python编写程序输出诗句_python基于词向量的古诗生成器
  17. python——文件处理
  18. 解决使用百度地图API时偏移问题并自适应中心点和比例
  19. 免费离线PDF工具箱,PDF工具大全,PDF合并PDF加密PDF解密PDF格式转换PDF分割PDF旋转以及从PDF中提取图片,满足对PDF操作的一切需求~完全免费无使用次数限制,文末附下载链接~
  20. JavaScript 04 流程控制(循环)

热门文章

  1. Spring Cloud 极简入门
  2. 【REST系列】详解REST架构风格 —— 带你阅读Web发展史上的一个重要技术文献
  3. 计算机cfd教学,规整填料CFD模拟X - 天津大学研究生数字化教学(E-LEARNING)平台.pptx...
  4. 资深书虫测评2018年最热网络小说App~看书必备
  5. 微信演进的六点思考:微信生态如何演变?如何在其中掘金?
  6. 图片横向打印横向打印图片的方法
  7. web项目的getContextPath()
  8. 澳大利亚大学着眼于不断增长的中国市场,将在迪拜推出全球奢侈品管理学位
  9. Ubuntu无法上网问题解决
  10. CFileDialog的使用(MFC-C++)