iPhone/iOS開啟個人熱點的縱向適配小結

2021-02-14 iOS開發

作者:弦苦地址:http://blog.csdn.net/phunxm/article/details/42967035

一.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

也即當有熱點欄時,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;}

參考

《iOS7兼容之前版本》

http://www.cnblogs.com/zcw-ios/articles/3340197.html

《iOS7適配》

http://blog.csdn.net/toss156/article/details/11843873

《iOS7 UI適配》

http://www.tekuba.net/wap.asp?act=View&id=344

《iOS7遇到的一些問題及解決方法》

http://blog.csdn.net/cssmhyl/article/details/17582261

《iOS7用代碼解決視圖控制器的View整體上移問題》

http://blog.csdn.net/kmyhy/article/details/20444611

相關焦點

  • iPhone屏幕尺寸、解析度及適配
    (2)按高度適配    在同樣的寬度下,iPhone4(s)的屏高比iPhone5(s)低,若縱向排版緊張,可以iPhone5(s)為基準,按高度適配:        fitScreenHeight= height*(SCREEN_HEIGHT/568)    共有iPhone3/4、5、6、6
  • 移動端適配小結
    idealviewport: 為瀏覽器定義的可完美適配移動端的理想 viewport,固定不變,可以認為是設備視口寬度。比如 iphone 7 為 375px, iphone 7p 為 414px。如 iphone 6、7、8 的 dpr 為 2,那麼一個設備獨立像素便為 4 個物理像素,因此在 css 上設置的 1px 在其屏幕上佔據的是 2個物理像素,0.5px 對應的才是其所能展示的最小單位。這就是 1px 在 retina 屏上變粗的原因,目前有很多辦法來解決這一問題。
  • iPhone、iPad虛擬定位神器 - 位移精靈評測
    如此善意和惡意的第三方行為,使得用戶對個人的信息安全感到恐慌。據調查,60%的APP處於行為不當的範圍。那麼,在避免不了安裝App並默認授權第三方使用的情況下,用戶該如何在最大程度上保護自己的隱私安全呢?根據市場現狀和用戶的剛需,在2018年開發出了一款智能藍牙硬體 位移精靈。
  • iPhone 12來了,設計師們準備好適配了嗎?
    10月13號,蘋果舉辦了年度的發布會並發布了四款新iPhone,發布會的重頭戲是介紹新的設計和新的功能特色,這裡簡單總結下:我覺得這次的設計是iPhone5/iPad Pro機型的回歸,我個人是非常喜歡那套設計的,喜歡它的小巧和功能。無線充電技術可以讓未來的蘋果筆記本電腦(基於ARM)也同樣可以具備快捷充電方式。
  • UI設計教程之:ios與android ui適配(將IOS UI轉換成Android經驗暢談)
    內容提要:這是UI設計系列教程之ios與android ui適配經驗暢談。
  • iPhone 12 如何設置個人熱點?
    如何在 iPhone 12 上開啟和設置個人熱點?以下是詳細的介紹信息:開啟個人熱點:1.前往「設置」-「蜂窩網絡」,或「設置」-「個人熱點」。2.輕點「允許其他人加入」旁邊的滑塊並打開。您也可以在 iPhone 使用蜂窩移動數據連接時,打開控制中心,然後點擊熱點圖標,此時會顯示「個人熱點可被發現」。
  • 29 在 iPhone上設置個人熱點
    點擊播放課程原文當您無法訪問 Wi-Fi 網絡時,可通過個人熱點來共享您 iPhone 或 iPad的蜂窩移動數據連接,也就是您的4G網絡。如何設置個人熱點呢?首先,前往「設置」>「蜂窩行動網路」。
  • 手把手教你提取中國電信38.0運營商文件刷機,iphone11及所有型號有鎖機移動聯通lte變4g開啟熱點
    第1步.準備要提取運營商文件的完整固件版本(比如我提取7p的ios13.1.2系統)。三、沒有越獄的有鎖iphone呢,獲得「電信38.0運營商文件.ipcc「之後,最簡單的辦法還是手機連接愛思,載入剛才製作好的電信38.0運營商文件.ipcc,即可。這裡我直接提供已經提取好了的38.0電信運營商文件。
  • 無法在 iPhone 上正常使用「個人熱點」怎麼辦?
    如果您無法在 iPhone 或 iPad 上正常使用「個人熱點」,可參考本教程嘗試解決問題。在使用「個人熱點」之前,請確認您的無線運營商有沒有啟用「個人熱點」,以及您的無線套餐是不是支持「個人熱點」。並在「設置」-「個人熱點」中開啟「允許其他人加入」。
  • 蘋果悄悄改變了iOS 13個人熱點功能使用方式
    細心的用戶可能已經發現,在 iOS 13 中,蘋果悄悄地改變了「個人熱點」的使用邏輯
  • iPhone無線區域網和個人熱點使用介紹
    可以通過「個人熱點」功能,共享iPhone 的網際網路連接,讓其他設備連接iPhone實現網際網路的連接。注意:iPhone必須通過運營商3G或者4G網絡才能實現個人熱點共享功能,如果您的運營商網絡是普通2G就無法開啟該功能。
  • iPhone這三種個人熱點讓你隨時隨地都能上網!
    首先你必須先把熱點功能開啟。開啟的步驟很簡單,請先打開你的手機「設定」,接著再進到「個人熱點」,最後再把上圖最右邊紅框中的開關打開,讓他變成綠色。這樣就順利啟用你的手機個人熱點啦~如何連線我們稍後再說。
  • iOS升/降級教程丨iOS 14 降級 iOS 13 實操教程
    2020年6月23日號凌晨,蘋果公司正式發布了 iOS 14 等全新的作業系統;回顧一下IOS 14的特性:App Library 資源庫……桌面小組件(全新體驗,借鑑於WP)視頻畫中畫(這個可以有,等後期APP的適配
  • 高效的iPhone X適配技術方案(UGUI和NGUI)
    適配來源:按照蘋果官方人機界面指南 : https://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/在iPhone X 異形屏幕上,蘋果提出了Safe Area安全區的概念,這個安全區域的意思是,UI在Safe Area能夠保證顯示不會被裁切掉
  • 【精簡版】iPhone 12 APP設計適配指南
    自從iphone 12上市以來,想必很多有條件的小夥伴們已經更新換代了,拿到了最新的iphone 12 或者是 iphone 12 MAX手機。
  • 蘋果開放激活鎖(Activation Lock)開啟狀態查詢
  • Windows10或iPad無法連接iPhone個人熱點,怎麼辦?
    (一)問題描述iPhone開啟個人熱點後,筆記本(Win10)檢測到該手機熱點,連接後發現過一會兒出現「無法連接到此網絡」。
  • iOS 13 「個人熱點」功能找到不開關,無法關閉解決方法
    有部分用戶發現,升級到 iOS 13.1 或更新版本之後,個人熱點功能似乎無法進行關閉了,因為在設置中已經找不到開關。這是否屬於一個 Bug?
  • 蘋果12個人熱點在哪裡 iPhone12個人熱點支持5G嗎
    在iPhone12手機中要怎麼打開個人熱點,個人熱點是否支持5G呢,我們來一起看下具體的介紹。1、在iPhone12手機上的【設置】-【個人熱點】即可開啟分享個人熱點,前提是要關閉WIFI連接,同時還要連接蜂窩數據網絡2、另外在【個人熱點】中有一個【最大化兼容性】,起鬨後會將【個人熱點】恢復為2.4GHz WIFI3、iPhone12支持更高速度的5G網絡與5GHz Wifi,但是必須進行測試以確認速度的提高幅度
  • 解決 iPhone「個人熱點」問題的 5 種方法
    下面科技獸就介紹 5 種小方法,或許能解決你所遇到的 iOS13 個人熱點問題。控制中心開關熱點即便是 iOS12 系統中,長期開啟 iPhone 的「個人熱點」功能時,一段時間後也會出現無法找到的情況。因此,如果在其他設備上搜不到 iPhone 的熱點,可以嘗試在設置中重啟「個人熱點」。