mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-15 17:42:15 +08:00
fix(platform): properly detect iPads running iPadOS (#19258)
* Add support for iPadOS * add better test * small tweak
This commit is contained in:
@ -33,14 +33,25 @@ const detectPlatforms = (win: Window) =>
|
|||||||
const isMobileWeb = (win: Window): boolean =>
|
const isMobileWeb = (win: Window): boolean =>
|
||||||
isMobile(win) && !isHybrid(win);
|
isMobile(win) && !isHybrid(win);
|
||||||
|
|
||||||
const isIpad = (win: Window) =>
|
const isIpad = (win: Window) => {
|
||||||
testUserAgent(win, /iPad/i);
|
// iOS 12 and below
|
||||||
|
if (testUserAgent(win, /iPad/i)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// iOS 13+
|
||||||
|
if (testUserAgent(win, /Macintosh/i) && isMobile(win)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
const isIphone = (win: Window) =>
|
const isIphone = (win: Window) =>
|
||||||
testUserAgent(win, /iPhone/i);
|
testUserAgent(win, /iPhone/i);
|
||||||
|
|
||||||
const isIOS = (win: Window) =>
|
const isIOS = (win: Window) =>
|
||||||
testUserAgent(win, /iPad|iPhone|iPod/i);
|
testUserAgent(win, /iPhone|iPod/i) || isIpad(win);
|
||||||
|
|
||||||
const isAndroid = (win: Window) =>
|
const isAndroid = (win: Window) =>
|
||||||
testUserAgent(win, /android|sink/i);
|
testUserAgent(win, /android|sink/i);
|
||||||
|
@ -63,10 +63,11 @@ describe('Platform Tests', () => {
|
|||||||
expect(isPlatform(win, 'desktop')).toEqual(true);
|
expect(isPlatform(win, 'desktop')).toEqual(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return true for "android" and "tablet" on an android tablet', () => {
|
it('should return true for "android" and "tablet" and false for "ios" on an android tablet', () => {
|
||||||
const win = configureBrowser(PlatformConfiguration.AndroidTablet);
|
const win = configureBrowser(PlatformConfiguration.AndroidTablet);
|
||||||
expect(isPlatform(win, 'android')).toEqual(true);
|
expect(isPlatform(win, 'android')).toEqual(true);
|
||||||
expect(isPlatform(win, 'tablet')).toEqual(true);
|
expect(isPlatform(win, 'tablet')).toEqual(true);
|
||||||
|
expect(isPlatform(win, 'ios')).toEqual(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return true for "cordova" and "hybrid" in a Cordova app', () => {
|
it('should return true for "cordova" and "hybrid" in a Cordova app', () => {
|
||||||
@ -95,10 +96,11 @@ describe('Platform Tests', () => {
|
|||||||
expect(isPlatform(win, 'desktop')).toEqual(false);
|
expect(isPlatform(win, 'desktop')).toEqual(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return false for "android" and "tablet" on desktop Safari', () => {
|
it('should return false for "android", "tablet", and "ipad" on desktop Safari', () => {
|
||||||
const win = configureBrowser(PlatformConfiguration.DesktopSafari);
|
const win = configureBrowser(PlatformConfiguration.DesktopSafari);
|
||||||
expect(isPlatform(win, 'android')).toEqual(false);
|
expect(isPlatform(win, 'android')).toEqual(false);
|
||||||
expect(isPlatform(win, 'tablet')).toEqual(false);
|
expect(isPlatform(win, 'tablet')).toEqual(false);
|
||||||
|
expect(isPlatform(win, 'ipad')).toEqual(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return false for "android" and "tablet" and false for "desktop" on iPhone', () => {
|
it('should return false for "android" and "tablet" and false for "desktop" on iPhone', () => {
|
||||||
@ -120,5 +122,14 @@ describe('Platform Tests', () => {
|
|||||||
expect(isPlatform(win, 'pwa')).toEqual(true);
|
expect(isPlatform(win, 'pwa')).toEqual(true);
|
||||||
expect(isPlatform(win, 'cordova')).toEqual(false);
|
expect(isPlatform(win, 'cordova')).toEqual(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return true for "ios", "ipad", and "tablet" and false for "iphone" and "android"', () => {
|
||||||
|
const win = configureBrowser(PlatformConfiguration.iPadOS);
|
||||||
|
expect(isPlatform(win, 'ios')).toEqual(true);
|
||||||
|
expect(isPlatform(win, 'ipad')).toEqual(true);
|
||||||
|
expect(isPlatform(win, 'tablet')).toEqual(true);
|
||||||
|
expect(isPlatform(win, 'iphone')).toEqual(false);
|
||||||
|
expect(isPlatform(win, 'android')).toEqual(false);
|
||||||
|
});
|
||||||
})
|
})
|
||||||
});
|
});
|
@ -85,5 +85,13 @@ export const PlatformConfiguration = {
|
|||||||
innerWidth: 360,
|
innerWidth: 360,
|
||||||
innerHeight: 740,
|
innerHeight: 740,
|
||||||
matchMedia: mockMatchMedia(['(any-pointer:coarse)'])
|
matchMedia: mockMatchMedia(['(any-pointer:coarse)'])
|
||||||
|
},
|
||||||
|
iPadOS: {
|
||||||
|
navigator: {
|
||||||
|
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15'
|
||||||
|
},
|
||||||
|
innerWidth: 1024,
|
||||||
|
innerHeight: 1292,
|
||||||
|
matchMedia: mockMatchMedia(['(any-pointer:coarse)'])
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user