iOS13 iPadOS WKWebView獲取到的UserAgent中的設備變成Macintosh的問題

前陣子適配 iOS13 的時候遇到一個關于WKWebView設置UserAgent的問題实柠,在iPadOS上,WKWebView的UserAgent變成了類似這樣:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko)

這就導致前端根據(jù)UserAgent判斷設備的地方出了問題善涨,當時發(fā)現(xiàn)其主要原因是iPadOS在設置-Safari瀏覽器-請求桌面網站的設置默認是開啟的窒盐,只要把它關掉就正常了,但是你又不能要求審核人員或者用戶自己去把它關了钢拧,所以當時臨時采取了一些其他方法去適配蟹漓,也參考了如下:

https://forums.developer.apple.com/thread/122189
https://stackoverflow.com/questions/58490952/how-to-test-ios-in-use-from-the-javascript-inside-a-wkwebview-on-ipados-13

等等...其他的實在不記得地址了。

但是忙完那段時間之后源内,想想之前的處理方案并不靠譜葡粒,因為蘋果爸爸雖然有不靠譜的地方,但也不至于這樣,所以去查閱了一下WKWebView中新增的api嗽交,發(fā)現(xiàn)果然有個新的api叫做WKWebpagePreferences:

 /*! @abstract The set of default webpage preferences to use when loading and rendering content.

@discussion These default webpage preferences are additionally passed to the navigation delegate

in -webView:decidePolicyForNavigationAction:preferences:decisionHandler:.

*/

@property (null_resettable, nonatomic, copy) WKWebpagePreferences *defaultWebpagePreferences API_AVAILABLE(macos(10.15), ios(13.0));
/*! @enum WKContentMode

@abstract A content mode represents the type of content to load, as well as

additional layout and rendering adaptations that are applied as a result of

loading the content

@constant WKContentModeRecommended  The recommended content mode for the current platform

@constant WKContentModeMobile      Represents content targeting mobile browsers

@constant WKContentModeDesktop      Represents content targeting desktop browsers

@discussion WKContentModeRecommended behaves like WKContentModeMobile on iPhone and iPad mini

and WKContentModeDesktop on other iPad models as well as Mac.

*/

typedef NS_ENUM(NSInteger, WKContentMode) {

    WKContentModeRecommended,

    WKContentModeMobile,

    WKContentModeDesktop

} API_AVAILABLE(ios(13.0));

/*! A WKWebpagePreferences object is a collection of properties that

determine the preferences to use when loading and rendering a page.

@discussion Contains properties used to determine webpage preferences.

*/

WK_EXTERN API_AVAILABLE(macos(10.15), ios(13.0))

@interface WKWebpagePreferences : NSObject

/*! @abstract A WKContentMode indicating the content mode to prefer

when loading and rendering a webpage.

@discussion The default value is WKContentModeRecommended. The stated

preference is ignored on subframe navigation

*/

@property (nonatomic) WKContentMode preferredContentMode API_AVAILABLE(ios(13.0));

@end

仔細看完確定這就是我要找的東西卿嘲。

WKContentModeRecommended behaves like WKContentModeMobile on iPhone and iPad mini
and WKContentModeDesktop on other iPad models as well as Mac.

我們只需要在初始化的時候這么設置,就可以設置WKWebpagePreferences的preferredContentMode為WKContentModeMobile夫壁,這樣iPadOS上的UserAgent就正常了:

WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
if (@available(iOS 13.0, *)) {
   configuration.defaultWebpagePreferences.preferredContentMode = WKContentModeMobile;
}

此外還有和WKWebpagePreferences相關的新api拾枣,我們可以按需決定是否實現(xiàn):

/*! @abstract Decides whether to allow or cancel a navigation.

@param webView The web view invoking the delegate method.

@param navigationAction Descriptive information about the action

triggering the navigation request.

@param preferences The default set of webpage preferences. This may be

changed by setting defaultWebpagePreferences on WKWebViewConfiguration.

@param decisionHandler The policy decision handler to call to allow or cancel

the navigation. The arguments are one of the constants of the enumerated type

WKNavigationActionPolicy, as well as an instance of WKWebpagePreferences.

@discussion If you implement this method,

-webView:decidePolicyForNavigationAction:decisionHandler: will not be called.

*/

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction preferences:(WKWebpagePreferences *)preferences decisionHandler:(void (^)(WKNavigationActionPolicy, WKWebpagePreferences *))decisionHandler API_AVAILABLE(macos(10.15), ios(13.0));

在完成適配之后我也查了一下網上的資料,發(fā)現(xiàn)很多文章并沒有深究盒让,還是之前那些奇奇怪怪的方案梅肤,也可能大佬們懶得總結吧,所以這里分享一下我的解決方案(還是要好好看看api的更新)邑茄。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末姨蝴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子撩扒,更是在濱河造成了極大的恐慌似扔,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搓谆,死亡現(xiàn)場離奇詭異炒辉,居然都是意外死亡,警方通過查閱死者的電腦和手機泉手,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門黔寇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斩萌,你說我怎么就攤上這事缝裤。” “怎么了颊郎?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵憋飞,是天一觀的道長。 經常有香客問我姆吭,道長榛做,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任内狸,我火速辦了婚禮检眯,結果婚禮上,老公的妹妹穿的比我還像新娘昆淡。我一直安慰自己锰瘸,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布昂灵。 她就那樣靜靜地躺著避凝,像睡著了一般舞萄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恕曲,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天鹏氧,我揣著相機與錄音,去河邊找鬼佩谣。 笑死把还,一個胖子當著我的面吹牛,可吹牛的內容都是我干的茸俭。 我是一名探鬼主播吊履,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼调鬓!你這毒婦竟也來了艇炎?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤腾窝,失蹤者是張志新(化名)和其女友劉穎缀踪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虹脯,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡驴娃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了循集。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唇敞。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖咒彤,靈堂內的尸體忽然破棺而出疆柔,到底是詐尸還是另有隱情,我是刑警寧澤镶柱,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布旷档,位于F島的核電站,受9級特大地震影響歇拆,放射性物質發(fā)生泄漏鞋屈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一查吊、第九天 我趴在偏房一處隱蔽的房頂上張望谐区。 院中可真熱鬧湖蜕,春花似錦逻卖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炼杖。三九已至,卻和暖如春盗迟,著一層夾襖步出監(jiān)牢的瞬間坤邪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工罚缕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留艇纺,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓邮弹,卻偏偏與公主長得像黔衡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腌乡,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容