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

2021-12-21 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

相關焦點

  • 蘋果ios14畫中畫怎麼開啟使用 ios14畫中畫設置教程
    蘋果ios14畫中畫怎麼開啟使用 ios14畫中畫設置教程  ios14畫中畫功能在哪裡設置?蘋果系統升級之後,會有一個畫中畫系統,畫中畫的使用方法很多人都不清楚,對於畫中畫的功能作用和設置方法,小編在下面準備了詳細的教程,能幫助蘋果用戶快速熟悉畫中畫功能。
  • 小米手環4NFC版本適配iPhone是一種什麼樣的體驗?
    相對於其他智慧型手機廠商,小米是國內唯一一家採用AIOT+手機雙引擎戰略的移動網際網路公司,智能硬體種類繁多,涉及的領域更是豐富,由於信息不對稱等因素,造成當下一部分群體對於小米智能硬體的使用存在誤區,今天我們除了聊手環4的升級點,還要帶著大家體驗ios平臺的手環適配,看看非小米手機,甚至非安卓的平臺,小米的產品是否可以完美適配並正常工作。
  • 國內用戶對iphone那麼大的粘度到底是怎麼來的
    作為世界上數一數二的手機製造商,iphone在國內市場上的成功應該大家都能看得到,這得益於ios系統流暢的體驗和封閉的運行模式。這樣的模式有好處也有壞處,好處是非常穩定,壞處的話就是封閉的環境導致用戶的自由度不高。
  • 開會的時候開啟iPhone 的IOS勿擾模式
    如果你不想在某個時間有電話打進來(特別是開重要會議的時候),可以在「控制中心」(在屏幕上從下往上劃)開啟手機的:勿擾模式。(圖標是月亮)勿擾模式是除了時鐘裡的「鬧鐘」和「倒計時」之外,能屏蔽所有聲音和信息來源。
  • 慕課網v2.2.1登陸AppStore 適配iphone6
    近日慕課網v2.2.1全新版本在App Store發布,該版本不僅新增了消息功能、優化了好友消息,同時專門適配iphone6/6 plus,成為首款適配大屏幕iPhone的教育類應用。  慕課網App成國內首款適配iPhone 6的IT教育應用  自10月10日中國大陸蘋果官網正式接受iPhone6預購後,已有大批果粉從不同渠道搶先購入iPhone6、iphone6
  • iphone換電池有必要選原裝嗎?別急著決定,今天給大家普及一下!
    iphone換電池有必要選原裝嗎?別急著決定,今天給大家普及一下!手機作為每人標配的電子設備,是目前應用非常廣泛的通訊工具,特別是iphone手機,作為全球銷量王,家喻戶曉,但是我們也知道iphone手機的價格是非常昂貴的,零配件也是,大家應該都知道iPhone手機的電池價格還是比較高,換一塊電池總覺得很是心疼,而且維修的周期比較長,所以這個時候很多的人就有想法去更換第三方的電池,他們在價格上會比原裝的電池便宜不少,而維修時間也比較短
  • 29 在 iPhone上設置個人熱點
    點擊播放課程原文當您無法訪問 Wi-Fi 網絡時,可通過個人熱點來共享您 iPhone 或 iPad的蜂窩移動數據連接,也就是您的4G網絡。如何設置個人熱點呢?首先,前往「設置」>「蜂窩行動網路」。接著輕點「個人熱點」,然後輕點滑塊以開啟。
  • 行動裝置適配基礎知識速成
    我們都知道現在行動裝置屏幕尺寸非常多,不同的屏幕尺寸又分裂出很多的屏幕解析度,以手機為例iphone和android的屏幕解析度就有:480×800、480×854、540×960、640×960、640×1136、720×1280、750×1334、1080×1920、1242×2208和越來越流行的2K屏。
  • ios11怎麼個人到個人轉帳 蘋果ios11個人到個人轉帳方法
    ios11怎麼個人到個人轉帳?ios11增加了新功能,就是支持個人到個人轉帳,下文介紹蘋果ios11個人到個人轉帳方法,一起和小樂哥來了解下吧!蘋果ios11個人到個人轉帳方法:   蘋果第28屆全球開發者大會將於6月5日在加利福尼亞州聖荷西的麥克尼裡會議中心開幕,屆時ios11將正式亮相,雖然還有幾周的時間,但是傳言已經開始流出,ios11應該會在6月份推出後不久就會以beta版的形式發布,正式版本將在秋季早些時候推出。
  • ios14馬上就要更新了,iphone自帶的截長圖功能,你還不知道?
    大家都知道安卓手機早可以截長屏了,iphone想要截長屏還要一張一張截圖然後拼接,ios13更新後,蘋果終於推出了截長屏功能,今天小編就給大家分享截長屏的教程,下面看下效果。首先我們需要打開iphone自帶的「Safari」瀏覽器。打開後我們進行截屏操作(電源鍵+音量上鍵),截取成功後,點擊此截圖,進入修改頁面,可以看到上面有兩個選項,我們點擊「整頁」選項。
  • 無法在 iPhone 上正常使用「個人熱點」怎麼辦?
    如果您無法在 iPhone 或 iPad 上正常使用「個人熱點」,可參考本教程嘗試解決問題。在使用「個人熱點」之前,請確認您的無線運營商有沒有啟用「個人熱點」,以及您的無線套餐是不是支持「個人熱點」。並在「設置」-「個人熱點」中開啟「允許其他人加入」。
  • 對比iOS12,這續航看不懂
    ios13.2.3正式版軟體是今天蘋果凌晨剛剛更新的最新的ios的手機系統,部分以後在前期手機的使用當中出現了,app 在後臺使用當中無法下載的的問題哦,現在這些問題已經都統統解決了哦,在適配iOS版本哪更新,沒有太大問題,即使跨版本更新,也沒有很大問題。
  • 蘋果7P要升級到ios12.2嗎?這是我見到最好的分析,7P用戶可參考
    在軟體方面,蘋果公司連續在近幾個月對ios系統進行了升級,最近的ios12.2版本的升級讓很多目前還手持蘋果6、6s及其蘋果7、7P的用戶犯了難,到底是升還是不升呢?下面的分析小編覺得還是非常中肯,對於目前還在使用這四款老iphone的用戶很有指導意義,大家不妨來學習一下。
  • 問答:iPhone 6s升級iOS 12應用開啟速度變化
    6月5日凌晨,蘋果在WWDC全球開發者大會上正式發布了iOS 12系統,我們也用三年前的iphone 6s升級了iOS 12系統,並且與之前停留在iOS 11版本的時候進行了應用開啟速度的對比。通過視頻可以看得出來,iOS 12在應用開啟速度上雖然相比iOS 11略慢了一些,但是在過渡動畫上卻是更加的流暢順滑,這樣的變化也讓用戶可以在視覺方面對iOS 12形成「開啟變快」的判斷。
  • 如何開啟new ipad個人熱點設置教程
    把手機的接收GPRS或3G信號轉化為wifi信號再發出去,這樣,你的手機就成了一個WIFI熱點,手機必須有無線AP功能,才能當做熱點。
  • 買手機可以不買iPhone,買平板必須買ipad!ipad有什麼優點?
    有這麼一個說法,手機不買iphone可以,平板必買ipad,這句話體現了什麼?就我個人而言,ipad的體驗感確實高於一般的安卓平板。主要在ipad行業中,蘋果的技術相對於更為成熟,但近兩年華為、三星的平板也一直在追趕ipad,ipad具體有什麼優點,今天幫您分析下!
  • VLC播放器iOS版更新:適配iPhone X
    IT之家12月9日消息 iOS平臺不乏各種好用的付費播放軟體,但說到免費的播放器軟體VLC肯定有一席之地,這款跨平臺開源播放器不僅支持絕大多數的音視頻格式,最主要其是免費的,近兩天這款播放器獲得了更新,主要是適配了iPhone X的劉海屏,並修復了一些錯誤。
  • iPhone這三種個人熱點讓你隨時隨地都能上網!
    首先你必須先把熱點功能開啟。開啟的步驟很簡單,請先打開你的手機「設定」,接著再進到「個人熱點」,最後再把上圖最右邊紅框中的開關打開,讓他變成綠色。這樣就順利啟用你的手機個人熱點啦~如何連線我們稍後再說。
  • 微信遵守ios深色模式沒被下架,QQ HD卻被蘋果下架
    最近新版ios13系統給果粉能推送了一個福利,就是iPhone用戶升級該系統後,微信就可以開啟深色模式了。深色模式可以簡單理解為將手機顯示界面的白色部分變成黑色,另外加深其它顏色的字體或者模塊,深色模式有兩大好處,一是保護視力(特別是夜間使用手機時),二是省電,這對於小電池容量的iPhone來說很有幫助。
  • iPhone無線區域網和個人熱點使用介紹
    可以通過「個人熱點」功能,共享iPhone 的網際網路連接,讓其他設備連接iPhone實現網際網路的連接。注意:iPhone必須通過運營商3G或者4G網絡才能實現個人熱點共享功能,如果您的運營商網絡是普通2G就無法開啟該功能。