diff --git a/Gemfile.lock b/Gemfile.lock index a46457d06..3e994178f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -6,7 +6,7 @@ GEM public_suffix (>= 2.0.2, < 5.0) atomos (0.1.3) aws-eventstream (1.1.0) - aws-partitions (1.397.0) + aws-partitions (1.402.0) aws-sdk-core (3.109.3) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) @@ -15,7 +15,7 @@ GEM aws-sdk-kms (1.39.0) aws-sdk-core (~> 3, >= 3.109.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.85.0) + aws-sdk-s3 (1.86.0) aws-sdk-core (~> 3, >= 3.109.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.1) @@ -45,7 +45,7 @@ GEM faraday_middleware (1.0.0) faraday (~> 1.0) fastimage (2.2.0) - fastlane (2.168.0) + fastlane (2.169.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.3, < 3.0.0) aws-sdk-s3 (~> 1.0) diff --git a/fastlane/Snapfile b/fastlane/Snapfile index 77645a189..f4c32d7cd 100644 --- a/fastlane/Snapfile +++ b/fastlane/Snapfile @@ -13,9 +13,9 @@ devices([ # "iPhone 8", # 4.7-inch # "iPhone 8 Plus", # 5.5-inch # "iPhone 11 Pro", # 5.8-inch -# "iPhone 11 Pro Max", # 6.5-inch + "iPhone 11 Pro Max", # 6.5-inch # "iPad Pro (9.7-inch)", # 9.7-inch - "iPad Pro (10.5-inch)", # 10.5-inch +# "iPad Pro (10.5-inch)", # 10.5-inch # "iPad Pro (12.9-inch) (2nd generation)", # 12.9-inch # "iPad Pro (11-inch) (2nd generation)", # 11-inch # "iPad Pro (12.9-inch) (3rd generation)" # 12.9-inch @@ -27,7 +27,7 @@ languages([ # "zh_Hans", # "da", # "nl_NL", -# "fr_FR", + "fr_FR", # "de_DE", # "id", # "it", diff --git a/fastlane/screenshots/es-ES/iPad Pro (11-inch) (2nd generation)-Image04.png b/fastlane/screenshots/es-ES/iPad Pro (11-inch) (2nd generation)-Image04.png index 1622d4532..607fcffbb 100644 Binary files a/fastlane/screenshots/es-ES/iPad Pro (11-inch) (2nd generation)-Image04.png and b/fastlane/screenshots/es-ES/iPad Pro (11-inch) (2nd generation)-Image04.png differ diff --git a/fastlane/screenshots/fr-FR/iPhone 11 Pro Max-Image04.png b/fastlane/screenshots/fr-FR/iPhone 11 Pro Max-Image04.png index 5f5b5b944..1f854bbd4 100644 Binary files a/fastlane/screenshots/fr-FR/iPhone 11 Pro Max-Image04.png and b/fastlane/screenshots/fr-FR/iPhone 11 Pro Max-Image04.png differ diff --git a/fastlane/screenshots/fr-FR/iPhone 11 Pro Max-Image05.png b/fastlane/screenshots/fr-FR/iPhone 11 Pro Max-Image05.png index fa3542ddb..d51201215 100644 Binary files a/fastlane/screenshots/fr-FR/iPhone 11 Pro Max-Image05.png and b/fastlane/screenshots/fr-FR/iPhone 11 Pro Max-Image05.png differ diff --git a/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image01.png b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image01.png new file mode 100644 index 000000000..e55dcd977 Binary files /dev/null and b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image01.png differ diff --git a/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image02.png b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image02.png new file mode 100644 index 000000000..a92449fe6 Binary files /dev/null and b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image02.png differ diff --git a/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image03.png b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image03.png new file mode 100644 index 000000000..246b5a231 Binary files /dev/null and b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image03.png differ diff --git a/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image04.png b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image04.png new file mode 100644 index 000000000..add0ea636 Binary files /dev/null and b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image04.png differ diff --git a/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image05.png b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image05.png new file mode 100644 index 000000000..ec6e314fa Binary files /dev/null and b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image05.png differ diff --git a/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image06.png b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image06.png new file mode 100644 index 000000000..eb9672852 Binary files /dev/null and b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image06.png differ diff --git a/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image07.png b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image07.png new file mode 100644 index 000000000..30c1bff43 Binary files /dev/null and b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image07.png differ diff --git a/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image08.png b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image08.png new file mode 100644 index 000000000..1f40a3524 Binary files /dev/null and b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image08.png differ diff --git a/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image09.png b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image09.png new file mode 100644 index 000000000..77b2f185d Binary files /dev/null and b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image09.png differ diff --git a/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image10.png b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image10.png new file mode 100644 index 000000000..f6c2cf061 Binary files /dev/null and b/fastlane/screenshots/fr_FR/iPhone 11 Pro Max-Image10.png differ diff --git a/fastlane/screenshots/id/iPad Pro (9.7-inch)-Image04.png b/fastlane/screenshots/id/iPad Pro (9.7-inch)-Image04.png index 2a395f502..e07507120 100644 Binary files a/fastlane/screenshots/id/iPad Pro (9.7-inch)-Image04.png and b/fastlane/screenshots/id/iPad Pro (9.7-inch)-Image04.png differ diff --git a/fastlane/screenshots/id/iPhone 11 Pro Max-Image04.png b/fastlane/screenshots/id/iPhone 11 Pro Max-Image04.png index c8a1f1e59..97eddc0a3 100644 Binary files a/fastlane/screenshots/id/iPhone 11 Pro Max-Image04.png and b/fastlane/screenshots/id/iPhone 11 Pro Max-Image04.png differ diff --git a/fastlane/screenshots/id/iPhone 11 Pro Max-Image05.png b/fastlane/screenshots/id/iPhone 11 Pro Max-Image05.png index 325e5660a..44e08c7cb 100644 Binary files a/fastlane/screenshots/id/iPhone 11 Pro Max-Image05.png and b/fastlane/screenshots/id/iPhone 11 Pro Max-Image05.png differ diff --git a/fastlane/screenshots/screenshots.html b/fastlane/screenshots/screenshots.html index ae6f01e27..41ec050b3 100644 --- a/fastlane/screenshots/screenshots.html +++ b/fastlane/screenshots/screenshots.html @@ -670,2298 +670,2359 @@

da

-

de

+

de-DE


- iPad Pro (10.5-inch) + iPad Pro (10.5-inch)
- - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) - - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) - - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) - - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) - - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) - - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) - - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) - - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) - - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) - - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch)
- iPad Pro (11-inch) (2nd generation) + iPad Pro (11-inch) (2nd generation)
- - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) - - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) - - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) - - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) - - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) - - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) - - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) - - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) - - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) - - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation)
- iPad Pro (12.9-inch) (2nd generation) + iPad Pro (12.9-inch) (2nd generation)
- - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) - - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) - - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) - - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) - - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) - - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) - - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) - - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) - - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) - - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation)
- iPad Pro (12.9-inch) (3rd generation) + iPad Pro (12.9-inch) (3rd generation)
- - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) - - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) - - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) - - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) - - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) - - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) - - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) - - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) - - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) - - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation)
- iPad Pro (9.7-inch) + iPad Pro (9.7-inch)
- - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) - - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) - - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) - - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) - - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) - - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) - - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) - - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) - - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) - - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch)
- iPhone 11 Pro Max + iPhone 11 Pro Max
- - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max - - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max - - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max - - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max - - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max - - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max - - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max - - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max - - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max - - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max
- iPhone 11 Pro + iPhone 11 Pro
- - de iPhone 11 Pro + + de-DE iPhone 11 Pro - - de iPhone 11 Pro + + de-DE iPhone 11 Pro - - de iPhone 11 Pro + + de-DE iPhone 11 Pro - - de iPhone 11 Pro + + de-DE iPhone 11 Pro - - de iPhone 11 Pro + + de-DE iPhone 11 Pro - - de iPhone 11 Pro + + de-DE iPhone 11 Pro - - de iPhone 11 Pro + + de-DE iPhone 11 Pro - - de iPhone 11 Pro + + de-DE iPhone 11 Pro - - de iPhone 11 Pro + + de-DE iPhone 11 Pro - - de iPhone 11 Pro + + de-DE iPhone 11 Pro
- iPhone 8 Plus + iPhone 8 Plus
- - de iPhone 8 Plus + + de-DE iPhone 8 Plus - - de iPhone 8 Plus + + de-DE iPhone 8 Plus - - de iPhone 8 Plus + + de-DE iPhone 8 Plus - - de iPhone 8 Plus + + de-DE iPhone 8 Plus - - de iPhone 8 Plus + + de-DE iPhone 8 Plus - - de iPhone 8 Plus + + de-DE iPhone 8 Plus - - de iPhone 8 Plus + + de-DE iPhone 8 Plus - - de iPhone 8 Plus + + de-DE iPhone 8 Plus - - de iPhone 8 Plus + + de-DE iPhone 8 Plus - - de iPhone 8 Plus + + de-DE iPhone 8 Plus
- iPhone 8 + iPhone 8
- - de iPhone 8 + + de-DE iPhone 8 - - de iPhone 8 + + de-DE iPhone 8 - - de iPhone 8 + + de-DE iPhone 8 - - de iPhone 8 + + de-DE iPhone 8 - - de iPhone 8 + + de-DE iPhone 8 - - de iPhone 8 + + de-DE iPhone 8 - - de iPhone 8 + + de-DE iPhone 8 - - de iPhone 8 + + de-DE iPhone 8 - - de iPhone 8 + + de-DE iPhone 8 - - de iPhone 8 + + de-DE iPhone 8
- iPhone SE + iPhone SE
- - de iPhone SE + + de-DE iPhone SE - - de iPhone SE + + de-DE iPhone SE - - de iPhone SE + + de-DE iPhone SE - - de iPhone SE + + de-DE iPhone SE - - de iPhone SE + + de-DE iPhone SE - - de iPhone SE + + de-DE iPhone SE - - de iPhone SE + + de-DE iPhone SE - - de iPhone SE + + de-DE iPhone SE - - de iPhone SE + + de-DE iPhone SE - - de iPhone SE + + de-DE iPhone SE
-

en

+

en-US


- iPad Pro (10.5-inch) + iPad Pro (10.5-inch)
- - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) - - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) - - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) - - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) - - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) - - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) - - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) - - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) - - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) - - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch)
- iPad Pro (11-inch) (2nd generation) + iPad Pro (11-inch) (2nd generation)
- - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) - - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) - - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) - - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) - - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) - - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) - - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) - - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) - - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) - - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation)
- iPad Pro (12.9-inch) (2nd generation) + iPad Pro (12.9-inch) (2nd generation)
- - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) - - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) - - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) - - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) - - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) - - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) - - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) - - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) - - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) - - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation)
- iPad Pro (12.9-inch) (3rd generation) + iPad Pro (12.9-inch) (3rd generation)
- - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) - - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) - - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) - - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) - - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) - - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) - - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) - - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) - - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) - - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation)
- iPad Pro (9.7-inch) + iPad Pro (9.7-inch)
- - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) - - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) - - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) - - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) - - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) - - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) - - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) - - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) - - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) - - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch)
- iPhone 11 Pro Max + iPhone 11 Pro Max
- - en iPhone 11 Pro Max + + en-US iPhone 11 Pro Max - - en iPhone 11 Pro Max + + en-US iPhone 11 Pro Max - - en iPhone 11 Pro Max + + en-US iPhone 11 Pro Max - - en iPhone 11 Pro Max + + en-US iPhone 11 Pro Max - - en iPhone 11 Pro Max + + en-US iPhone 11 Pro Max - - en iPhone 11 Pro Max + + en-US iPhone 11 Pro Max - - en iPhone 11 Pro Max + + en-US iPhone 11 Pro Max - - en iPhone 11 Pro Max + + en-US iPhone 11 Pro Max - - en iPhone 11 Pro Max + + en-US iPhone 11 Pro Max - - en iPhone 11 Pro Max + + en-US iPhone 11 Pro Max
- iPhone 11 Pro + iPhone 11 Pro
- - en iPhone 11 Pro + + en-US iPhone 11 Pro - - en iPhone 11 Pro + + en-US iPhone 11 Pro - - en iPhone 11 Pro + + en-US iPhone 11 Pro - - en iPhone 11 Pro + + en-US iPhone 11 Pro - - en iPhone 11 Pro + + en-US iPhone 11 Pro - - en iPhone 11 Pro + + en-US iPhone 11 Pro - - en iPhone 11 Pro + + en-US iPhone 11 Pro - - en iPhone 11 Pro + + en-US iPhone 11 Pro - - en iPhone 11 Pro + + en-US iPhone 11 Pro - - en iPhone 11 Pro + + en-US iPhone 11 Pro
- iPhone 8 Plus + iPhone 8 Plus
- - en iPhone 8 Plus + + en-US iPhone 8 Plus - - en iPhone 8 Plus + + en-US iPhone 8 Plus - - en iPhone 8 Plus + + en-US iPhone 8 Plus - - en iPhone 8 Plus + + en-US iPhone 8 Plus - - en iPhone 8 Plus + + en-US iPhone 8 Plus - - en iPhone 8 Plus + + en-US iPhone 8 Plus - - en iPhone 8 Plus + + en-US iPhone 8 Plus - - en iPhone 8 Plus + + en-US iPhone 8 Plus - - en iPhone 8 Plus + + en-US iPhone 8 Plus - - en iPhone 8 Plus + + en-US iPhone 8 Plus
- iPhone 8 + iPhone 8
- - en iPhone 8 + + en-US iPhone 8 - - en iPhone 8 + + en-US iPhone 8 - - en iPhone 8 + + en-US iPhone 8 - - en iPhone 8 + + en-US iPhone 8 - - en iPhone 8 + + en-US iPhone 8 - - en iPhone 8 + + en-US iPhone 8 - - en iPhone 8 + + en-US iPhone 8 - - en iPhone 8 + + en-US iPhone 8 - - en iPhone 8 + + en-US iPhone 8 - - en iPhone 8 + + en-US iPhone 8
- iPhone SE + iPhone SE
- - en iPhone SE + + en-US iPhone SE - - en iPhone SE + + en-US iPhone SE - - en iPhone SE + + en-US iPhone SE - - en iPhone SE + + en-US iPhone SE - - en iPhone SE + + en-US iPhone SE - - en iPhone SE + + en-US iPhone SE - - en iPhone SE + + en-US iPhone SE - - en iPhone SE + + en-US iPhone SE - - en iPhone SE + + en-US iPhone SE - - en iPhone SE + + en-US iPhone SE
-

es

+

es-ES


- iPad Pro (10.5-inch) + iPad Pro (10.5-inch)
- - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) - - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) - - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) - - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) - - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) - - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) - - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) - - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) - - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) - - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch)
- iPad Pro (11-inch) (2nd generation) + iPad Pro (11-inch) (2nd generation)
- - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) - - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) - - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) - - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) - - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) - - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) - - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) - - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) - - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) - - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation)
- iPad Pro (12.9-inch) (2nd generation) + iPad Pro (12.9-inch) (2nd generation)
- - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) - - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) - - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) - - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) - - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) - - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) - - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) - - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) - - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) - - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation)
- iPad Pro (12.9-inch) (3rd generation) + iPad Pro (12.9-inch) (3rd generation)
- - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) - - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) - - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) - - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) - - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) - - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) - - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) - - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) - - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) - - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation)
- iPad Pro (9.7-inch) + iPad Pro (9.7-inch)
- - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) - - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) - - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) - - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) - - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) - - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) - - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) - - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) - - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) - - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch)
- iPhone 11 Pro Max + iPhone 11 Pro Max
- - es iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max - - es iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max - - es iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max - - es iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max - - es iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max - - es iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max - - es iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max - - es iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max - - es iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max - - es iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max
- iPhone 11 Pro + iPhone 11 Pro
- - es iPhone 11 Pro + + es-ES iPhone 11 Pro - - es iPhone 11 Pro + + es-ES iPhone 11 Pro - - es iPhone 11 Pro + + es-ES iPhone 11 Pro - - es iPhone 11 Pro + + es-ES iPhone 11 Pro - - es iPhone 11 Pro + + es-ES iPhone 11 Pro - - es iPhone 11 Pro + + es-ES iPhone 11 Pro - - es iPhone 11 Pro + + es-ES iPhone 11 Pro - - es iPhone 11 Pro + + es-ES iPhone 11 Pro - - es iPhone 11 Pro + + es-ES iPhone 11 Pro - - es iPhone 11 Pro + + es-ES iPhone 11 Pro
- iPhone 8 Plus + iPhone 8 Plus
- - es iPhone 8 Plus + + es-ES iPhone 8 Plus - - es iPhone 8 Plus + + es-ES iPhone 8 Plus - - es iPhone 8 Plus + + es-ES iPhone 8 Plus - - es iPhone 8 Plus + + es-ES iPhone 8 Plus - - es iPhone 8 Plus + + es-ES iPhone 8 Plus - - es iPhone 8 Plus + + es-ES iPhone 8 Plus - - es iPhone 8 Plus + + es-ES iPhone 8 Plus - - es iPhone 8 Plus + + es-ES iPhone 8 Plus - - es iPhone 8 Plus + + es-ES iPhone 8 Plus - - es iPhone 8 Plus + + es-ES iPhone 8 Plus
- iPhone 8 + iPhone 8
- - es iPhone 8 + + es-ES iPhone 8 - - es iPhone 8 + + es-ES iPhone 8 - - es iPhone 8 + + es-ES iPhone 8 - - es iPhone 8 + + es-ES iPhone 8 - - es iPhone 8 + + es-ES iPhone 8 - - es iPhone 8 + + es-ES iPhone 8 - - es iPhone 8 + + es-ES iPhone 8 - - es iPhone 8 + + es-ES iPhone 8 - - es iPhone 8 + + es-ES iPhone 8 - - es iPhone 8 + + es-ES iPhone 8
- iPhone SE + iPhone SE
- - es iPhone SE + + es-ES iPhone SE - - es iPhone SE + + es-ES iPhone SE - - es iPhone SE + + es-ES iPhone SE - - es iPhone SE + + es-ES iPhone SE - - es iPhone SE + + es-ES iPhone SE - - es iPhone SE + + es-ES iPhone SE - - es iPhone SE + + es-ES iPhone SE - - es iPhone SE + + es-ES iPhone SE - - es iPhone SE + + es-ES iPhone SE - - es iPhone SE + + es-ES iPhone SE
-

fr

+

fr-FR


+ +
- iPad Pro (10.5-inch) + iPad Pro (10.5-inch)
- - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) - - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) - - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) - - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) - - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) - - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) - - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) - - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) - - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) - - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch)
- iPad Pro (11-inch) (2nd generation) + iPad Pro (11-inch) (2nd generation)
- - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) - - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) - - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) - - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) - - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) - - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) - - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) - - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) - - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) - - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation)
- iPad Pro (12.9-inch) (2nd generation) + iPad Pro (12.9-inch) (2nd generation)
- - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) - - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) - - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) - - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) - - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) - - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) - - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) - - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) - - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) - - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation)
- iPad Pro (12.9-inch) (3rd generation) + iPad Pro (12.9-inch) (3rd generation)
- - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) - - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) - - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) - - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) - - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) - - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) - - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) - - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) - - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) - - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation)
- iPad Pro (9.7-inch) + iPad Pro (9.7-inch)
- - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) - - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) - - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) - - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) - - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) - - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) - - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) - - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) - - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) - - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch)
- iPhone 11 Pro Max + iPhone 11 Pro Max
- - fr iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max - - fr iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max - - fr iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max - - fr iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max - - fr iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max - - fr iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max - - fr iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max - - fr iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max - - fr iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max - - fr iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max
- iPhone 11 Pro + iPhone 11 Pro
- - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro - - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro - - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro - - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro - - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro - - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro - - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro - - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro - - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro - - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro
- iPhone 8 Plus + iPhone 8 Plus
- - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus - - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus - - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus - - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus - - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus - - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus - - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus - - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus - - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus - - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus
- iPhone 8 + iPhone 8
- - fr iPhone 8 + + fr-FR iPhone 8 - - fr iPhone 8 + + fr-FR iPhone 8 - - fr iPhone 8 + + fr-FR iPhone 8 - - fr iPhone 8 + + fr-FR iPhone 8 - - fr iPhone 8 + + fr-FR iPhone 8 - - fr iPhone 8 + + fr-FR iPhone 8 - - fr iPhone 8 + + fr-FR iPhone 8 - - fr iPhone 8 + + fr-FR iPhone 8 - - fr iPhone 8 + + fr-FR iPhone 8 - - fr iPhone 8 + + fr-FR iPhone 8
- iPhone SE + iPhone SE
- - fr iPhone SE + + fr-FR iPhone SE - - fr iPhone SE + + fr-FR iPhone SE - - fr iPhone SE + + fr-FR iPhone SE - - fr iPhone SE + + fr-FR iPhone SE - - fr iPhone SE + + fr-FR iPhone SE - - fr iPhone SE + + fr-FR iPhone SE - - fr iPhone SE + + fr-FR iPhone SE - - fr iPhone SE + + fr-FR iPhone SE - - fr iPhone SE + + fr-FR iPhone SE - - fr iPhone SE + + fr-FR iPhone SE + +
+

fr_FR

+
+ + + + + + + + + + + + + + + @@ -2977,52 +3038,52 @@

id

@@ -3034,52 +3095,52 @@

id

@@ -3091,52 +3152,52 @@

id

@@ -3148,52 +3209,52 @@

id

@@ -3205,52 +3266,52 @@

id

@@ -3262,52 +3323,52 @@

id

@@ -3319,52 +3380,52 @@

id

@@ -3376,52 +3437,52 @@

id

@@ -3433,52 +3494,52 @@

id

@@ -3490,52 +3551,52 @@

id

@@ -3551,52 +3612,52 @@

it

@@ -3608,52 +3669,52 @@

it

@@ -3665,52 +3726,52 @@

it

@@ -3722,52 +3783,52 @@

it

@@ -3779,52 +3840,52 @@

it

@@ -3836,52 +3897,52 @@

it

@@ -3893,52 +3954,52 @@

it

@@ -3950,52 +4011,52 @@

it

@@ -4007,52 +4068,52 @@

it

@@ -4064,52 +4125,52 @@

it

@@ -4125,52 +4186,52 @@

ja

@@ -4182,52 +4243,52 @@

ja

@@ -4239,52 +4300,52 @@

ja

@@ -4296,52 +4357,52 @@

ja

@@ -4353,52 +4414,52 @@

ja

@@ -4410,52 +4471,52 @@

ja

@@ -4467,52 +4528,52 @@

ja

@@ -4524,52 +4585,52 @@

ja

@@ -4581,52 +4642,52 @@

ja

@@ -4638,626 +4699,626 @@

ja

+ iPhone 11 Pro Max +
+ + fr_FR iPhone 11 Pro Max + + + + fr_FR iPhone 11 Pro Max + + + + fr_FR iPhone 11 Pro Max + + + + fr_FR iPhone 11 Pro Max + + + + fr_FR iPhone 11 Pro Max + + + + fr_FR iPhone 11 Pro Max + + + + fr_FR iPhone 11 Pro Max + + + + fr_FR iPhone 11 Pro Max + + + + fr_FR iPhone 11 Pro Max + + + + fr_FR iPhone 11 Pro Max
- id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch) - id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch) - id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch) - id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch) - id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch) - id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch) - id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch) - id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch) - id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch) - id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch)
- id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation) - id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation) - id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation) - id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation) - id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation) - id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation) - id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation) - id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation) - id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation) - id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation)
- id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation) - id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation) - id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation) - id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation) - id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation) - id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation) - id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation) - id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation) - id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation) - id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation)
- id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation) - id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation) - id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation) - id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation) - id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation) - id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation) - id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation) - id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation) - id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation) - id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation)
- id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch) - id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch) - id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch) - id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch) - id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch) - id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch) - id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch) - id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch) - id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch) - id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch)
- id iPhone 11 Pro Max + id iPhone 11 Pro Max - id iPhone 11 Pro Max + id iPhone 11 Pro Max - id iPhone 11 Pro Max + id iPhone 11 Pro Max - id iPhone 11 Pro Max + id iPhone 11 Pro Max - id iPhone 11 Pro Max + id iPhone 11 Pro Max - id iPhone 11 Pro Max + id iPhone 11 Pro Max - id iPhone 11 Pro Max + id iPhone 11 Pro Max - id iPhone 11 Pro Max + id iPhone 11 Pro Max - id iPhone 11 Pro Max + id iPhone 11 Pro Max - id iPhone 11 Pro Max + id iPhone 11 Pro Max
- id iPhone 11 Pro + id iPhone 11 Pro - id iPhone 11 Pro + id iPhone 11 Pro - id iPhone 11 Pro + id iPhone 11 Pro - id iPhone 11 Pro + id iPhone 11 Pro - id iPhone 11 Pro + id iPhone 11 Pro - id iPhone 11 Pro + id iPhone 11 Pro - id iPhone 11 Pro + id iPhone 11 Pro - id iPhone 11 Pro + id iPhone 11 Pro - id iPhone 11 Pro + id iPhone 11 Pro - id iPhone 11 Pro + id iPhone 11 Pro
- id iPhone 8 Plus + id iPhone 8 Plus - id iPhone 8 Plus + id iPhone 8 Plus - id iPhone 8 Plus + id iPhone 8 Plus - id iPhone 8 Plus + id iPhone 8 Plus - id iPhone 8 Plus + id iPhone 8 Plus - id iPhone 8 Plus + id iPhone 8 Plus - id iPhone 8 Plus + id iPhone 8 Plus - id iPhone 8 Plus + id iPhone 8 Plus - id iPhone 8 Plus + id iPhone 8 Plus - id iPhone 8 Plus + id iPhone 8 Plus
- id iPhone 8 + id iPhone 8 - id iPhone 8 + id iPhone 8 - id iPhone 8 + id iPhone 8 - id iPhone 8 + id iPhone 8 - id iPhone 8 + id iPhone 8 - id iPhone 8 + id iPhone 8 - id iPhone 8 + id iPhone 8 - id iPhone 8 + id iPhone 8 - id iPhone 8 + id iPhone 8 - id iPhone 8 + id iPhone 8
- id iPhone SE + id iPhone SE - id iPhone SE + id iPhone SE - id iPhone SE + id iPhone SE - id iPhone SE + id iPhone SE - id iPhone SE + id iPhone SE - id iPhone SE + id iPhone SE - id iPhone SE + id iPhone SE - id iPhone SE + id iPhone SE - id iPhone SE + id iPhone SE - id iPhone SE + id iPhone SE
- it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch) - it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch) - it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch) - it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch) - it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch) - it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch) - it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch) - it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch) - it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch) - it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch)
- it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation) - it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation) - it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation) - it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation) - it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation) - it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation) - it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation) - it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation) - it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation) - it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation)
- it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation) - it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation) - it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation) - it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation) - it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation) - it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation) - it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation) - it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation) - it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation) - it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation)
- it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation) - it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation) - it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation) - it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation) - it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation) - it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation) - it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation) - it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation) - it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation) - it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation)
- it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch) - it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch) - it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch) - it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch) - it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch) - it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch) - it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch) - it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch) - it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch) - it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch)
- it iPhone 11 Pro Max + it iPhone 11 Pro Max - it iPhone 11 Pro Max + it iPhone 11 Pro Max - it iPhone 11 Pro Max + it iPhone 11 Pro Max - it iPhone 11 Pro Max + it iPhone 11 Pro Max - it iPhone 11 Pro Max + it iPhone 11 Pro Max - it iPhone 11 Pro Max + it iPhone 11 Pro Max - it iPhone 11 Pro Max + it iPhone 11 Pro Max - it iPhone 11 Pro Max + it iPhone 11 Pro Max - it iPhone 11 Pro Max + it iPhone 11 Pro Max - it iPhone 11 Pro Max + it iPhone 11 Pro Max
- it iPhone 11 Pro + it iPhone 11 Pro - it iPhone 11 Pro + it iPhone 11 Pro - it iPhone 11 Pro + it iPhone 11 Pro - it iPhone 11 Pro + it iPhone 11 Pro - it iPhone 11 Pro + it iPhone 11 Pro - it iPhone 11 Pro + it iPhone 11 Pro - it iPhone 11 Pro + it iPhone 11 Pro - it iPhone 11 Pro + it iPhone 11 Pro - it iPhone 11 Pro + it iPhone 11 Pro - it iPhone 11 Pro + it iPhone 11 Pro
- it iPhone 8 Plus + it iPhone 8 Plus - it iPhone 8 Plus + it iPhone 8 Plus - it iPhone 8 Plus + it iPhone 8 Plus - it iPhone 8 Plus + it iPhone 8 Plus - it iPhone 8 Plus + it iPhone 8 Plus - it iPhone 8 Plus + it iPhone 8 Plus - it iPhone 8 Plus + it iPhone 8 Plus - it iPhone 8 Plus + it iPhone 8 Plus - it iPhone 8 Plus + it iPhone 8 Plus - it iPhone 8 Plus + it iPhone 8 Plus
- it iPhone 8 + it iPhone 8 - it iPhone 8 + it iPhone 8 - it iPhone 8 + it iPhone 8 - it iPhone 8 + it iPhone 8 - it iPhone 8 + it iPhone 8 - it iPhone 8 + it iPhone 8 - it iPhone 8 + it iPhone 8 - it iPhone 8 + it iPhone 8 - it iPhone 8 + it iPhone 8 - it iPhone 8 + it iPhone 8
- it iPhone SE + it iPhone SE - it iPhone SE + it iPhone SE - it iPhone SE + it iPhone SE - it iPhone SE + it iPhone SE - it iPhone SE + it iPhone SE - it iPhone SE + it iPhone SE - it iPhone SE + it iPhone SE - it iPhone SE + it iPhone SE - it iPhone SE + it iPhone SE - it iPhone SE + it iPhone SE
- ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch) - ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch) - ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch) - ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch) - ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch) - ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch) - ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch) - ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch) - ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch) - ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch)
- ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation) - ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation) - ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation) - ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation) - ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation) - ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation) - ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation) - ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation) - ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation) - ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation)
- ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation) - ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation) - ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation) - ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation) - ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation) - ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation) - ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation) - ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation) - ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation) - ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation)
- ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation) - ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation) - ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation) - ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation) - ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation) - ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation) - ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation) - ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation) - ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation) - ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation)
- ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch) - ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch) - ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch) - ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch) - ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch) - ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch) - ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch) - ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch) - ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch) - ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch)
- ja iPhone 11 Pro Max + ja iPhone 11 Pro Max - ja iPhone 11 Pro Max + ja iPhone 11 Pro Max - ja iPhone 11 Pro Max + ja iPhone 11 Pro Max - ja iPhone 11 Pro Max + ja iPhone 11 Pro Max - ja iPhone 11 Pro Max + ja iPhone 11 Pro Max - ja iPhone 11 Pro Max + ja iPhone 11 Pro Max - ja iPhone 11 Pro Max + ja iPhone 11 Pro Max - ja iPhone 11 Pro Max + ja iPhone 11 Pro Max - ja iPhone 11 Pro Max + ja iPhone 11 Pro Max - ja iPhone 11 Pro Max + ja iPhone 11 Pro Max
- ja iPhone 11 Pro + ja iPhone 11 Pro - ja iPhone 11 Pro + ja iPhone 11 Pro - ja iPhone 11 Pro + ja iPhone 11 Pro - ja iPhone 11 Pro + ja iPhone 11 Pro - ja iPhone 11 Pro + ja iPhone 11 Pro - ja iPhone 11 Pro + ja iPhone 11 Pro - ja iPhone 11 Pro + ja iPhone 11 Pro - ja iPhone 11 Pro + ja iPhone 11 Pro - ja iPhone 11 Pro + ja iPhone 11 Pro - ja iPhone 11 Pro + ja iPhone 11 Pro
- ja iPhone 8 Plus + ja iPhone 8 Plus - ja iPhone 8 Plus + ja iPhone 8 Plus - ja iPhone 8 Plus + ja iPhone 8 Plus - ja iPhone 8 Plus + ja iPhone 8 Plus - ja iPhone 8 Plus + ja iPhone 8 Plus - ja iPhone 8 Plus + ja iPhone 8 Plus - ja iPhone 8 Plus + ja iPhone 8 Plus - ja iPhone 8 Plus + ja iPhone 8 Plus - ja iPhone 8 Plus + ja iPhone 8 Plus - ja iPhone 8 Plus + ja iPhone 8 Plus
- ja iPhone 8 + ja iPhone 8 - ja iPhone 8 + ja iPhone 8 - ja iPhone 8 + ja iPhone 8 - ja iPhone 8 + ja iPhone 8 - ja iPhone 8 + ja iPhone 8 - ja iPhone 8 + ja iPhone 8 - ja iPhone 8 + ja iPhone 8 - ja iPhone 8 + ja iPhone 8 - ja iPhone 8 + ja iPhone 8 - ja iPhone 8 + ja iPhone 8
- ja iPhone SE + ja iPhone SE - ja iPhone SE + ja iPhone SE - ja iPhone SE + ja iPhone SE - ja iPhone SE + ja iPhone SE - ja iPhone SE + ja iPhone SE - ja iPhone SE + ja iPhone SE - ja iPhone SE + ja iPhone SE - ja iPhone SE + ja iPhone SE - ja iPhone SE + ja iPhone SE - ja iPhone SE + ja iPhone SE
-

nl

+

nl-NL


@@ -5273,52 +5334,52 @@

ru

@@ -5330,52 +5391,52 @@

ru

@@ -5387,52 +5448,52 @@

ru

@@ -5444,52 +5505,52 @@

ru

@@ -5501,52 +5562,52 @@

ru

@@ -5558,52 +5619,52 @@

ru

@@ -5615,52 +5676,52 @@

ru

@@ -5672,52 +5733,52 @@

ru

@@ -5729,52 +5790,52 @@

ru

@@ -5786,52 +5847,52 @@

ru

@@ -5847,52 +5908,52 @@

sv

@@ -5904,52 +5965,52 @@

sv

@@ -5961,52 +6022,52 @@

sv

@@ -6018,52 +6079,52 @@

sv

@@ -6075,52 +6136,52 @@

sv

@@ -6132,52 +6193,52 @@

sv

@@ -6189,52 +6250,52 @@

sv

@@ -6246,52 +6307,52 @@

sv

@@ -6303,52 +6364,52 @@

sv

@@ -6360,52 +6421,52 @@

sv

@@ -6421,52 +6482,52 @@

zh-Hans

@@ -6478,52 +6539,52 @@

zh-Hans

@@ -6535,52 +6596,52 @@

zh-Hans

@@ -6592,52 +6653,52 @@

zh-Hans

@@ -6649,52 +6710,52 @@

zh-Hans

@@ -6706,52 +6767,52 @@

zh-Hans

@@ -6763,52 +6824,52 @@

zh-Hans

@@ -6820,52 +6881,52 @@

zh-Hans

@@ -6877,52 +6938,52 @@

zh-Hans

@@ -6934,52 +6995,52 @@

zh-Hans

@@ -7002,28 +7063,28 @@

Image01

da
- @@ -7397,68 +7458,74 @@

Image01

da
+ @@ -7471,73 +7538,73 @@

Image01

@@ -7550,73 +7617,73 @@

Image01

@@ -7629,73 +7696,73 @@

Image01

@@ -7712,73 +7779,73 @@

Image02

@@ -7791,73 +7858,73 @@

Image02

@@ -7870,73 +7937,73 @@

Image02

@@ -7949,73 +8016,73 @@

Image02

@@ -8028,152 +8095,158 @@

Image02

- + @@ -8186,73 +8259,73 @@

Image02

@@ -8265,73 +8338,73 @@

Image02

@@ -8344,73 +8417,73 @@

Image02

@@ -8427,73 +8500,73 @@

Image03

@@ -8506,73 +8579,73 @@

Image03

@@ -8585,73 +8658,73 @@

Image03

@@ -8664,73 +8737,73 @@

Image03

@@ -8743,152 +8816,158 @@

Image03

- + @@ -8901,73 +8980,73 @@

Image03

@@ -8980,73 +9059,73 @@

Image03

@@ -9059,73 +9138,73 @@

Image03

@@ -9142,73 +9221,73 @@

Image04

@@ -9221,73 +9300,73 @@

Image04

@@ -9300,73 +9379,73 @@

Image04

@@ -9379,73 +9458,73 @@

Image04

@@ -9458,152 +9537,158 @@

Image04

- + @@ -9616,73 +9701,73 @@

Image04

@@ -9695,73 +9780,73 @@

Image04

@@ -9774,73 +9859,73 @@

Image04

@@ -9857,73 +9942,73 @@

Image05

@@ -9936,73 +10021,73 @@

Image05

@@ -10015,73 +10100,73 @@

Image05

@@ -10094,73 +10179,73 @@

Image05

@@ -10173,152 +10258,158 @@

Image05

- + @@ -10331,73 +10422,73 @@

Image05

@@ -10410,73 +10501,73 @@

Image05

@@ -10489,73 +10580,73 @@

Image05

@@ -10572,73 +10663,73 @@

Image06

@@ -10651,73 +10742,73 @@

Image06

@@ -10730,73 +10821,73 @@

Image06

@@ -10809,73 +10900,73 @@

Image06

@@ -10888,152 +10979,158 @@

Image06

- + @@ -11046,73 +11143,73 @@

Image06

@@ -11125,73 +11222,73 @@

Image06

@@ -11204,73 +11301,73 @@

Image06

@@ -11287,73 +11384,73 @@

Image07

@@ -11366,73 +11463,73 @@

Image07

@@ -11445,73 +11542,73 @@

Image07

@@ -11524,73 +11621,73 @@

Image07

@@ -11603,152 +11700,158 @@

Image07

- + @@ -11761,73 +11864,73 @@

Image07

@@ -11840,73 +11943,73 @@

Image07

@@ -11919,73 +12022,73 @@

Image07

@@ -12002,73 +12105,73 @@

Image08

@@ -12081,73 +12184,73 @@

Image08

@@ -12160,73 +12263,73 @@

Image08

@@ -12239,73 +12342,73 @@

Image08

@@ -12318,152 +12421,158 @@

Image08

- + @@ -12476,73 +12585,73 @@

Image08

@@ -12555,73 +12664,73 @@

Image08

@@ -12634,73 +12743,73 @@

Image08

@@ -12717,73 +12826,73 @@

Image09

@@ -12796,73 +12905,73 @@

Image09

@@ -12875,73 +12984,73 @@

Image09

@@ -12954,73 +13063,73 @@

Image09

@@ -13033,152 +13142,158 @@

Image09

- + @@ -13191,73 +13306,73 @@

Image09

@@ -13270,73 +13385,73 @@

Image09

@@ -13349,73 +13464,73 @@

Image09

@@ -13432,73 +13547,73 @@

Image10

@@ -13511,73 +13626,73 @@

Image10

@@ -13590,73 +13705,73 @@

Image10

@@ -13669,73 +13784,73 @@

Image10

@@ -13748,152 +13863,158 @@

Image10

- + @@ -13906,73 +14027,73 @@

Image10

@@ -13985,73 +14106,73 @@

Image10

@@ -14064,73 +14185,73 @@

Image10

@@ -14147,73 +14268,73 @@

iPhone SE (1st genera

@@ -14230,73 +14351,73 @@

iPhone SE (1st genera

@@ -14313,73 +14434,73 @@

iPhone SE (1st genera

@@ -14396,73 +14517,73 @@

iPhone SE (1st genera

@@ -14479,73 +14600,73 @@

iPhone SE (1st genera

@@ -14562,73 +14683,73 @@

iPhone SE (1st genera

@@ -14645,73 +14766,73 @@

iPhone SE (1st genera

@@ -14728,73 +14849,73 @@

iPhone SE (1st genera

@@ -14811,73 +14932,73 @@

iPhone SE (1st genera

@@ -14894,73 +15015,73 @@

iPhone SE (1st genera

diff --git a/piwigo/Albums/AlbumImagesViewController.m b/piwigo/Albums/AlbumImagesViewController.m index 7fee0ffd6..e73ed1864 100644 --- a/piwigo/Albums/AlbumImagesViewController.m +++ b/piwigo/Albums/AlbumImagesViewController.m @@ -170,8 +170,6 @@ -(instancetype)initWithAlbumId:(NSInteger)albumId inCache:(BOOL)isCached self.addButton.layer.masksToBounds = NO; [self.addButton.layer setOpacity:0.0]; [self.addButton.layer setShadowOpacity:0.8]; - [self.addButton.layer setShadowRadius:3.0]; - [self.addButton.layer setShadowOffset:CGSizeMake(0.0, 0.5)]; self.addButton.backgroundColor = [UIColor piwigoColorOrange]; self.addButton.tintColor = [UIColor whiteColor]; self.addButton.showsTouchWhenHighlighted = YES; @@ -192,8 +190,6 @@ -(instancetype)initWithAlbumId:(NSInteger)albumId inCache:(BOOL)isCached self.uploadQueueButton.layer.cornerRadius = kRadius; self.uploadQueueButton.layer.masksToBounds = NO; [self.uploadQueueButton.layer setShadowOpacity:0.8]; - [self.uploadQueueButton.layer setShadowRadius:3.0]; - [self.uploadQueueButton.layer setShadowOffset:CGSizeMake(0.0, 0.5)]; self.uploadQueueButton.showsTouchWhenHighlighted = YES; [self.uploadQueueButton addTarget:self action:@selector(didTapUploadQueueButton) forControlEvents:UIControlEventTouchUpInside]; @@ -224,8 +220,6 @@ -(instancetype)initWithAlbumId:(NSInteger)albumId inCache:(BOOL)isCached self.homeAlbumButton.layer.masksToBounds = NO; [self.homeAlbumButton.layer setOpacity:0.0]; [self.homeAlbumButton.layer setShadowOpacity:0.8]; - [self.homeAlbumButton.layer setShadowRadius:3.0]; - [self.homeAlbumButton.layer setShadowOffset:CGSizeMake(0.0, 0.5)]; self.homeAlbumButton.showsTouchWhenHighlighted = YES; [self.homeAlbumButton setImage:[UIImage imageNamed:@"rootAlbum"] forState:UIControlStateNormal]; [self.homeAlbumButton addTarget:self action:@selector(returnToDefaultCategory) @@ -240,8 +234,6 @@ -(instancetype)initWithAlbumId:(NSInteger)albumId inCache:(BOOL)isCached self.createAlbumButton.layer.masksToBounds = NO; [self.createAlbumButton.layer setOpacity:0.0]; [self.createAlbumButton.layer setShadowOpacity:0.8]; - [self.createAlbumButton.layer setShadowRadius:3.0]; - [self.createAlbumButton.layer setShadowOffset:CGSizeMake(0.0, 0.5)]; self.createAlbumButton.backgroundColor = [UIColor piwigoColorOrange]; self.createAlbumButton.tintColor = [UIColor whiteColor]; self.createAlbumButton.showsTouchWhenHighlighted = YES; @@ -259,8 +251,6 @@ -(instancetype)initWithAlbumId:(NSInteger)albumId inCache:(BOOL)isCached self.uploadImagesButton.layer.masksToBounds = NO; [self.uploadImagesButton.layer setOpacity:0.0]; [self.uploadImagesButton.layer setShadowOpacity:0.8]; - [self.uploadImagesButton.layer setShadowRadius:3.0]; - [self.uploadImagesButton.layer setShadowOffset:CGSizeMake(0.0, 0.5)]; self.uploadImagesButton.backgroundColor = [UIColor piwigoColorOrange]; self.uploadImagesButton.tintColor = [UIColor whiteColor]; self.uploadImagesButton.showsTouchWhenHighlighted = YES; @@ -328,18 +318,50 @@ -(void)applyColorPalette self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:NSLocalizedString(@"pullToRefresh", @"Reload Images") attributes:attributesRefresh]; // Buttons - [self.addButton.layer setShadowColor:[UIColor piwigoColorLeftLabel].CGColor]; - [self.createAlbumButton.layer setShadowColor:[UIColor piwigoColorLeftLabel].CGColor]; - [self.uploadImagesButton.layer setShadowColor:[UIColor piwigoColorLeftLabel].CGColor]; - [self.homeAlbumButton.layer setShadowColor:[UIColor piwigoColorLeftLabel].CGColor]; - [self.uploadQueueButton.layer setShadowColor:[UIColor piwigoColorLeftLabel].CGColor]; + [self.addButton.layer setShadowColor:[UIColor piwigoColorShadow].CGColor]; + [self.createAlbumButton.layer setShadowColor:[UIColor piwigoColorShadow].CGColor]; + [self.uploadImagesButton.layer setShadowColor:[UIColor piwigoColorShadow].CGColor]; + + [self.uploadQueueButton.layer setShadowColor:[UIColor piwigoColorShadow].CGColor]; self.uploadQueueButton.backgroundColor = [UIColor piwigoColorRightLabel]; self.nberOfUploadsLabel.textColor = [UIColor piwigoColorBackground]; self.progressLayer.strokeColor = [[UIColor piwigoColorBackground] CGColor]; + + [self.homeAlbumButton.layer setShadowColor:[UIColor piwigoColorLeftLabel].CGColor]; self.homeAlbumButton.backgroundColor = [UIColor piwigoColorRightLabel]; self.homeAlbumButton.tintColor = [UIColor piwigoColorBackground]; + if ([Model sharedInstance].isDarkPaletteActive) { + [self.addButton.layer setShadowRadius:1.0]; + [self.addButton.layer setShadowOffset:CGSizeMake(0.0, 0.0)]; + + [self.createAlbumButton.layer setShadowRadius:1.0]; + [self.createAlbumButton.layer setShadowOffset:CGSizeMake(0.0, 0.0)]; + [self.uploadImagesButton.layer setShadowRadius:1.0]; + [self.uploadImagesButton.layer setShadowOffset:CGSizeMake(0.0, 0.0)]; + + [self.uploadQueueButton.layer setShadowRadius:1.0]; + [self.uploadQueueButton.layer setShadowOffset:CGSizeMake(0.0, 0.0)]; + + [self.homeAlbumButton.layer setShadowRadius:1.0]; + [self.homeAlbumButton.layer setShadowOffset:CGSizeMake(0.0, 0.0)]; + } else { + [self.addButton.layer setShadowRadius:3.0]; + [self.addButton.layer setShadowOffset:CGSizeMake(0.0, 0.5)]; + + [self.createAlbumButton.layer setShadowRadius:3.0]; + [self.createAlbumButton.layer setShadowOffset:CGSizeMake(0.0, 0.5)]; + [self.uploadImagesButton.layer setShadowRadius:3.0]; + [self.uploadImagesButton.layer setShadowOffset:CGSizeMake(0.0, 0.5)]; + + [self.uploadQueueButton.layer setShadowRadius:3.0]; + [self.uploadQueueButton.layer setShadowOffset:CGSizeMake(0.0, 0.5)]; + + [self.homeAlbumButton.layer setShadowRadius:3.0]; + [self.homeAlbumButton.layer setShadowOffset:CGSizeMake(0.0, 0.5)]; + } + // Navigation bar appearence NSDictionary *attributes = @{ NSForegroundColorAttributeName: [UIColor piwigoColorWhiteCream], @@ -880,8 +902,12 @@ -(void)didCancelTapAddButton -(void)showHomeAlbumButtonIfNeeded { // Present Home Album button if needed - if ((self.homeAlbumButton.isHidden) || - CGRectContainsPoint(self.homeAlbumButton.frame, self.addButton.frame.origin)) + if ((self.homeAlbumButton.isHidden || + CGRectContainsPoint(self.homeAlbumButton.frame, self.addButton.frame.origin)) && + (self.uploadImagesButton.isHidden || + CGRectContainsPoint(self.uploadImagesButton.frame, self.addButton.frame.origin)) && + (self.createAlbumButton.isHidden || + CGRectContainsPoint(self.createAlbumButton.frame, self.addButton.frame.origin))) { // Unhide transparent Home Album button [self.homeAlbumButton setHidden:NO]; @@ -942,6 +968,7 @@ -(void)updateNberOfUploads:(NSNotification *)notification [path addLineToPoint:CGPointMake(kRadius, 2*kRadius-1.5f)]; [path addArcWithCenter:CGPointMake(kRadius, kRadius) radius:(kRadius-1.5f) startAngle:M_PI_2 endAngle:M_PI+M_PI_2 clockwise:YES]; [path addLineToPoint:CGPointMake(kRadius + extraWidth, 1.5f)]; + [path setLineCapStyle:kCGLineCapRound]; self.progressLayer.path = [path CGPath]; // Show button if needed diff --git a/piwigo/Data Cache/Locations Data/LocationsProvider.swift b/piwigo/Data Cache/Locations Data/LocationsProvider.swift index 5c5bacb5d..9414b4320 100644 --- a/piwigo/Data Cache/Locations Data/LocationsProvider.swift +++ b/piwigo/Data Cache/Locations Data/LocationsProvider.swift @@ -23,6 +23,7 @@ class LocationsProvider: NSObject { override init() { // Prepare list of operations queue.maxConcurrentOperationCount = 1 // Make it a serial queue + queue.qualityOfService = .background // fetch location names in the background // Initialise locations in queue queuedLocations = [] } diff --git a/piwigo/Data Cache/Uploads Data/Upload.swift b/piwigo/Data Cache/Uploads Data/Upload.swift index 48706f502..f62a20bbd 100644 --- a/piwigo/Data Cache/Uploads Data/Upload.swift +++ b/piwigo/Data Cache/Uploads Data/Upload.swift @@ -365,7 +365,7 @@ struct UploadProperties let localIdentifier: String // Unique PHAsset identifier let category: Int // 8 let serverPath: String // URL path of Piwigo server - let serverFileTypes: String // File formats accepted by the server + var serverFileTypes: String // File formats accepted by the server let requestDate: Date // "2020-08-22 19:18:43" var requestState: kPiwigoUploadState // See enum above var requestError: String? @@ -422,31 +422,7 @@ extension UploadProperties { defaultPrefix: Model.sharedInstance().defaultPrefix ?? "", deleteImageAfterUpload: false) } - - // Update upload request state and error - func update(with state: kPiwigoUploadState, error: String?) -> UploadProperties { - return UploadProperties.init(localIdentifier: self.localIdentifier, - // Category ID of the album to upload to - category: self.category, - // Server parameters - serverPath: self.serverPath, serverFileTypes: self.serverFileTypes, - // Upload request date is now and state is waiting - requestDate: self.requestDate, requestState: state, requestError: error, - // Photo creation date and filename - creationDate: self.creationDate, fileName: self.fileName, - mimeType: self.mimeType, md5Sum: self.md5Sum, isVideo: self.isVideo, - // Photo parameters - author: self.author, privacyLevel: self.privacyLevel, - imageTitle: self.imageTitle, comment: self.comment, - tagIds: self.tagIds, imageId: self.imageId, - // Upload settings - stripGPSdataOnUpload: self.stripGPSdataOnUpload, - resizeImageOnUpload: self.resizeImageOnUpload, photoResize: self.photoResize, - compressImageOnUpload: self.compressImageOnUpload, photoQuality: self.photoQuality, - prefixFileNameBeforeUpload: self.prefixFileNameBeforeUpload, defaultPrefix: self.defaultPrefix, - deleteImageAfterUpload: self.deleteImageAfterUpload) - } - + var stateLabel: String { return requestState.stateInfo } diff --git a/piwigo/Data Cache/Uploads Data/UploadsProvider.swift b/piwigo/Data Cache/Uploads Data/UploadsProvider.swift index 018dc9c0a..8b1cff5ea 100644 --- a/piwigo/Data Cache/Uploads Data/UploadsProvider.swift +++ b/piwigo/Data Cache/Uploads Data/UploadsProvider.swift @@ -24,7 +24,7 @@ class UploadsProvider: NSObject { name = NSNotification.Name(kPiwigoNotificationMovedImage) NotificationCenter.default.addObserver(self, selector: #selector(self.didMoveImageWithId(_:)), name: name, object: nil) - // Register category deleted + // Register category deletion name = NSNotification.Name(kPiwigoNotificationDeletedCategory) NotificationCenter.default.addObserver(self, selector: #selector(self.didDeleteCategoryWithId(_:)), name: name, object: nil) } @@ -42,9 +42,9 @@ class UploadsProvider: NSObject { }() - // MARK: - Add Uploads + // MARK: - Add/Update Upload Requests /** - Imports a batch of upload requests into the Core Data store on a private queue, + Adds or updates a batch of upload requests into the Core Data store on a private queue, processing the record in batches to avoid a high memory footprint. */ func importUploads(from uploadRequest: [UploadProperties], completionHandler: @escaping (Error?) -> Void) { @@ -81,7 +81,7 @@ class UploadsProvider: NSObject { } /** - Adds one batch of uploads, creating managed objects from the new data, + Adds or updates one batch of uploads, creating managed objects from the new data, and saving them to the persistent store, on a private queue. After saving, resets the context to clean up the cache and lower the memory footprint. @@ -190,9 +190,9 @@ class UploadsProvider: NSObject { } - // MARK: - Update Uploads + // MARK: - Update Single Upload Request /** - Updates an upload, updating managed object from the new data, + Updates an upload request, updating managed object from the new data, and saving it to the persistent store, on a private queue. After saving, resets the context to clean up the cache and lower the memory footprint. */ @@ -308,52 +308,8 @@ class UploadsProvider: NSObject { completionHandler(nil) } - func preventDeletionOfUploads(with objectIDs:[NSManagedObjectID]) -> (Void) { - // Check current queue - print("•••>> preventDeletionOfUploads (\(objectIDs.count)) in \(queueName())\r") - - // Create a private queue context. - let taskContext = DataController.getPrivateContext() - - // taskContext.performAndWait runs on the URLSession's delegate queue - // so it won’t block the main thread. - taskContext.performAndWait { - - // Loop over all object IDs - for objectID in objectIDs { - // Update cached upload - let cachedUpload = taskContext.object(with: objectID) as! Upload - cachedUpload.deleteImageAfterUpload = false - } - - // Save all modifications from the context to the store. - if taskContext.hasChanges { - do { - try taskContext.save() - - // Performs a task in the main queue and wait until this task finishes - DispatchQueue.main.async { - self.managedObjectContext.performAndWait { - do { - // Saves the data from the child to the main context to be stored properly - try self.managedObjectContext.save() - } catch { - fatalError("Failure to save context: \(error)") - } - } - } - } - catch { - fatalError("Failure to save context: \(error)") - } - // Reset the taskContext to free the cache and lower the memory footprint. - taskContext.reset() - } - } - } - /** - Update one upload request on the private queue when an image is moved. After saving, + Update a single upload request on the private queue when an image is moved. After saving, resets the context to clean up the cache and lower the memory footprint. */ @objc private func didMoveImageWithId(_ notification: Notification) { @@ -428,12 +384,12 @@ class UploadsProvider: NSObject { } - // MARK: - Delete Uploads + // MARK: - Delete Upload Requests /** Delete a batch of upload requests from the Core Data store on a private queue, processing the record in batches to avoid a high memory footprint. */ - func delete(uploadRequests: [Upload]) { + func delete(uploadRequests: [NSManagedObjectID]) { guard !uploadRequests.isEmpty else { return } @@ -470,38 +426,34 @@ class UploadsProvider: NSObject { .preparingFail, .formatError, .prepared, .uploading, .uploadingError, .uploaded, .finishing, .finishingError] - guard let allUploads = getRequestsIn(states: states) else { - return - } - // Update app badge and Upload button in root/default album - UploadManager.shared.nberOfUploadsToComplete = allUploads.count + UploadManager.shared.nberOfUploadsToComplete = getRequestsIn(states: states).count } /** - Delete one batch of uploads on a private queue. After saving, + Delete one batch of upload requests on a private queue. After saving, resets the context to clean up the cache and lower the memory footprint. NSManagedObjectContext.performAndWait doesn't rethrow so this function catches throws within the closure and uses a return value to indicate whether the import is successful. */ - private func deleteOneBatch(_ uploadsBatch: [Upload], taskContext: NSManagedObjectContext) -> Bool { + private func deleteOneBatch(_ uploadsBatch: [NSManagedObjectID], taskContext: NSManagedObjectContext) -> Bool { // Check current queue - print("•••>> deleteOneBatch()", queueName()) +// print("•••>> deleteOneBatch()", queueName()) var success = false taskContext.performAndWait { // Loop over uploads to delete - for upload in uploadsBatch { + for uploadID in uploadsBatch { // Delete corresponding temporary files if any - let filenamePrefix = upload.localIdentifier.replacingOccurrences(of: "/", with: "-") - UploadManager.shared.deleteFilesInUploadsDirectory(with: filenamePrefix) - - // Retrieve object in main context - let uploadToDelete = taskContext.object(with: upload.objectID) + let uploadToDelete = taskContext.object(with: uploadID) as! Upload + let filenamePrefix = uploadToDelete.localIdentifier.replacingOccurrences(of: "/", with: "-") + if !filenamePrefix.isEmpty { + UploadManager.shared.deleteFilesInUploadsDirectory(with: filenamePrefix) + } // Delete upload record taskContext.delete(uploadToDelete) @@ -541,79 +493,58 @@ class UploadsProvider: NSObject { resets the context to clean up the cache and lower the memory footprint. */ @objc private func didDeleteImageWithId(_ notification: Notification) { - // Check current queue - print("•••>> didDeleteImageWithId()", queueName()) + // Always perform this task in background + DispatchQueue.global(qos: .userInitiated).async { + // Check current queue +// print("•••>> didDeleteImageWithId()", queueName()) - // Collect album ID - guard let albumId = notification.userInfo?["albumId"] as? Int64 else { - return - } + // Collect album ID + guard let albumId = notification.userInfo?["albumId"] as? Int64 else { + return + } - // Collect image ID - guard let imageId = notification.userInfo?["imageId"] as? Int64 else { - return - } + // Collect image ID + guard let imageId = notification.userInfo?["imageId"] as? Int64 else { + return + } - // Create a private queue context. - let taskContext = DataController.getPrivateContext() + // Create a private queue context. + let taskContext = DataController.getPrivateContext() + + // taskContext.performAndWait + taskContext.performAndWait { - // taskContext.performAndWait - taskContext.performAndWait { - - // Retrieve existing upload (if any) - // Create a fetch request for the image ID uploaded to the albumId - let fetchRequest = NSFetchRequest(entityName: "Upload") - fetchRequest.sortDescriptors = [NSSortDescriptor(key: "imageId", ascending: true)] - var predicates = [NSPredicate]() - predicates.append(NSPredicate(format: "imageId == %ld", imageId)) - predicates.append(NSPredicate(format: "category == %ld", albumId)) - fetchRequest.predicate = NSCompoundPredicate.init(andPredicateWithSubpredicates: predicates) - - // Create a fetched results controller and set its fetch request, context, and delegate. - let controller = NSFetchedResultsController(fetchRequest: fetchRequest, - managedObjectContext: taskContext, - sectionNameKeyPath: nil, cacheName: nil) - - // Perform the fetch. - do { - try controller.performFetch() - } catch { - fatalError("Unresolved error \(error)") - } - - // Update cached upload - if let cachedUpload = controller.fetchedObjects?.first - { - // Delete upload request - taskContext.delete(cachedUpload) + // Retrieve existing upload (if any) + // Create a fetch request for the image ID uploaded to the albumId + let fetchRequest = NSFetchRequest(entityName: "Upload") + fetchRequest.sortDescriptors = [NSSortDescriptor(key: "imageId", ascending: true)] + var predicates = [NSPredicate]() + predicates.append(NSPredicate(format: "imageId == %ld", imageId)) + predicates.append(NSPredicate(format: "category == %ld", albumId)) + fetchRequest.predicate = NSCompoundPredicate.init(andPredicateWithSubpredicates: predicates) + + // Create a fetched results controller and set its fetch request, context, and delegate. + let controller = NSFetchedResultsController(fetchRequest: fetchRequest, + managedObjectContext: taskContext, + sectionNameKeyPath: nil, cacheName: nil) - // Delete corresponding temporary files if any - let filenamePrefix = cachedUpload.localIdentifier.replacingOccurrences(of: "/", with: "-") - UploadManager.shared.deleteFilesInUploadsDirectory(with: filenamePrefix) - - // Save all insertions and deletions from the context to the store. - if taskContext.hasChanges { - do { - try taskContext.save() - - // Performs a task in the main queue and wait until this tasks finishes - DispatchQueue.main.async { - self.managedObjectContext.performAndWait { - do { - // Saves the data from the child to the main context to be stored properly - try self.managedObjectContext.save() - } catch { - fatalError("Failure to save context: \(error)") - } - } - } - } - catch { - fatalError("Failure to save context: \(error)") - } - // Reset the taskContext to free the cache and lower the memory footprint. - taskContext.reset() + // Perform the fetch. + do { + // Fetch request of image with Piwigo ID + try controller.performFetch() + } catch { + fatalError("Unresolved error \(error)") } + + // Update cached upload + if let cachedUpload = controller.fetchedObjects?.first + { + // Delete upload request + self.delete(uploadRequests: [cachedUpload.objectID]) + } + + // Reset the taskContext to free the cache and lower the memory footprint. + taskContext.reset() } } } @@ -623,50 +554,47 @@ class UploadsProvider: NSObject { resets the context to clean up the cache and lower the memory footprint. */ @objc private func didDeleteCategoryWithId(_ notification: Notification) { - // Check current queue - print("•••>> didDeleteCategoryWithId()", queueName()) + // Always perform this task in background + DispatchQueue.global(qos: .userInitiated).async { + // Check current queue +// print("•••>> didDeleteCategoryWithId()", queueName()) - // Collect album ID - guard let albumId = notification.userInfo?["albumId"] as? Int64 else { - return - } + // Collect album ID + guard let albumId = notification.userInfo?["albumId"] as? Int64 else { + return + } - // Create a private queue context. - let taskContext = DataController.getPrivateContext() + // Create a private queue context. + let taskContext = DataController.getPrivateContext() + + // taskContext.performAndWait + taskContext.performAndWait { - // taskContext.performAndWait - taskContext.performAndWait { - - // Retrieve existing upload (if any) - // Create a fetch request for the image ID uploaded to the albumId - let fetchRequest = NSFetchRequest(entityName: "Upload") - fetchRequest.sortDescriptors = [NSSortDescriptor(key: "imageId", ascending: true)] - fetchRequest.predicate = NSPredicate(format: "category == %ld", albumId) - - // Create a fetched results controller and set its fetch request, context, and delegate. - let controller = NSFetchedResultsController(fetchRequest: fetchRequest, - managedObjectContext: taskContext, - sectionNameKeyPath: nil, cacheName: nil) - - // Perform the fetch. - do { - try controller.performFetch() - } catch { - fatalError("Unresolved error \(error)") - } - - // Update cached upload - if let cachedUploads = controller.fetchedObjects - { - // Delete upload requests - delete(uploadRequests: cachedUploads) + // Retrieve existing upload (if any) + // Create a fetch request for the image ID uploaded to the albumId + let fetchRequest = NSFetchRequest(entityName: "Upload") + fetchRequest.sortDescriptors = [NSSortDescriptor(key: "imageId", ascending: true)] + fetchRequest.predicate = NSPredicate(format: "category == %ld", albumId) + + // Create a fetched results controller and set its fetch request, context, and delegate. + let controller = NSFetchedResultsController(fetchRequest: fetchRequest, + managedObjectContext: taskContext, + sectionNameKeyPath: nil, cacheName: nil) - // Delete corresponding temporary files if any - for cachedUpload in cachedUploads { - let filenamePrefix = cachedUpload.localIdentifier.replacingOccurrences(of: "/", with: "-") - UploadManager.shared.deleteFilesInUploadsDirectory(with: filenamePrefix) + // Perform the fetch. + do { + try controller.performFetch() + } catch { + fatalError("Unresolved error \(error)") } - + + // Update cached upload + if let cachedUploads = controller.fetchedObjects + { + // Delete upload requests + self.delete(uploadRequests: cachedUploads.map({$0.objectID})) + } + // Reset the taskContext to free the cache and lower the memory footprint. taskContext.reset() } @@ -678,18 +606,18 @@ class UploadsProvider: NSObject { /** Fetches upload requests synchronously in the background */ - func getRequestsIn(states: [kPiwigoUploadState]) -> [Upload]? { + func getRequestsIn(states: [kPiwigoUploadState]) -> [NSManagedObjectID] { // Check that states is not empty if states.count == 0 { assertionFailure("!!! getRequestsIn() called with no args !!!") - return nil + return [NSManagedObjectID]() } // Check current queue - print("•••>> getRequestsIn(states:)", queueName()) +// print("•••>> getRequestsIn(states:)", queueName()) // Initialisation - var uploads: [Upload]? = nil + var uploadIDs = [NSManagedObjectID]() // Create a private queue context. let taskContext = DataController.getPrivateContext() @@ -722,11 +650,93 @@ class UploadsProvider: NSObject { } catch { fatalError("Unresolved error \(error)") } - uploads = controller.fetchedObjects + uploadIDs = ((controller.fetchedObjects ?? [Upload]()) as [Upload]).map({$0.objectID}) + + // Reset the taskContext to free the cache and lower the memory footprint. + taskContext.reset() } - return uploads + return uploadIDs } - + + func getCompletedRequestsToBeDeleted() -> ([String], [NSManagedObjectID]) { + // Check current queue + print("•••>> getCompletedRequestsToBeDeleted()", queueName()) + + // Initialisation + var localIdentifiers = [String]() + var uploadIDs = [NSManagedObjectID]() + + // Create a private queue context. + let taskContext = DataController.getPrivateContext() + + // Perform the fetch + taskContext.performAndWait { + + // Retrieve existing completed uploads + // Create a fetch request for the Upload entity sorted by localIdentifier + let fetchRequest = NSFetchRequest(entityName: "Upload") + fetchRequest.sortDescriptors = [NSSortDescriptor(key: "requestDate", ascending: true)] + + // Predicate + var predicates = [NSPredicate]() + predicates.append(NSPredicate(format: "requestState == %d", kPiwigoUploadState.finished.rawValue)) + predicates.append(NSPredicate(format: "requestState == %d", kPiwigoUploadState.moderated.rawValue)) + let statesPredicate = NSCompoundPredicate.init(orPredicateWithSubpredicates: predicates) + let deletePredicate = NSPredicate(format: "deleteImageAfterUpload == YES") + let serverPredicate = NSPredicate(format: "serverPath == %@", Model.sharedInstance().serverPath) + fetchRequest.predicate = NSCompoundPredicate.init(andPredicateWithSubpredicates: [statesPredicate, deletePredicate, serverPredicate]) + + // Create a fetched results controller and set its fetch request, context, and delegate. + let controller = NSFetchedResultsController(fetchRequest: fetchRequest, + managedObjectContext: taskContext, + sectionNameKeyPath: nil, cacheName: nil) + + // Perform the fetch. + do { + try controller.performFetch() + } catch { + fatalError("Unresolved error \(error)") + } + + // Reset flag of upload requests to prevent another demand for deleting images + if let uploads = controller.fetchedObjects { + for upload in uploads { + // Reset flag + upload.deleteImageAfterUpload = false + // Collect data to return + localIdentifiers.append(upload.localIdentifier) + uploadIDs.append(upload.objectID) + } + } + + // Save all modifications from the context to the store. + if taskContext.hasChanges { + do { + try taskContext.save() + + // Performs a task in the main queue and wait until this task finishes + DispatchQueue.main.async { + self.managedObjectContext.performAndWait { + do { + // Saves the data from the child to the main context to be stored properly + try self.managedObjectContext.save() + } catch { + fatalError("Failure to save context: \(error)") + } + } + } + } + catch { + fatalError("Failure to save context: \(error)") + } + } + + // Reset the taskContext to free the cache and lower the memory footprint. + taskContext.reset() + } + return (localIdentifiers, uploadIDs) + } + // MARK: - Clear Uploads /** @@ -747,23 +757,26 @@ class UploadsProvider: NSObject { Remove from cache completed requests whose images do not exist in Photo Library. */ func clearCompletedUploads() { - // Check current queue -// print("•••>> clearCompletedUploads()", queueName()) // Get completed upload requests - let completedUploads = getRequestsIn(states: [.finished, .moderated]) ?? [] + let completedUploads = getRequestsIn(states: [.finished, .moderated]) // Create a private queue context. let taskContext = DataController.getPrivateContext() // Which one should be deleted? var uploadsToDelete = [NSManagedObjectID]() - for upload in completedUploads { - if let _ = PHAsset.fetchAssets(withLocalIdentifiers: [upload.localIdentifier], options: nil).firstObject { - continue + taskContext.performAndWait { + for uploadID in completedUploads { + // Get record + let upload = taskContext.object(with: uploadID) as! Upload + // Check presence in Photo Library + if let _ = PHAsset.fetchAssets(withLocalIdentifiers: [upload.localIdentifier], options: nil).firstObject { + continue + } + // Asset not available… will delete it + uploadsToDelete.append(uploadID) } - // Asset not available… will delete it - uploadsToDelete.append(upload.objectID) } if uploadsToDelete.count > 0 { diff --git a/piwigo/Info.plist b/piwigo/Info.plist index da249f48b..2415f3f48 100644 --- a/piwigo/Info.plist +++ b/piwigo/Info.plist @@ -25,7 +25,7 @@ CFBundleSignature ???? CFBundleVersion - 324 + 326 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/piwigo/Resources/es.lproj/Localizable.strings b/piwigo/Resources/es.lproj/Localizable.strings index b998032e4..5c787c93e 100644 --- a/piwigo/Resources/es.lproj/Localizable.strings +++ b/piwigo/Resources/es.lproj/Localizable.strings @@ -441,9 +441,9 @@ // Images upload "imageUploadHeaderTitle_images" = "Parámetros de fotos"; -"imageUploadHeaderText_images" = "Por favor, establece los parámetros a aplicar a la selección de fotos/vídeos"; -"imageUploadHeaderTitle_upload" = "Ajustes de subida"; -"imageUploadHeaderText_upload" = "Por favor, establezca los parámetros de subida para aplicar a la selección de fotos/vídeos"; +"imageUploadHeaderText_images" = "Establezca los parámetros que aplicar a la selección de fotos/vídeos"; +"imageUploadHeaderTitle_upload" = "Ajustes de carga"; +"imageUploadHeaderText_upload" = "Establezca los parámetros de subida que aplicar a la selección de fotos/vídeos"; "imageUploadDetails_title" = "Título:"; "imageUploadDetails_author" = "Autor:"; diff --git a/piwigo/Resources/pl.lproj/Localizable.strings b/piwigo/Resources/pl.lproj/Localizable.strings index e03df066e..6bc4f0cc5 100644 --- a/piwigo/Resources/pl.lproj/Localizable.strings +++ b/piwigo/Resources/pl.lproj/Localizable.strings @@ -441,9 +441,9 @@ // Images upload "imageUploadHeaderTitle_images" = "Parametry zdjęć"; -"imageUploadHeaderText_images" = "Proszę ustawić parametry do wyboru zdjęć/filmów"; -"imageUploadHeaderTitle_upload" = "Prześlij ustawienia"; -"imageUploadHeaderText_upload" = "Proszę ustawić parametry przesyłania, aby zastosować do wyboru zdjęć/filmów"; +"imageUploadHeaderText_images" = "Proszę ustawić parametry dla wybranych zdjęć/filmów"; +"imageUploadHeaderTitle_upload" = "Ustawienia przesyłania"; +"imageUploadHeaderText_upload" = "Proszę ustawić parametry przesyłania, aby zastosować do wybranych zdjęć/filmów"; "imageUploadDetails_title" = "Tytuł:"; "imageUploadDetails_author" = "Autor:"; diff --git a/piwigo/Resources/pl.lproj/ReleaseNotes.strings b/piwigo/Resources/pl.lproj/ReleaseNotes.strings index a96f20742..945330924 100644 --- a/piwigo/Resources/pl.lproj/ReleaseNotes.strings +++ b/piwigo/Resources/pl.lproj/ReleaseNotes.strings @@ -6,7 +6,7 @@ Copyright © 2017 Piwigo.org. All rights reserved. */ -"v2.5.2_text" = "Wersja 2.5.2\n\n• Przesyłanie w tle (wymaga rozszerzenia uploadAsync lub Piwigo 11 lub nowszego)\n• Drobne poprawki błędów i ulepszenia interfejsu"; +"v2.5.2_text" = "Wersja 2.5.2\n\n• Przesyłanie w tle (wymaga rozszerzenia uploadAsync lub Piwigo 2.11 lub nowszego)\n• Poprawki drobnych błędów i ulepszenia interfejsu"; "v2.5.1_text" = "Wersja 2.5.1\n10 września 2020\n\n• Nowa opcja prezentowania zdjęć i filmów w losowej kolejności\n• Poprawki drobnych błędów i ulepszenia interfejsu"; diff --git a/piwigo/Settings/SettingsViewController.swift b/piwigo/Settings/SettingsViewController.swift index f2547b5f7..e1888b04d 100644 --- a/piwigo/Settings/SettingsViewController.swift +++ b/piwigo/Settings/SettingsViewController.swift @@ -1607,13 +1607,13 @@ class SettingsViewController: UIViewController, UITableViewDataSource, UITableVi nberOfUploads) : "Clear 1 Upload Request" let clearUploadsAction = UIAlertAction(title: titleClearUploadRequests, style: .default, handler: { action in - // Get completed uploads + // Get all upload requests guard let allUploads = self.uploadsProvider.fetchedResultsController.fetchedObjects else { return } // Delete all upload requests in a private queue DispatchQueue.global(qos: .userInitiated).async { - self.uploadsProvider.delete(uploadRequests: allUploads) + self.uploadsProvider.delete(uploadRequests: allUploads.map({$0.objectID})) } }) #endif diff --git a/piwigo/Supporting Files/Macros/UIColor+AppColors.swift b/piwigo/Supporting Files/Macros/UIColor+AppColors.swift index a9d38faae..1c77be15f 100644 --- a/piwigo/Supporting Files/Macros/UIColor+AppColors.swift +++ b/piwigo/Supporting Files/Macros/UIColor+AppColors.swift @@ -31,6 +31,16 @@ extension UIColor { } } + // Shadow Color of Buttons + @objc + class func piwigoColorShadow() -> UIColor { + if Model.sharedInstance().isDarkPaletteActive { + return UIColor.white + } else { + return UIColor.black + } + } + // MARK: - Piwigo Logo Colors @objc class func piwigoColorBrown() -> UIColor { diff --git a/piwigo/Upload/PhotosFetch.swift b/piwigo/Upload/PhotosFetch.swift index 7629adec8..b2c107ecf 100644 --- a/piwigo/Upload/PhotosFetch.swift +++ b/piwigo/Upload/PhotosFetch.swift @@ -24,6 +24,7 @@ class PhotosFetch: NSObject { return instance } + // MARK: - Photo Library Access @objc func checkPhotoLibraryAccessForViewController(_ viewController: UIViewController?, onAuthorizedAccess doWithAccess: @escaping () -> Void, @@ -112,6 +113,59 @@ class PhotosFetch: NSObject { } } + private func requestPhotoLibraryAccess(in viewController: UIViewController?) { + // Invite user to provide access to photos + let alert = UIAlertController(title: NSLocalizedString("localAlbums_photosNotAuthorized_title", comment: "No Access"), message: NSLocalizedString("localAlbums_photosNotAuthorized_msg", comment: "tell user to change settings, how"), preferredStyle: .alert) + + let cancelAction = UIAlertAction(title: NSLocalizedString("alertCancelButton", comment: "Cancel"), style: .destructive, handler: { action in + }) + + let prefsAction = UIAlertAction(title: NSLocalizedString("alertOkButton", comment: "OK"), style: .default, handler: { action in + // Redirect user to Settings app + if let url = URL(string: UIApplication.openSettingsURLString) { + UIApplication.shared.openURL(url) + } + }) + + // Add actions + alert.addAction(cancelAction) + alert.addAction(prefsAction) + + // Present list of actions + alert.view.tintColor = UIColor.piwigoColorOrange() + if #available(iOS 13.0, *) { + alert.overrideUserInterfaceStyle = Model.sharedInstance().isDarkPaletteActive ? .dark : .light + } else { + // Fallback on earlier versions + } + viewController?.present(alert, animated: true) { + // Bugfix: iOS9 - Tint not fully Applied without Reapplying + alert.view.tintColor = UIColor.piwigoColorOrange() + } + } + + func showPhotosLibraryAccessRestricted(in viewController: UIViewController?) { + let alert = UIAlertController(title: NSLocalizedString("localAlbums_photosNiltitle", comment: "Problem Reading Photos"), message: NSLocalizedString("localAlbums_photosNnil_msg", comment: "There is a problem reading your local photo library."), preferredStyle: .alert) + + let dismissAction = UIAlertAction(title: NSLocalizedString("alertDismissButton", comment: "Dismiss"), style: .cancel, handler: { action in + }) + + // Present alert + alert.addAction(dismissAction) + alert.view.tintColor = UIColor.piwigoColorOrange() + if #available(iOS 13.0, *) { + alert.overrideUserInterfaceStyle = Model.sharedInstance().isDarkPaletteActive ? .dark : .light + } else { + // Fallback on earlier versions + } + viewController?.present(alert, animated: true) { + // Bugfix: iOS9 - Tint not fully Applied without Reapplying + alert.view.tintColor = UIColor.piwigoColorOrange() + } + } + + + // MARK: - File name from PHAsset @objc func getFileNameFomImageAsset(_ imageAsset: PHAsset?) -> String { var fileName = "" @@ -163,58 +217,4 @@ class PhotosFetch: NSObject { // print("=> filename = \(fileName)") return fileName } - - private var library: PHPhotoLibrary? - private var count = 0 - - private func requestPhotoLibraryAccess(in viewController: UIViewController?) { - // Invite user to provide access to photos - let alert = UIAlertController(title: NSLocalizedString("localAlbums_photosNotAuthorized_title", comment: "No Access"), message: NSLocalizedString("localAlbums_photosNotAuthorized_msg", comment: "tell user to change settings, how"), preferredStyle: .alert) - - let cancelAction = UIAlertAction(title: NSLocalizedString("alertCancelButton", comment: "Cancel"), style: .destructive, handler: { action in - }) - - let prefsAction = UIAlertAction(title: NSLocalizedString("alertOkButton", comment: "OK"), style: .default, handler: { action in - // Redirect user to Settings app - if let url = URL(string: UIApplication.openSettingsURLString) { - UIApplication.shared.openURL(url) - } - }) - - // Add actions - alert.addAction(cancelAction) - alert.addAction(prefsAction) - - // Present list of actions - alert.view.tintColor = UIColor.piwigoColorOrange() - if #available(iOS 13.0, *) { - alert.overrideUserInterfaceStyle = Model.sharedInstance().isDarkPaletteActive ? .dark : .light - } else { - // Fallback on earlier versions - } - viewController?.present(alert, animated: true) { - // Bugfix: iOS9 - Tint not fully Applied without Reapplying - alert.view.tintColor = UIColor.piwigoColorOrange() - } - } - - func showPhotosLibraryAccessRestricted(in viewController: UIViewController?) { - let alert = UIAlertController(title: NSLocalizedString("localAlbums_photosNiltitle", comment: "Problem Reading Photos"), message: NSLocalizedString("localAlbums_photosNnil_msg", comment: "There is a problem reading your local photo library."), preferredStyle: .alert) - - let dismissAction = UIAlertAction(title: NSLocalizedString("alertDismissButton", comment: "Dismiss"), style: .cancel, handler: { action in - }) - - // Present alert - alert.addAction(dismissAction) - alert.view.tintColor = UIColor.piwigoColorOrange() - if #available(iOS 13.0, *) { - alert.overrideUserInterfaceStyle = Model.sharedInstance().isDarkPaletteActive ? .dark : .light - } else { - // Fallback on earlier versions - } - viewController?.present(alert, animated: true) { - // Bugfix: iOS9 - Tint not fully Applied without Reapplying - alert.view.tintColor = UIColor.piwigoColorOrange() - } - } } diff --git a/piwigo/Upload/Pick Local Images/LocalImagesViewController.swift b/piwigo/Upload/Pick Local Images/LocalImagesViewController.swift index 2b888dfff..869a9c2a5 100644 --- a/piwigo/Upload/Pick Local Images/LocalImagesViewController.swift +++ b/piwigo/Upload/Pick Local Images/LocalImagesViewController.swift @@ -68,7 +68,6 @@ class LocalImagesViewController: UIViewController, UICollectionViewDataSource, U private let queue = OperationQueue() // Queue used to sort and cache things private var fetchedImages: PHFetchResult! // Collection of images in selected non-empty local album - private var localIdentifiers = [String]() // Cached local identifiers of images private var sortType: SectionType = .all // [Months, Weeks, Days, All images in one section] private var indexOfImageSortedByMonth: [IndexSet] = [] // Indices of images sorted by month private var indexOfImageSortedByWeek: [IndexSet] = [] // Indices of images sorted week @@ -93,21 +92,29 @@ class LocalImagesViewController: UIViewController, UICollectionViewDataSource, U override func viewDidLoad() { super.viewDidLoad() + // Pause UploadManager while sorting images + UploadManager.shared.isPaused = true + // Check collection Id if imageCollectionId.count == 0 { PhotosFetch.sharedInstance().showPhotosLibraryAccessRestricted(in: self) } - // Fetch a specific path of the Photos Library to reduce the workload and store the fetched assets for future use - fetchImagesByCreationDate(assetCollections: PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [self.imageCollectionId], options: nil)) + // Fetch a specific path of the Photos Library to reduce the workload + // and store the fetched assets for future use + fetchImagesByCreationDate() - // Initialise arrays - selectedImages = .init(repeating: nil, count: fetchedImages.count) // At start, there is no image selected + // At start, there is no image selected + selectedImages = .init(repeating: nil, count: fetchedImages.count) selectedSections = .init(repeating: .none, count: fetchedImages.count) - if let uploads = uploadsProvider.fetchedResultsController.fetchedObjects { // We provide a non-indexed list of images in the upload queue + + // We provide a non-indexed list of images in the upload queue + // so that we can at least show images in upload queue at start + // and prevent their selection + if let uploads = uploadsProvider.fetchedResultsController.fetchedObjects { uploadsInQueue = uploads.map {($0.localIdentifier, $0.state)} - } // so that we can at least show images in upload queue at start - // and prevent their selection + } + // Sort images in background DispatchQueue.global(qos: .userInitiated).async { self.sortImagesAndIndexUploads() @@ -186,6 +193,9 @@ class LocalImagesViewController: UIViewController, UICollectionViewDataSource, U override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) + // Pause UploadManager while sorting images + UploadManager.shared.isPaused = true + // Set colors, fonts, etc. applyColorPalette() @@ -249,6 +259,14 @@ class LocalImagesViewController: UIViewController, UICollectionViewDataSource, U // Unregister upload progress let name2: NSNotification.Name = NSNotification.Name(kPiwigoNotificationUploadProgress) NotificationCenter.default.removeObserver(self, name: name2, object: nil) + + // Restart UploadManager activities + if UploadManager.shared.isPaused { + UploadManager.shared.isPaused = false + UploadManager.shared.backgroundQueue.async { + UploadManager.shared.findNextImageToUpload() + } + } } func updateNavBar() { @@ -289,17 +307,23 @@ class LocalImagesViewController: UIViewController, UICollectionViewDataSource, U // MARK: - Fetch and Sort Images - func fetchImagesByCreationDate(assetCollections: PHFetchResult) -> Void { + func fetchImagesByCreationDate() -> Void { /** Fetch non-empty collection previously selected by user. We fetch a specific path of the Photos Library to reduce the workload and store the fetched collection for future use. The fetch is performed with ascending creation date. */ + // Next line for testing // let start = CFAbsoluteTimeGetCurrent() + let fetchOptions = PHFetchOptions() fetchOptions.includeHiddenAssets = false fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] + + let assetCollections = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [self.imageCollectionId], options: nil) fetchedImages = PHAsset.fetchAssets(in: assetCollections.firstObject!, options: fetchOptions) + + // Next 2 lines for testing // let diff = (CFAbsoluteTimeGetCurrent() - start)*1000 // print("=> Fetched \(fetchedImages.count) assets in \(diff) ms") // => Fetched 70331 assets in 205.949068069458 ms with hidden assets @@ -310,6 +334,12 @@ class LocalImagesViewController: UIViewController, UICollectionViewDataSource, U // initialise the array of selected sections and enable the choices private func sortImagesAndIndexUploads() -> Void { + // Operations are organised to reduce time + // Sort 70588 images by days, weeks and months in 5.2 to 6.7 s with iPhone 11 Pro + // The above duration is multiplied by 4 when the iPhone is not powered. + // and index 70588 uploads in about the same if there is no upload reauest already stored. + // but index 70588 uploads in 69.1 s if there are already 520 stored upload requests + // Sort all images in one loop i.e. O(n) let sortOperation = BlockOperation.init(block: { if self.fetchedImages.count > 0 { @@ -332,35 +362,52 @@ class LocalImagesViewController: UIViewController, UICollectionViewDataSource, U } } - // Cache upload indices and image localIdentifiers - let cacheOperation = BlockOperation.init(block: { - // Index images in the upload queue and cache localIdentifiers - self.indexUploadsAndCacheIDs(of: self.fetchedImages) - }) + // Caching upload request indices + let cacheOperation = BlockOperation() + if fetchedImages.count > 10 * uploadsInQueue.count { + // By iterating uploads in queue + cacheOperation.addExecutionBlock { + self.cachingUploadIndicesIteratingUploadsInQueue() + } + } else { + // By iterating fetched images + cacheOperation.addExecutionBlock { + self.cachingUploadIndicesIteratingFetchedImages() + } + } cacheOperation.completionBlock = { - // Allow action button and refresh UI + // Allow action button DispatchQueue.main.async { - // Allow action button self.actionBarButton?.isEnabled = true - - // Hide HUD (displayed when Photo Library motifies changes) - self.hideHUDwithSuccess(true) { - // Enable Select buttons - self.localImagesCollection.reloadData() - } } } - + // Perform both operations in background and in parallel queue.maxConcurrentOperationCount = .max // Make it a serial queue for debugging with 1 + queue.qualityOfService = .userInteractive queue.addOperations([sortOperation, cacheOperation], waitUntilFinished: true) + + // Hide HUD (displayed when Photo Library motifies changes) + self.hideHUDwithSuccess(true) { + // Enable Select buttons + DispatchQueue.main.async { + self.localImagesCollection.reloadData() + } + // Restart UplaodManager activity if all images are already in the upload queue + if self.indexedUploadsInQueue.compactMap({$0}).count == self.fetchedImages.count, + UploadManager.shared.isPaused { + UploadManager.shared.isPaused = false + UploadManager.shared.backgroundQueue.async { + UploadManager.shared.findNextImageToUpload() + } + } + } } private func sortByMonthWeekDay(images: PHFetchResult) -> (imagesByDay: [IndexSet], imagesByWeek: [IndexSet], imagesByMonth: [IndexSet]) { // Initialisation -// let start = CFAbsoluteTimeGetCurrent() -// print("=> Start sorting images…") + let start = CFAbsoluteTimeGetCurrent() let calendar = Calendar.current let byDays: Set = [.year, .month, .day] var dayComponents = calendar.dateComponents(byDays, from: images[0].creationDate ?? Date()) @@ -378,60 +425,71 @@ class LocalImagesViewController: UIViewController, UICollectionViewDataSource, U var imagesByMonth: [IndexSet] = [] // Sort imageAssets - for index in 0.. Next image - continue - } else { - // Append section to collection by days - imagesByDay.append(IndexSet.init(integersIn: firstIndexOfSameDay.. Next image + continue + } else { + // Append section to collection by days + imagesByDay.append(IndexSet.init(integersIn: firstIndexOfSameDay.. Int { switch sortType { case .month: @@ -476,22 +534,67 @@ class LocalImagesViewController: UIViewController, UICollectionViewDataSource, U } } - private func indexUploadsAndCacheIDs(of images: PHFetchResult) -> (Void) { + private func cachingUploadIndicesIteratingFetchedImages() -> (Void) { + // Loop over all images + let start = CFAbsoluteTimeGetCurrent() + indexedUploadsInQueue = .init(repeating: nil, count: fetchedImages.count) + let step = 1_000 // Check if this operation was cancelled every 1000 iterations + let iterations = fetchedImages.count / step + for i in 0...iterations { + // Continue with this operation? + if queue.operations.first!.isCancelled { + indexedUploadsInQueue = [] + print("Stop second operation in iteration \(i) ;-)") + return + } + + for index in i*step.. (Void) { // Loop over all images let start = CFAbsoluteTimeGetCurrent() - print("=> Start indexing uploads… (\(images.count) images)") - localIdentifiers = .init(repeating: "", count: fetchedImages.count) indexedUploadsInQueue = .init(repeating: nil, count: fetchedImages.count) - for index in 0.. 0 { + let step = 1_00 // Check if this operation was cancelled every 100 iterations + let iterations = uploadsInQueue.count / step + for i in 0...iterations { + // Continue with this operation? + if queue.operations.first!.isCancelled { + indexedUploadsInQueue = [] + print("Stop second operation in iteration \(i) ;-)") + return + } + + for index in i*step.. 1 ? String(format: NSLocalizedString("imageUploadResumeSeveral", comment: "Resume %@ Failed Uploads"), NumberFormatter.localizedString(from: NSNumber.init(value: failedUploads), number: .decimal)) : NSLocalizedString("imageUploadResumeSingle", comment: "Resume Failed Upload") let resumeAction = UIAlertAction(title: titleResume, style: .default, handler: { action in // Collect list of failed uploads - if let failedUploads = self.uploadsProvider.fetchedResultsController.fetchedObjects?.filter({$0.state == .preparingError || $0.state == .uploadingError || $0.state == .finishingError }) { + if let failedUploads = self.uploadsProvider.fetchedResultsController.fetchedObjects?.filter({$0.state == .preparingError || $0.state == .uploadingError || $0.state == .finishingError }).map({$0.objectID}) { // Resume failed uploads UploadManager.shared.backgroundQueue.async { UploadManager.shared.resume(failedUploads: failedUploads, completionHandler: { (error) in diff --git a/piwigo/Upload/Upload Services/UploadImage.swift b/piwigo/Upload/Upload Services/UploadImage.swift index a04d41c8d..599008e2e 100644 --- a/piwigo/Upload/Upload Services/UploadImage.swift +++ b/piwigo/Upload/Upload Services/UploadImage.swift @@ -64,8 +64,7 @@ extension UploadManager { // Update UI let uploadInfo: [String : Any] = ["localIndentifier" : newProperties.localIdentifier, - "stateLabel" : newProperties.stateLabel, - "progressFraction" : Float(0)] + "stateLabel" : newProperties.stateLabel] DispatchQueue.main.async { // Update UploadQueue cell and button shown in root album (or default album) let name = NSNotification.Name(rawValue: kPiwigoNotificationUploadProgress) diff --git a/piwigo/Upload/Upload Services/UploadManager.swift b/piwigo/Upload/Upload Services/UploadManager.swift index ca02be1e1..b80c57274 100644 --- a/piwigo/Upload/Upload Services/UploadManager.swift +++ b/piwigo/Upload/Upload Services/UploadManager.swift @@ -31,6 +31,7 @@ class UploadManager: NSObject, URLSessionDelegate { name: UIApplication.willResignActiveNotification, object: nil) } + @objc var isPaused = false private var appState = UIApplication.State.active @objc func willResignActive() -> Void { // Executed in the main queue when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. @@ -171,21 +172,16 @@ class UploadManager: NSObject, URLSessionDelegate { print("\(debugFormatter.string(from: Date())) > findNextImageToUpload() in", queueName()) print("\(debugFormatter.string(from: Date())) > preparing:\(isPreparing ? "Yes" : "No"), uploading:\(isUploading.count), finishing:\(isFinishing ? "Yes" : "No")") - // Get uploads to complete in queue + // Update app badge and Upload button in root/default album // Considers only uploads to the server to which the user is logged in let states: [kPiwigoUploadState] = [.waiting, .preparing, .preparingError, .prepared, .uploading, .uploadingError, .uploaded, .finishing, .finishingError] - guard let allUploads = uploadsProvider.getRequestsIn(states: states) else { - return - } + nberOfUploadsToComplete = uploadsProvider.getRequestsIn(states: states).count - // Update app badge and Upload button in root/default album - nberOfUploadsToComplete = allUploads.count - - // Determine the Power State - if ProcessInfo.processInfo.isLowPowerModeEnabled { + // Determine the Power State and if it should wait + if ProcessInfo.processInfo.isLowPowerModeEnabled || isPaused { // Low Power Mode is enabled. Stop transferring images. return } @@ -206,7 +202,7 @@ class UploadManager: NSObject, URLSessionDelegate { // Interrupted work shoulds be set as if an error was encountered /// - case of finishes - let finishingIDs = allUploads.filter({$0.state == .finishing}).map({$0.objectID}) + let finishingIDs = uploadsProvider.getRequestsIn(states: [.finishing]) if !isFinishing { // Transfers encountered an error for uploadID in finishingIDs { @@ -218,7 +214,7 @@ class UploadManager: NSObject, URLSessionDelegate { } } /// - case of transfers (a few transfers may be running in parallel) - let uploadingIDs = allUploads.filter({$0.state == .uploading}).map({$0.objectID}) + let uploadingIDs = uploadsProvider.getRequestsIn(states: [.uploading]) for uploadID in uploadingIDs { if !isUploading.contains(uploadID) { // Transfer encountered an error @@ -230,7 +226,7 @@ class UploadManager: NSObject, URLSessionDelegate { } } /// - case of preparations - let preparingIDs = allUploads.filter({$0.state == .preparing}).map({$0.objectID}) + let preparingIDs = uploadsProvider.getRequestsIn(states: [.preparing]) if !isPreparing { // Preparations encountered an error for uploadID in preparingIDs { @@ -245,9 +241,9 @@ class UploadManager: NSObject, URLSessionDelegate { // Not finishing and upload request to finish? // Only called when uploading with the pwg.images.upload method // because the title cannot be set during the upload. - let nberFinishedWithError = allUploads.filter({ $0.state == .finishingError } ).count + let nberFinishedWithError = uploadsProvider.getRequestsIn(states: [.finishingError]).count if !isFinishing, nberFinishedWithError < 2, - let uploadID = allUploads.first(where: {$0.state == .uploaded})?.objectID { + let uploadID = uploadsProvider.getRequestsIn(states: [.uploaded]).first { // Pause upload manager if app not in the foreground // and not executed in a background task @@ -266,9 +262,9 @@ class UploadManager: NSObject, URLSessionDelegate { } // Not transferring and file ready for transfer? - let nberUploadedWithError = allUploads.filter({ $0.state == .uploadingError } ).count + let nberUploadedWithError = uploadsProvider.getRequestsIn(states: [.uploadingError]).count if isUploading.count < maxNberOfTransfers, nberFinishedWithError < 2, nberUploadedWithError < 2, - let uploadID = allUploads.first(where: {$0.state == .prepared})?.objectID { + let uploadID = uploadsProvider.getRequestsIn(states: [.prepared]).first { // Pause upload manager if app not in the foreground // and not executed in a background task @@ -282,11 +278,11 @@ class UploadManager: NSObject, URLSessionDelegate { } // Not preparing and upload request waiting? - let nberPrepared = allUploads.filter({ $0.state == .prepared } ).count - let nberPreparedWithError = allUploads.filter({ $0.state == .preparingError } ).count + let nberPrepared = uploadsProvider.getRequestsIn(states: [.prepared]).count + let nberPreparedWithError = uploadsProvider.getRequestsIn(states: [.preparingError]).count if !isPreparing, nberPrepared < 2, nberFinishedWithError < 2, nberUploadedWithError < 2, nberPreparedWithError < 2, - let uploadID = allUploads.first(where: {$0.state == .waiting}).map({$0.objectID}) { + let uploadID = uploadsProvider.getRequestsIn(states: [.waiting]).first { print("\(debugFormatter.string(from: Date())) > preparedWithError:\(nberPreparedWithError), uploadingWithError:\(nberUploadedWithError), finishedWithError:\(nberFinishedWithError)") // Pause upload manager if app not in the foreground @@ -304,10 +300,9 @@ class UploadManager: NSObject, URLSessionDelegate { // No more image to transfer ;-) // Moderate images uploaded by Community regular user // Considers only uploads to the server to which the user is logged in + let finishedUploads = uploadsProvider.getRequestsIn(states: [.finished]) if Model.sharedInstance()?.hasNormalRights ?? false, - Model.sharedInstance()?.usesCommunityPluginV29 ?? false, - let finishedUploads = uploadsProvider.getRequestsIn(states: [.finished]), - finishedUploads.count > 0 { + Model.sharedInstance()?.usesCommunityPluginV29 ?? false, finishedUploads.count > 0 { // Pause upload manager if app not in the foreground // and not executed in a background task @@ -316,15 +311,20 @@ class UploadManager: NSObject, URLSessionDelegate { } // Moderate uploaded images - self.moderate(uploadedImages: finishedUploads) + self.moderate(completedRequests: finishedUploads) return } - // Delete images from Photo Library if user wanted it + // Suggest to delete images from Photo Library if user wanted it + // The deletion will only be suggested once and after completion of all uploads + if uploadsProvider.getRequestsIn(states: states).count > 0 { return } + + // Upload requests are completed // Considers only uploads to the server to which the user is logged in - if let completedUploads = uploadsProvider.getRequestsIn(states: [.finished, .moderated]), - completedUploads.filter({$0.deleteImageAfterUpload == true}).count > 0, allUploads.count == 0 { - self.delete(uploadedImages: completedUploads.filter({$0.deleteImageAfterUpload == true})) + let (imageIDs, uploadIDs) = uploadsProvider.getCompletedRequestsToBeDeleted() + if !imageIDs.isEmpty, !uploadIDs.isEmpty { + print("\(debugFormatter.string(from: Date())) > (\(imageIDs.count),\(uploadIDs.count)) should be deleted") + self.delete(uploadedImages: imageIDs, with: uploadIDs) } } @@ -349,17 +349,8 @@ class UploadManager: NSObject, URLSessionDelegate { uploadRequestsToPrepare = [NSManagedObjectID]() uploadRequestsToTransfer = [NSManagedObjectID]() - // Get series of uploads to complete - // Considers only uploads to the server to which the user is logged in - let states: [kPiwigoUploadState] = [.waiting, .prepared, .uploadingError] - guard let uploadRequests = uploadsProvider.getRequestsIn(states: states) else { - return - } - // Get list of upload requests rasdy for transfer and whose transfer did fail - let requestsToTransfer = uploadRequests.filter({($0.state == .prepared) || - ($0.state == .uploadingError)}) - .map({$0.objectID}) + let requestsToTransfer = uploadsProvider.getRequestsIn(states: [.prepared, .uploadingError]) let nberToTransfer = requestsToTransfer.count if nberToTransfer > 0 { if nberToTransfer > maxNberOfUploadsPerBackgroundTask { @@ -372,7 +363,7 @@ class UploadManager: NSObject, URLSessionDelegate { // Get list of upload requests to prepare let nberToPrepare = maxNberOfUploadsPerBackgroundTask - uploadRequestsToTransfer.count - let requestsToPrepare = uploadRequests.filter({$0.state == .waiting}).map({$0.objectID}) + let requestsToPrepare = uploadsProvider.getRequestsIn(states: [.waiting]) if requestsToPrepare.count > nberToPrepare { uploadRequestsToPrepare = Array(requestsToPrepare[.. missing Core Data object \(uploadID)!") - // Investigate next upload request? - if self.isExecutingBackgroundUploadTask { - // In background task — stop here - } else { - // In foreground, consider next image - self.findNextImageToUpload() + // Request not available…!? + uploadsProvider.updateStatusOfUpload(with: uploadID, to: .preparingFail, error: UploadError.missingData.errorDescription) { [unowned self] (_) in + // Investigate next upload request? + self.didEndPreparation() } return } @@ -443,8 +440,7 @@ class UploadManager: NSObject, URLSessionDelegate { let uploadInfo: [String : Any] = ["localIndentifier" : uploadProperties.localIdentifier, "photoResize" : Int16(uploadProperties.photoResize), "stateLabel" : kPiwigoUploadState.preparing.stateInfo, - "Error" : "", - "progressFraction" : Float(0.0)] + "Error" : ""] DispatchQueue.main.async { // Update UploadQueue cell and button shown in root album (or default album) let name = NSNotification.Name(rawValue: kPiwigoNotificationUploadProgress) @@ -463,12 +459,7 @@ class UploadManager: NSObject, URLSessionDelegate { // Asset not available… deleted? uploadsProvider.updateStatusOfUpload(with: uploadID, to: .preparingFail, error: UploadError.missingAsset.errorDescription) { [unowned self] (_) in // Investigate next upload request? - if self.isExecutingBackgroundUploadTask { - // In background task — stop here - } else { - // In foreground, consider next image - self.didEndPreparation() - } + self.didEndPreparation() } return } @@ -484,6 +475,11 @@ class UploadManager: NSObject, URLSessionDelegate { uploadProperties.fileName = fileName let fileExt = (URL(fileURLWithPath: fileName).pathExtension).lowercased() + // Check/update serverFileTypes if possible + if let fileTypes = Model.sharedInstance()?.serverFileTypes, fileTypes.count > 0 { + uploadProperties.serverFileTypes = fileTypes + } + // Launch preparation job if file format accepted by Piwigo server switch originalAsset.mediaType { case .image: @@ -519,12 +515,7 @@ class UploadManager: NSObject, URLSessionDelegate { uploadProperties.requestState = .formatError uploadsProvider.updatePropertiesOfUpload(with: uploadID, properties: uploadProperties) { [unowned self] (_) in // Investigate next upload request? - if self.isExecutingBackgroundUploadTask { - // In background task - } else { - // In foreground, consider next image - self.didEndPreparation() - } + self.didEndPreparation() } // showError(withTitle: NSLocalizedString("imageUploadError_title", comment: "Image Upload Error"), andMessage: NSLocalizedString("imageUploadError_format", comment: "Sorry, image files with extensions .\(fileExt.uppercased()) and .jpg are not accepted by the Piwigo server."), forRetrying: false, withImage: nextImageToBeUploaded) @@ -563,12 +554,7 @@ class UploadManager: NSObject, URLSessionDelegate { uploadProperties.requestState = .formatError uploadsProvider.updatePropertiesOfUpload(with: uploadID, properties: uploadProperties) { [unowned self] (_) in // Investigate next upload request? - if self.isExecutingBackgroundUploadTask { - // In background task - } else { - // In foreground, consider next image - self.didEndPreparation() - } + self.didEndPreparation() } // showError(withTitle: NSLocalizedString("videoUploadError_title", comment: "Video Upload Error"), andMessage: NSLocalizedString("videoUploadError_format", comment: "Sorry, video files with extension .\(fileExt.uppercased()) are not accepted by the Piwigo server."), forRetrying: false, withImage: uploadToPrepare) @@ -577,12 +563,7 @@ class UploadManager: NSObject, URLSessionDelegate { uploadProperties.requestState = .formatError uploadsProvider.updatePropertiesOfUpload(with: uploadID, properties: uploadProperties) { [unowned self] (_) in // Investigate next upload request? - if self.isExecutingBackgroundUploadTask { - // In background task - } else { - // In foreground, consider next image - self.didEndPreparation() - } + self.didEndPreparation() } // showError(withTitle: NSLocalizedString("audioUploadError_title", comment: "Audio Upload Error"), andMessage: NSLocalizedString("audioUploadError_format", comment: "Sorry, audio files are not supported by Piwigo Mobile yet."), forRetrying: false, withImage: uploadToPrepare) @@ -593,18 +574,14 @@ class UploadManager: NSObject, URLSessionDelegate { uploadProperties.requestState = .formatError uploadsProvider.updatePropertiesOfUpload(with: uploadID, properties: uploadProperties) { [unowned self] (_) in // Investigate next upload request? - if self.isExecutingBackgroundUploadTask { - // In background task - } else { - // In foreground, consider next image - self.didEndPreparation() - } + self.didEndPreparation() } } } @objc func didEndPreparation() { _isPreparing = false + if isExecutingBackgroundUploadTask { return } if isUploading.count <= maxNberOfTransfers, !isFinishing { findNextImageToUpload() } } @@ -633,17 +610,20 @@ class UploadManager: NSObject, URLSessionDelegate { var uploadProperties: UploadProperties! let taskContext = DataController.getPrivateContext() do { - uploadProperties = try (taskContext.existingObject(with: uploadID) as! Upload).getProperties() + let upload = try taskContext.existingObject(with: uploadID) as! Upload + if upload.isFault { + // The upload request is not fired yet. + upload.willAccessValue(forKey: nil) + uploadProperties = upload.getProperties() + upload.didAccessValue(forKey: nil) + } else { + uploadProperties = upload.getProperties() + } } catch { print("\(debugFormatter.string(from: Date())) > missing Core Data object \(uploadID.uriRepresentation())!") // Investigate next upload request? - if self.isExecutingBackgroundUploadTask { - // In background task — stop here - } else { - // In foreground, consider next image - self.findNextImageToUpload() - } + self.didEndTransfer(for: uploadID) return } @@ -672,27 +652,16 @@ class UploadManager: NSObject, URLSessionDelegate { // Do not prepare next image in background task (already scheduled) if self.isExecutingBackgroundUploadTask { return } - // Get uploads to complete in queue - // Considers only uploads to the server to which the user is logged in - let states: [kPiwigoUploadState] = [.waiting, .preparingError, .prepared, - .uploadingError, .finishingError] - guard let nextUploads = self.uploadsProvider.getRequestsIn(states: states) else { - return - } - - // Is the next image already prepared? - if nextUploads.filter( {$0.state == .prepared} ).count > 1 { return } - - // Is there any image to prepare? - if nextUploads.filter( {$0.state == .waiting} ).count == 0 { return } + // Stop here if there no image to prepare + if uploadsProvider.getRequestsIn(states: [.waiting]).count == 0 { return } // Should we prepare the next image in parallel? - let nberFinishedWithError = nextUploads.filter({ $0.state == .finishingError } ).count - let nberUploadedWithError = nextUploads.filter({ $0.state == .uploadingError } ).count - let nberPreparedWithError = nextUploads.filter({ $0.state == .preparingError } ).count - print("•••>> preparedWithError:\(nberPreparedWithError), uploadingWithError:\(nberUploadedWithError), finishedWithError:\(nberFinishedWithError)") - if !self.isPreparing, nberFinishedWithError < 2, nberUploadedWithError < 2, nberPreparedWithError < 2, - let uploadID = nextUploads.first(where: {$0.state == .waiting}).map({$0.objectID}) { + let nberFinishedWithError = uploadsProvider.getRequestsIn(states: [.finishingError]).count + let nberUploadedWithError = uploadsProvider.getRequestsIn(states: [.uploadingError]).count + let nberPreparedWithError = uploadsProvider.getRequestsIn(states: [.preparingError]).count + let uploadIDsToPrepare = uploadsProvider.getRequestsIn(states: [.waiting]) + if !self.isPreparing, let uploadID = uploadIDsToPrepare.first, + nberFinishedWithError < 2, nberUploadedWithError < 2, nberPreparedWithError < 2 { // Prepare the next upload self.isPreparing = true @@ -703,7 +672,13 @@ class UploadManager: NSObject, URLSessionDelegate { } @objc func didEndTransfer(for uploadID: NSManagedObjectID) { - _isUploading.remove(uploadID) + // Update list of current uploads + isUploading.remove(uploadID) + + // In background task: stop operation here + if self.isExecutingBackgroundUploadTask { return } + + // In foreground, always consider next file if !isPreparing, isUploading.count <= maxNberOfTransfers, !isFinishing { findNextImageToUpload() } } @@ -728,7 +703,15 @@ class UploadManager: NSObject, URLSessionDelegate { // MARK: - Uploaded Images Management - private func moderate(uploadedImages : [Upload]) -> Void { + private func moderate(completedRequests : [NSManagedObjectID]) -> Void { + + // Get completed upload requests + let taskContext = DataController.getPrivateContext() + var uploadedImages = [Upload]() + completedRequests.forEach { (objectId) in + uploadedImages.append(taskContext.object(with: objectId) as! Upload) + } + // Get list of categories let categories = IndexSet(uploadedImages.map({Int($0.category)})) @@ -759,12 +742,10 @@ class UploadManager: NSObject, URLSessionDelegate { } } - func delete(uploadedImages: [Upload]) -> Void { - // Get local identifiers of uploaded images to delete - let uploadedImagesToDelete = uploadedImages.map({$0.localIdentifier}) - + func delete(uploadedImages: [String], with uploadIDs: [NSManagedObjectID]) -> Void { + // Get image assets of images to delete - let assetsToDelete = PHAsset.fetchAssets(withLocalIdentifiers: uploadedImagesToDelete, options: nil) + let assetsToDelete = PHAsset.fetchAssets(withLocalIdentifiers: uploadedImages, options: nil) // Delete images from Photo Library DispatchQueue.main.async(execute: { @@ -775,14 +756,7 @@ class UploadManager: NSObject, URLSessionDelegate { if success == true { // Delete upload requests in a private queue DispatchQueue.global(qos: .userInitiated).async { - self.uploadsProvider.delete(uploadRequests: uploadedImages) - } - } else { - // User refused to delete the photos - DispatchQueue.global(qos: .userInitiated).async { - // Remember that user did not want to delete them - let uploadsToUpdate = uploadedImages.map({$0.objectID}) - self.uploadsProvider.preventDeletionOfUploads(with: uploadsToUpdate) + self.uploadsProvider.delete(uploadRequests: uploadIDs) } } }) @@ -831,7 +805,8 @@ class UploadManager: NSObject, URLSessionDelegate { // Considers only uploads to the server to which the user is logged in let states: [kPiwigoUploadState] = [.preparingError, .preparingFail, .formatError, .uploadingError, .finishingError] - if let failedUploads = self.uploadsProvider.getRequestsIn(states: states), failedUploads.count > 0 { + let failedUploads = self.uploadsProvider.getRequestsIn(states: states) + if failedUploads.count > 0 { // Resume failed uploads self.resume(failedUploads: failedUploads) { (_) in // Pursue the work @@ -847,30 +822,42 @@ class UploadManager: NSObject, URLSessionDelegate { } } - func resume(failedUploads: [Upload], completionHandler: @escaping (Error?) -> Void) -> Void { + func resume(failedUploads: [NSManagedObjectID], completionHandler: @escaping (Error?) -> Void) -> Void { // Initialisation var uploadsToUpdate = [UploadProperties]() + // Create a private queue context. + let taskContext = DataController.getPrivateContext() + // Loop over the failed uploads - for failedUpload in failedUploads { - - // Create upload properties with no error - var uploadProperties: UploadProperties - switch failedUpload.state { - case .uploadingError: - // -> Will retry to transfer the image - uploadProperties = failedUpload.getProperties(with: .prepared, error: "") - case .finishingError: - // -> Will retry to finish the upload - uploadProperties = failedUpload.getProperties(with: .uploaded, error: "") - default: - // —> Will retry from scratch - uploadProperties = failedUpload.getProperties(with: .waiting, error: "") + for failedUploadID in failedUploads { + do { + // Get upload request + let failedUpload = try (taskContext.existingObject(with: failedUploadID) as! Upload) + + // Create upload properties cancelling error + var uploadProperties: UploadProperties + switch failedUpload.state { + case .uploadingError: + // -> Will retry to transfer the image + uploadProperties = failedUpload.getProperties(with: .prepared, error: "") + case .finishingError: + // -> Will retry to finish the upload + uploadProperties = failedUpload.getProperties(with: .uploaded, error: "") + default: + // —> Will retry from scratch + uploadProperties = failedUpload.getProperties(with: .waiting, error: "") + } + + // Append updated upload + uploadsToUpdate.append(uploadProperties) + } + catch { + print("\(debugFormatter.string(from: Date())) > missing Core Data object \(failedUploadID)!") + // Request not available…!? + continue } - - // Append updated upload - uploadsToUpdate.append(uploadProperties) } // Update failed uploads diff --git a/piwigo/Upload/Upload Services/UploadTransfer.swift b/piwigo/Upload/Upload Services/UploadTransfer.swift index 6eee3930b..d950618f9 100644 --- a/piwigo/Upload/Upload Services/UploadTransfer.swift +++ b/piwigo/Upload/Upload Services/UploadTransfer.swift @@ -131,12 +131,7 @@ extension UploadManager { } uploadsProvider.updateStatusOfUpload(with: uploadID, to: requestError, error: error.localizedDescription) { [unowned self] (_) in // Consider next image? - if self.isExecutingBackgroundUploadTask { - // In background task: stop operation here - } else { - // In foreground, always consider next file - self.didEndTransfer(for: uploadID) - } + self.didEndTransfer(for: uploadID) } return } @@ -144,21 +139,17 @@ extension UploadManager { // Update state of upload request print("\(debugFormatter.string(from: Date())) > transferred \(uploadID.uriRepresentation())") uploadsProvider.updatePropertiesOfUpload(with: uploadID, properties: properties) { (_) in + // Get uploads to complete in queue + // Considers only uploads to the server to which the user is logged in + let states: [kPiwigoUploadState] = [.waiting, + .preparing, .preparingError, .prepared, + .uploading, .uploadingError, .uploaded, + .finishing, .finishingError] + // Update app badge and Upload button in root/default album + self.nberOfUploadsToComplete = self.uploadsProvider.getRequestsIn(states: states).count + // Consider next image? - if self.isExecutingBackgroundUploadTask { - // In background task - // Get uploads to complete in queue - // Considers only uploads to the server to which the user is logged in - let states: [kPiwigoUploadState] = [.waiting, - .preparing, .preparingError, .prepared, - .uploading, .uploadingError, .uploaded, - .finishing, .finishingError] - // Update app badge and Upload button in root/default album - self.nberOfUploadsToComplete = self.uploadsProvider.getRequestsIn(states: states)?.count ?? 0 - } else { - // In foreground, always consider next file - self.didEndTransfer(for: uploadID) - } + self.didEndTransfer(for: uploadID) } } @@ -518,7 +509,15 @@ extension UploadManager { } var uploadProperties: UploadProperties do { - uploadProperties = try (taskContext.existingObject(with: uploadID) as! Upload).getProperties() + let upload = try taskContext.existingObject(with: uploadID) as! Upload + if upload.isFault { + // The upload request is not fired yet. + upload.willAccessValue(forKey: nil) + uploadProperties = upload.getProperties() + upload.didAccessValue(forKey: nil) + } else { + uploadProperties = upload.getProperties() + } } catch { print("\(debugFormatter.string(from: Date())) > \(md5sum) | missing Core Data object!")
- iPad Pro (10.5-inch) + iPad Pro (10.5-inch)
- - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) - - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) - - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) - - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) - - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) - - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) - - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) - - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) - - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) - - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch)
- iPad Pro (11-inch) (2nd generation) + iPad Pro (11-inch) (2nd generation)
- - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) - - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) - - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) - - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) - - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) - - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) - - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) - - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) - - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) - - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation)
- iPad Pro (12.9-inch) (2nd generation) + iPad Pro (12.9-inch) (2nd generation)
- - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) - - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) - - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) - - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) - - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) - - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) - - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) - - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) - - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) - - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation)
- iPad Pro (12.9-inch) (3rd generation) + iPad Pro (12.9-inch) (3rd generation)
- - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) - - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) - - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) - - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) - - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) - - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) - - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) - - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) - - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) - - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation)
- iPad Pro (9.7-inch) + iPad Pro (9.7-inch)
- - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) - - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) - - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) - - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) - - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) - - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) - - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) - - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) - - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) - - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch)
- iPhone 11 Pro Max + iPhone 11 Pro Max
- - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max - - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max - - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max - - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max - - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max - - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max - - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max - - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max - - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max - - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max
- iPhone 11 Pro + iPhone 11 Pro
- - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro - - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro - - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro - - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro - - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro - - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro - - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro - - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro - - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro - - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro
- iPhone 8 Plus + iPhone 8 Plus
- - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus - - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus - - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus - - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus - - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus - - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus - - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus - - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus - - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus - - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus
- iPhone 8 + iPhone 8
- - nl iPhone 8 + + nl-NL iPhone 8 - - nl iPhone 8 + + nl-NL iPhone 8 - - nl iPhone 8 + + nl-NL iPhone 8 - - nl iPhone 8 + + nl-NL iPhone 8 - - nl iPhone 8 + + nl-NL iPhone 8 - - nl iPhone 8 + + nl-NL iPhone 8 - - nl iPhone 8 + + nl-NL iPhone 8 - - nl iPhone 8 + + nl-NL iPhone 8 - - nl iPhone 8 + + nl-NL iPhone 8 - - nl iPhone 8 + + nl-NL iPhone 8
- iPhone SE + iPhone SE
- - nl iPhone SE + + nl-NL iPhone SE - - nl iPhone SE + + nl-NL iPhone SE - - nl iPhone SE + + nl-NL iPhone SE - - nl iPhone SE + + nl-NL iPhone SE - - nl iPhone SE + + nl-NL iPhone SE - - nl iPhone SE + + nl-NL iPhone SE - - nl iPhone SE + + nl-NL iPhone SE - - nl iPhone SE + + nl-NL iPhone SE - - nl iPhone SE + + nl-NL iPhone SE - - nl iPhone SE + + nl-NL iPhone SE
- ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch) - ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch) - ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch) - ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch) - ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch) - ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch) - ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch) - ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch) - ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch) - ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch)
- ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation) - ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation) - ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation) - ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation) - ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation) - ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation) - ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation) - ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation) - ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation) - ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation)
- ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation) - ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation) - ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation) - ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation) - ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation) - ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation) - ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation) - ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation) - ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation) - ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation)
- ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation) - ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation) - ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation) - ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation) - ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation) - ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation) - ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation) - ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation) - ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation) - ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation)
- ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch) - ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch) - ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch) - ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch) - ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch) - ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch) - ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch) - ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch) - ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch) - ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch)
- ru iPhone 11 Pro Max + ru iPhone 11 Pro Max - ru iPhone 11 Pro Max + ru iPhone 11 Pro Max - ru iPhone 11 Pro Max + ru iPhone 11 Pro Max - ru iPhone 11 Pro Max + ru iPhone 11 Pro Max - ru iPhone 11 Pro Max + ru iPhone 11 Pro Max - ru iPhone 11 Pro Max + ru iPhone 11 Pro Max - ru iPhone 11 Pro Max + ru iPhone 11 Pro Max - ru iPhone 11 Pro Max + ru iPhone 11 Pro Max - ru iPhone 11 Pro Max + ru iPhone 11 Pro Max - ru iPhone 11 Pro Max + ru iPhone 11 Pro Max
- ru iPhone 11 Pro + ru iPhone 11 Pro - ru iPhone 11 Pro + ru iPhone 11 Pro - ru iPhone 11 Pro + ru iPhone 11 Pro - ru iPhone 11 Pro + ru iPhone 11 Pro - ru iPhone 11 Pro + ru iPhone 11 Pro - ru iPhone 11 Pro + ru iPhone 11 Pro - ru iPhone 11 Pro + ru iPhone 11 Pro - ru iPhone 11 Pro + ru iPhone 11 Pro - ru iPhone 11 Pro + ru iPhone 11 Pro - ru iPhone 11 Pro + ru iPhone 11 Pro
- ru iPhone 8 Plus + ru iPhone 8 Plus - ru iPhone 8 Plus + ru iPhone 8 Plus - ru iPhone 8 Plus + ru iPhone 8 Plus - ru iPhone 8 Plus + ru iPhone 8 Plus - ru iPhone 8 Plus + ru iPhone 8 Plus - ru iPhone 8 Plus + ru iPhone 8 Plus - ru iPhone 8 Plus + ru iPhone 8 Plus - ru iPhone 8 Plus + ru iPhone 8 Plus - ru iPhone 8 Plus + ru iPhone 8 Plus - ru iPhone 8 Plus + ru iPhone 8 Plus
- ru iPhone 8 + ru iPhone 8 - ru iPhone 8 + ru iPhone 8 - ru iPhone 8 + ru iPhone 8 - ru iPhone 8 + ru iPhone 8 - ru iPhone 8 + ru iPhone 8 - ru iPhone 8 + ru iPhone 8 - ru iPhone 8 + ru iPhone 8 - ru iPhone 8 + ru iPhone 8 - ru iPhone 8 + ru iPhone 8 - ru iPhone 8 + ru iPhone 8
- ru iPhone SE + ru iPhone SE - ru iPhone SE + ru iPhone SE - ru iPhone SE + ru iPhone SE - ru iPhone SE + ru iPhone SE - ru iPhone SE + ru iPhone SE - ru iPhone SE + ru iPhone SE - ru iPhone SE + ru iPhone SE - ru iPhone SE + ru iPhone SE - ru iPhone SE + ru iPhone SE - ru iPhone SE + ru iPhone SE
- sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch) - sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch) - sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch) - sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch) - sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch) - sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch) - sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch) - sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch) - sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch) - sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch)
- sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation) - sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation) - sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation) - sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation) - sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation) - sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation) - sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation) - sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation) - sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation) - sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation)
- sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation) - sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation) - sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation) - sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation) - sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation) - sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation) - sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation) - sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation) - sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation) - sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation)
- sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation) - sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation) - sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation) - sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation) - sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation) - sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation) - sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation) - sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation) - sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation) - sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation)
- sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch) - sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch) - sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch) - sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch) - sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch) - sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch) - sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch) - sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch) - sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch) - sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch)
- sv iPhone 11 Pro Max + sv iPhone 11 Pro Max - sv iPhone 11 Pro Max + sv iPhone 11 Pro Max - sv iPhone 11 Pro Max + sv iPhone 11 Pro Max - sv iPhone 11 Pro Max + sv iPhone 11 Pro Max - sv iPhone 11 Pro Max + sv iPhone 11 Pro Max - sv iPhone 11 Pro Max + sv iPhone 11 Pro Max - sv iPhone 11 Pro Max + sv iPhone 11 Pro Max - sv iPhone 11 Pro Max + sv iPhone 11 Pro Max - sv iPhone 11 Pro Max + sv iPhone 11 Pro Max - sv iPhone 11 Pro Max + sv iPhone 11 Pro Max
- sv iPhone 11 Pro + sv iPhone 11 Pro - sv iPhone 11 Pro + sv iPhone 11 Pro - sv iPhone 11 Pro + sv iPhone 11 Pro - sv iPhone 11 Pro + sv iPhone 11 Pro - sv iPhone 11 Pro + sv iPhone 11 Pro - sv iPhone 11 Pro + sv iPhone 11 Pro - sv iPhone 11 Pro + sv iPhone 11 Pro - sv iPhone 11 Pro + sv iPhone 11 Pro - sv iPhone 11 Pro + sv iPhone 11 Pro - sv iPhone 11 Pro + sv iPhone 11 Pro
- sv iPhone 8 Plus + sv iPhone 8 Plus - sv iPhone 8 Plus + sv iPhone 8 Plus - sv iPhone 8 Plus + sv iPhone 8 Plus - sv iPhone 8 Plus + sv iPhone 8 Plus - sv iPhone 8 Plus + sv iPhone 8 Plus - sv iPhone 8 Plus + sv iPhone 8 Plus - sv iPhone 8 Plus + sv iPhone 8 Plus - sv iPhone 8 Plus + sv iPhone 8 Plus - sv iPhone 8 Plus + sv iPhone 8 Plus - sv iPhone 8 Plus + sv iPhone 8 Plus
- sv iPhone 8 + sv iPhone 8 - sv iPhone 8 + sv iPhone 8 - sv iPhone 8 + sv iPhone 8 - sv iPhone 8 + sv iPhone 8 - sv iPhone 8 + sv iPhone 8 - sv iPhone 8 + sv iPhone 8 - sv iPhone 8 + sv iPhone 8 - sv iPhone 8 + sv iPhone 8 - sv iPhone 8 + sv iPhone 8 - sv iPhone 8 + sv iPhone 8
- sv iPhone SE + sv iPhone SE - sv iPhone SE + sv iPhone SE - sv iPhone SE + sv iPhone SE - sv iPhone SE + sv iPhone SE - sv iPhone SE + sv iPhone SE - sv iPhone SE + sv iPhone SE - sv iPhone SE + sv iPhone SE - sv iPhone SE + sv iPhone SE - sv iPhone SE + sv iPhone SE - sv iPhone SE + sv iPhone SE
- zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch) - zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch) - zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch) - zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch) - zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch) - zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch) - zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch) - zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch) - zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch) - zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch)
- zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation) - zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation) - zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation) - zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation) - zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation) - zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation) - zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation) - zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation) - zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation) - zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation)
- zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation) - zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation) - zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation) - zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation) - zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation) - zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation) - zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation) - zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation) - zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation) - zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation)
- zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation) - zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation) - zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation) - zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation) - zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation) - zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation) - zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation) - zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation) - zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation) - zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation)
- zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch) - zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch) - zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch) - zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch) - zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch) - zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch) - zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch) - zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch) - zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch) - zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch)
- zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max - zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max - zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max - zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max - zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max - zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max - zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max - zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max - zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max - zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max
- zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro - zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro - zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro - zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro - zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro - zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro - zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro - zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro - zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro - zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro
- zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus - zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus - zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus - zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus - zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus - zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus - zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus - zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus - zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus - zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus
- zh-Hans iPhone 8 + zh-Hans iPhone 8 - zh-Hans iPhone 8 + zh-Hans iPhone 8 - zh-Hans iPhone 8 + zh-Hans iPhone 8 - zh-Hans iPhone 8 + zh-Hans iPhone 8 - zh-Hans iPhone 8 + zh-Hans iPhone 8 - zh-Hans iPhone 8 + zh-Hans iPhone 8 - zh-Hans iPhone 8 + zh-Hans iPhone 8 - zh-Hans iPhone 8 + zh-Hans iPhone 8 - zh-Hans iPhone 8 + zh-Hans iPhone 8 - zh-Hans iPhone 8 + zh-Hans iPhone 8
- zh-Hans iPhone SE + zh-Hans iPhone SE - zh-Hans iPhone SE + zh-Hans iPhone SE - zh-Hans iPhone SE + zh-Hans iPhone SE - zh-Hans iPhone SE + zh-Hans iPhone SE - zh-Hans iPhone SE + zh-Hans iPhone SE - zh-Hans iPhone SE + zh-Hans iPhone SE - zh-Hans iPhone SE + zh-Hans iPhone SE - zh-Hans iPhone SE + zh-Hans iPhone SE - zh-Hans iPhone SE + zh-Hans iPhone SE - zh-Hans iPhone SE + zh-Hans iPhone SE
- - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) -
de
+
de-DE
- - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) -
en
+
en-US
- - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) -
es
+
es-ES
- - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) -
fr
+
fr-FR
@@ -7044,10 +7105,10 @@

Image01

ja
- - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) -
nl
+
nl-NL
@@ -7081,28 +7142,28 @@

Image01

da
- - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) -
fr
+
fr-FR
@@ -7123,10 +7184,10 @@

Image01

ja
- - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) -
nl
+
nl-NL
@@ -7160,28 +7221,28 @@

Image01

da
- - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) -
fr
+
fr-FR
@@ -7202,10 +7263,10 @@

Image01

ja
- - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) -
nl
+
nl-NL
@@ -7239,28 +7300,28 @@

Image01

da
- - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) -
fr
+
fr-FR
@@ -7281,10 +7342,10 @@

Image01

ja
- - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) -
nl
+
nl-NL
@@ -7318,28 +7379,28 @@

Image01

da
- - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) -
de
+
de-DE
- - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) -
en
+
en-US
- - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) -
es
+
es-ES
- - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) -
fr
+
fr-FR
@@ -7360,10 +7421,10 @@

Image01

ja
- - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) -
nl
+
nl-NL
@@ -7385,7 +7446,7 @@

Image01

+ iPhone 11 Pro Max
- - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max -
de
+
de-DE
- - en iPhone 11 Pro Max + + en-US iPhone 11 Pro Max -
en
+
en-US
- - es iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max -
es
+
es-ES
- - fr iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max -
fr
+
fr-FR
+
+ + fr_FR iPhone 11 Pro Max + +
fr_FR
- id iPhone 11 Pro Max + id iPhone 11 Pro Max
id
- it iPhone 11 Pro Max + it iPhone 11 Pro Max
it
- ja iPhone 11 Pro Max + ja iPhone 11 Pro Max
ja
- - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max -
nl
+
nl-NL
- ru iPhone 11 Pro Max + ru iPhone 11 Pro Max
ru
- sv iPhone 11 Pro Max + sv iPhone 11 Pro Max
sv
- zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max
zh-Hans
- da iPhone 11 Pro + da iPhone 11 Pro
da
- - de iPhone 11 Pro + + de-DE iPhone 11 Pro -
de
+
de-DE
- - en iPhone 11 Pro + + en-US iPhone 11 Pro -
en
+
en-US
- - es iPhone 11 Pro + + es-ES iPhone 11 Pro -
es
+
es-ES
- - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro -
fr
+
fr-FR
- id iPhone 11 Pro + id iPhone 11 Pro
id
- it iPhone 11 Pro + it iPhone 11 Pro
it
- ja iPhone 11 Pro + ja iPhone 11 Pro
ja
- - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro -
nl
+
nl-NL
- ru iPhone 11 Pro + ru iPhone 11 Pro
ru
- sv iPhone 11 Pro + sv iPhone 11 Pro
sv
- zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro
zh-Hans
- da iPhone 8 Plus + da iPhone 8 Plus
da
- - de iPhone 8 Plus + + de-DE iPhone 8 Plus -
de
+
de-DE
- - en iPhone 8 Plus + + en-US iPhone 8 Plus -
en
+
en-US
- - es iPhone 8 Plus + + es-ES iPhone 8 Plus -
es
+
es-ES
- - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus -
fr
+
fr-FR
- id iPhone 8 Plus + id iPhone 8 Plus
id
- it iPhone 8 Plus + it iPhone 8 Plus
it
- ja iPhone 8 Plus + ja iPhone 8 Plus
ja
- - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus -
nl
+
nl-NL
- ru iPhone 8 Plus + ru iPhone 8 Plus
ru
- sv iPhone 8 Plus + sv iPhone 8 Plus
sv
- zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus
zh-Hans
- da iPhone 8 + da iPhone 8
da
- - de iPhone 8 + + de-DE iPhone 8 -
de
+
de-DE
- - en iPhone 8 + + en-US iPhone 8 -
en
+
en-US
- - es iPhone 8 + + es-ES iPhone 8 -
es
+
es-ES
- - fr iPhone 8 + + fr-FR iPhone 8 -
fr
+
fr-FR
- id iPhone 8 + id iPhone 8
id
- it iPhone 8 + it iPhone 8
it
- ja iPhone 8 + ja iPhone 8
ja
- - nl iPhone 8 + + nl-NL iPhone 8 -
nl
+
nl-NL
- ru iPhone 8 + ru iPhone 8
ru
- sv iPhone 8 + sv iPhone 8
sv
- zh-Hans iPhone 8 + zh-Hans iPhone 8
zh-Hans
- da iPad Pro (10.5-inch) + da iPad Pro (10.5-inch)
da
- - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) -
de
+
de-DE
- - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) -
en
+
en-US
- - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) -
es
+
es-ES
- - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) -
fr
+
fr-FR
- id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch)
id
- it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch)
it
- ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch)
ja
- - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) -
nl
+
nl-NL
- ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch)
ru
- sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch)
sv
- zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch)
zh-Hans
- da iPad Pro (11-inch) (2nd generation) + da iPad Pro (11-inch) (2nd generation)
da
- - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation)
id
- it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation)
it
- ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation)
ja
- - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation)
ru
- sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation)
sv
- zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (2nd generation) + da iPad Pro (12.9-inch) (2nd generation)
da
- - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation)
id
- it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation)
it
- ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation)
ja
- - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation)
ru
- sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (3rd generation) + da iPad Pro (12.9-inch) (3rd generation)
da
- - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation)
id
- it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation)
it
- ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation)
ja
- - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation)
ru
- sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation)
zh-Hans
- da iPad Pro (9.7-inch) + da iPad Pro (9.7-inch)
da
- - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) -
de
+
de-DE
- - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) -
en
+
en-US
- - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) -
es
+
es-ES
- - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) -
fr
+
fr-FR
- id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch)
id
- it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch)
it
- ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch)
ja
- - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) -
nl
+
nl-NL
- ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch)
ru
- sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch)
sv
- zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch)
zh-Hans
+ iPhone 11 Pro Max
- da iPhone 11 Pro Max + da iPhone 11 Pro Max
da
- - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max + +
de-DE
+
+ + en-US iPhone 11 Pro Max -
de
+
en-US
- - en iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max -
en
+
es-ES
- - es iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max -
es
+
fr-FR
- - fr iPhone 11 Pro Max + + fr_FR iPhone 11 Pro Max -
fr
+
fr_FR
- id iPhone 11 Pro Max + id iPhone 11 Pro Max
id
- it iPhone 11 Pro Max + it iPhone 11 Pro Max
it
- ja iPhone 11 Pro Max + ja iPhone 11 Pro Max
ja
- - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max -
nl
+
nl-NL
- ru iPhone 11 Pro Max + ru iPhone 11 Pro Max
ru
- sv iPhone 11 Pro Max + sv iPhone 11 Pro Max
sv
- zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max
zh-Hans
- da iPhone 11 Pro + da iPhone 11 Pro
da
- - de iPhone 11 Pro + + de-DE iPhone 11 Pro -
de
+
de-DE
- - en iPhone 11 Pro + + en-US iPhone 11 Pro -
en
+
en-US
- - es iPhone 11 Pro + + es-ES iPhone 11 Pro -
es
+
es-ES
- - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro -
fr
+
fr-FR
- id iPhone 11 Pro + id iPhone 11 Pro
id
- it iPhone 11 Pro + it iPhone 11 Pro
it
- ja iPhone 11 Pro + ja iPhone 11 Pro
ja
- - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro -
nl
+
nl-NL
- ru iPhone 11 Pro + ru iPhone 11 Pro
ru
- sv iPhone 11 Pro + sv iPhone 11 Pro
sv
- zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro
zh-Hans
- da iPhone 8 Plus + da iPhone 8 Plus
da
- - de iPhone 8 Plus + + de-DE iPhone 8 Plus -
de
+
de-DE
- - en iPhone 8 Plus + + en-US iPhone 8 Plus -
en
+
en-US
- - es iPhone 8 Plus + + es-ES iPhone 8 Plus -
es
+
es-ES
- - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus -
fr
+
fr-FR
- id iPhone 8 Plus + id iPhone 8 Plus
id
- it iPhone 8 Plus + it iPhone 8 Plus
it
- ja iPhone 8 Plus + ja iPhone 8 Plus
ja
- - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus -
nl
+
nl-NL
- ru iPhone 8 Plus + ru iPhone 8 Plus
ru
- sv iPhone 8 Plus + sv iPhone 8 Plus
sv
- zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus
zh-Hans
- da iPhone 8 + da iPhone 8
da
- - de iPhone 8 + + de-DE iPhone 8 -
de
+
de-DE
- - en iPhone 8 + + en-US iPhone 8 -
en
+
en-US
- - es iPhone 8 + + es-ES iPhone 8 -
es
+
es-ES
- - fr iPhone 8 + + fr-FR iPhone 8 -
fr
+
fr-FR
- id iPhone 8 + id iPhone 8
id
- it iPhone 8 + it iPhone 8
it
- ja iPhone 8 + ja iPhone 8
ja
- - nl iPhone 8 + + nl-NL iPhone 8 -
nl
+
nl-NL
- ru iPhone 8 + ru iPhone 8
ru
- sv iPhone 8 + sv iPhone 8
sv
- zh-Hans iPhone 8 + zh-Hans iPhone 8
zh-Hans
- da iPad Pro (10.5-inch) + da iPad Pro (10.5-inch)
da
- - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) -
de
+
de-DE
- - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) -
en
+
en-US
- - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) -
es
+
es-ES
- - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) -
fr
+
fr-FR
- id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch)
id
- it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch)
it
- ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch)
ja
- - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) -
nl
+
nl-NL
- ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch)
ru
- sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch)
sv
- zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch)
zh-Hans
- da iPad Pro (11-inch) (2nd generation) + da iPad Pro (11-inch) (2nd generation)
da
- - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation)
id
- it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation)
it
- ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation)
ja
- - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation)
ru
- sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation)
sv
- zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (2nd generation) + da iPad Pro (12.9-inch) (2nd generation)
da
- - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation)
id
- it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation)
it
- ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation)
ja
- - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation)
ru
- sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (3rd generation) + da iPad Pro (12.9-inch) (3rd generation)
da
- - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation)
id
- it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation)
it
- ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation)
ja
- - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation)
ru
- sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation)
zh-Hans
- da iPad Pro (9.7-inch) + da iPad Pro (9.7-inch)
da
- - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) -
de
+
de-DE
- - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) -
en
+
en-US
- - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) -
es
+
es-ES
- - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) -
fr
+
fr-FR
- id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch)
id
- it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch)
it
- ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch)
ja
- - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) -
nl
+
nl-NL
- ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch)
ru
- sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch)
sv
- zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch)
zh-Hans
+ iPhone 11 Pro Max
- da iPhone 11 Pro Max + da iPhone 11 Pro Max
da
- - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max + +
de-DE
+
+ + en-US iPhone 11 Pro Max -
de
+
en-US
- - en iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max -
en
+
es-ES
- - es iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max -
es
+
fr-FR
- - fr iPhone 11 Pro Max + + fr_FR iPhone 11 Pro Max -
fr
+
fr_FR
- id iPhone 11 Pro Max + id iPhone 11 Pro Max
id
- it iPhone 11 Pro Max + it iPhone 11 Pro Max
it
- ja iPhone 11 Pro Max + ja iPhone 11 Pro Max
ja
- - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max -
nl
+
nl-NL
- ru iPhone 11 Pro Max + ru iPhone 11 Pro Max
ru
- sv iPhone 11 Pro Max + sv iPhone 11 Pro Max
sv
- zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max
zh-Hans
- da iPhone 11 Pro + da iPhone 11 Pro
da
- - de iPhone 11 Pro + + de-DE iPhone 11 Pro -
de
+
de-DE
- - en iPhone 11 Pro + + en-US iPhone 11 Pro -
en
+
en-US
- - es iPhone 11 Pro + + es-ES iPhone 11 Pro -
es
+
es-ES
- - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro -
fr
+
fr-FR
- id iPhone 11 Pro + id iPhone 11 Pro
id
- it iPhone 11 Pro + it iPhone 11 Pro
it
- ja iPhone 11 Pro + ja iPhone 11 Pro
ja
- - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro -
nl
+
nl-NL
- ru iPhone 11 Pro + ru iPhone 11 Pro
ru
- sv iPhone 11 Pro + sv iPhone 11 Pro
sv
- zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro
zh-Hans
- da iPhone 8 Plus + da iPhone 8 Plus
da
- - de iPhone 8 Plus + + de-DE iPhone 8 Plus -
de
+
de-DE
- - en iPhone 8 Plus + + en-US iPhone 8 Plus -
en
+
en-US
- - es iPhone 8 Plus + + es-ES iPhone 8 Plus -
es
+
es-ES
- - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus -
fr
+
fr-FR
- id iPhone 8 Plus + id iPhone 8 Plus
id
- it iPhone 8 Plus + it iPhone 8 Plus
it
- ja iPhone 8 Plus + ja iPhone 8 Plus
ja
- - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus -
nl
+
nl-NL
- ru iPhone 8 Plus + ru iPhone 8 Plus
ru
- sv iPhone 8 Plus + sv iPhone 8 Plus
sv
- zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus
zh-Hans
- da iPhone 8 + da iPhone 8
da
- - de iPhone 8 + + de-DE iPhone 8 -
de
+
de-DE
- - en iPhone 8 + + en-US iPhone 8 -
en
+
en-US
- - es iPhone 8 + + es-ES iPhone 8 -
es
+
es-ES
- - fr iPhone 8 + + fr-FR iPhone 8 -
fr
+
fr-FR
- id iPhone 8 + id iPhone 8
id
- it iPhone 8 + it iPhone 8
it
- ja iPhone 8 + ja iPhone 8
ja
- - nl iPhone 8 + + nl-NL iPhone 8 -
nl
+
nl-NL
- ru iPhone 8 + ru iPhone 8
ru
- sv iPhone 8 + sv iPhone 8
sv
- zh-Hans iPhone 8 + zh-Hans iPhone 8
zh-Hans
- da iPad Pro (10.5-inch) + da iPad Pro (10.5-inch)
da
- - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) -
de
+
de-DE
- - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) -
en
+
en-US
- - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) -
es
+
es-ES
- - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) -
fr
+
fr-FR
- id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch)
id
- it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch)
it
- ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch)
ja
- - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) -
nl
+
nl-NL
- ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch)
ru
- sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch)
sv
- zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch)
zh-Hans
- da iPad Pro (11-inch) (2nd generation) + da iPad Pro (11-inch) (2nd generation)
da
- - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation)
id
- it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation)
it
- ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation)
ja
- - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation)
ru
- sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation)
sv
- zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (2nd generation) + da iPad Pro (12.9-inch) (2nd generation)
da
- - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation)
id
- it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation)
it
- ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation)
ja
- - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation)
ru
- sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (3rd generation) + da iPad Pro (12.9-inch) (3rd generation)
da
- - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation)
id
- it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation)
it
- ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation)
ja
- - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation)
ru
- sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation)
zh-Hans
- da iPad Pro (9.7-inch) + da iPad Pro (9.7-inch)
da
- - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) -
de
+
de-DE
- - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) -
en
+
en-US
- - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) -
es
+
es-ES
- - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) -
fr
+
fr-FR
- id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch)
id
- it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch)
it
- ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch)
ja
- - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) -
nl
+
nl-NL
- ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch)
ru
- sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch)
sv
- zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch)
zh-Hans
+ iPhone 11 Pro Max
- da iPhone 11 Pro Max + da iPhone 11 Pro Max
da
- - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max + +
de-DE
+
+ + en-US iPhone 11 Pro Max -
de
+
en-US
- - en iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max -
en
+
es-ES
- - es iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max -
es
+
fr-FR
- - fr iPhone 11 Pro Max + + fr_FR iPhone 11 Pro Max -
fr
+
fr_FR
- id iPhone 11 Pro Max + id iPhone 11 Pro Max
id
- it iPhone 11 Pro Max + it iPhone 11 Pro Max
it
- ja iPhone 11 Pro Max + ja iPhone 11 Pro Max
ja
- - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max -
nl
+
nl-NL
- ru iPhone 11 Pro Max + ru iPhone 11 Pro Max
ru
- sv iPhone 11 Pro Max + sv iPhone 11 Pro Max
sv
- zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max
zh-Hans
- da iPhone 11 Pro + da iPhone 11 Pro
da
- - de iPhone 11 Pro + + de-DE iPhone 11 Pro -
de
+
de-DE
- - en iPhone 11 Pro + + en-US iPhone 11 Pro -
en
+
en-US
- - es iPhone 11 Pro + + es-ES iPhone 11 Pro -
es
+
es-ES
- - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro -
fr
+
fr-FR
- id iPhone 11 Pro + id iPhone 11 Pro
id
- it iPhone 11 Pro + it iPhone 11 Pro
it
- ja iPhone 11 Pro + ja iPhone 11 Pro
ja
- - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro -
nl
+
nl-NL
- ru iPhone 11 Pro + ru iPhone 11 Pro
ru
- sv iPhone 11 Pro + sv iPhone 11 Pro
sv
- zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro
zh-Hans
- da iPhone 8 Plus + da iPhone 8 Plus
da
- - de iPhone 8 Plus + + de-DE iPhone 8 Plus -
de
+
de-DE
- - en iPhone 8 Plus + + en-US iPhone 8 Plus -
en
+
en-US
- - es iPhone 8 Plus + + es-ES iPhone 8 Plus -
es
+
es-ES
- - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus -
fr
+
fr-FR
- id iPhone 8 Plus + id iPhone 8 Plus
id
- it iPhone 8 Plus + it iPhone 8 Plus
it
- ja iPhone 8 Plus + ja iPhone 8 Plus
ja
- - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus -
nl
+
nl-NL
- ru iPhone 8 Plus + ru iPhone 8 Plus
ru
- sv iPhone 8 Plus + sv iPhone 8 Plus
sv
- zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus
zh-Hans
- da iPhone 8 + da iPhone 8
da
- - de iPhone 8 + + de-DE iPhone 8 -
de
+
de-DE
- - en iPhone 8 + + en-US iPhone 8 -
en
+
en-US
- - es iPhone 8 + + es-ES iPhone 8 -
es
+
es-ES
- - fr iPhone 8 + + fr-FR iPhone 8 -
fr
+
fr-FR
- id iPhone 8 + id iPhone 8
id
- it iPhone 8 + it iPhone 8
it
- ja iPhone 8 + ja iPhone 8
ja
- - nl iPhone 8 + + nl-NL iPhone 8 -
nl
+
nl-NL
- ru iPhone 8 + ru iPhone 8
ru
- sv iPhone 8 + sv iPhone 8
sv
- zh-Hans iPhone 8 + zh-Hans iPhone 8
zh-Hans
- da iPad Pro (10.5-inch) + da iPad Pro (10.5-inch)
da
- - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) -
de
+
de-DE
- - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) -
en
+
en-US
- - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) -
es
+
es-ES
- - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) -
fr
+
fr-FR
- id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch)
id
- it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch)
it
- ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch)
ja
- - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) -
nl
+
nl-NL
- ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch)
ru
- sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch)
sv
- zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch)
zh-Hans
- da iPad Pro (11-inch) (2nd generation) + da iPad Pro (11-inch) (2nd generation)
da
- - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation)
id
- it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation)
it
- ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation)
ja
- - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation)
ru
- sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation)
sv
- zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (2nd generation) + da iPad Pro (12.9-inch) (2nd generation)
da
- - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation)
id
- it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation)
it
- ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation)
ja
- - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation)
ru
- sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (3rd generation) + da iPad Pro (12.9-inch) (3rd generation)
da
- - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation)
id
- it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation)
it
- ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation)
ja
- - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation)
ru
- sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation)
zh-Hans
- da iPad Pro (9.7-inch) + da iPad Pro (9.7-inch)
da
- - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) -
de
+
de-DE
- - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) -
en
+
en-US
- - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) -
es
+
es-ES
- - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) -
fr
+
fr-FR
- id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch)
id
- it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch)
it
- ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch)
ja
- - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) -
nl
+
nl-NL
- ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch)
ru
- sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch)
sv
- zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch)
zh-Hans
+ iPhone 11 Pro Max
- da iPhone 11 Pro Max + da iPhone 11 Pro Max
da
- - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max -
de
+
de-DE
- - en iPhone 11 Pro Max + + en-US iPhone 11 Pro Max -
en
+
en-US
- - es iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max -
es
+
es-ES
- - fr iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max -
fr
+
fr-FR
+
+ + fr_FR iPhone 11 Pro Max + +
fr_FR
- id iPhone 11 Pro Max + id iPhone 11 Pro Max
id
- it iPhone 11 Pro Max + it iPhone 11 Pro Max
it
- ja iPhone 11 Pro Max + ja iPhone 11 Pro Max
ja
- - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max -
nl
+
nl-NL
- ru iPhone 11 Pro Max + ru iPhone 11 Pro Max
ru
- sv iPhone 11 Pro Max + sv iPhone 11 Pro Max
sv
- zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max
zh-Hans
- da iPhone 11 Pro + da iPhone 11 Pro
da
- - de iPhone 11 Pro + + de-DE iPhone 11 Pro -
de
+
de-DE
- - en iPhone 11 Pro + + en-US iPhone 11 Pro -
en
+
en-US
- - es iPhone 11 Pro + + es-ES iPhone 11 Pro -
es
+
es-ES
- - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro -
fr
+
fr-FR
- id iPhone 11 Pro + id iPhone 11 Pro
id
- it iPhone 11 Pro + it iPhone 11 Pro
it
- ja iPhone 11 Pro + ja iPhone 11 Pro
ja
- - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro -
nl
+
nl-NL
- ru iPhone 11 Pro + ru iPhone 11 Pro
ru
- sv iPhone 11 Pro + sv iPhone 11 Pro
sv
- zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro
zh-Hans
- da iPhone 8 Plus + da iPhone 8 Plus
da
- - de iPhone 8 Plus + + de-DE iPhone 8 Plus -
de
+
de-DE
- - en iPhone 8 Plus + + en-US iPhone 8 Plus -
en
+
en-US
- - es iPhone 8 Plus + + es-ES iPhone 8 Plus -
es
+
es-ES
- - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus -
fr
+
fr-FR
- id iPhone 8 Plus + id iPhone 8 Plus
id
- it iPhone 8 Plus + it iPhone 8 Plus
it
- ja iPhone 8 Plus + ja iPhone 8 Plus
ja
- - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus -
nl
+
nl-NL
- ru iPhone 8 Plus + ru iPhone 8 Plus
ru
- sv iPhone 8 Plus + sv iPhone 8 Plus
sv
- zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus
zh-Hans
- da iPhone 8 + da iPhone 8
da
- - de iPhone 8 + + de-DE iPhone 8 -
de
+
de-DE
- - en iPhone 8 + + en-US iPhone 8 -
en
+
en-US
- - es iPhone 8 + + es-ES iPhone 8 -
es
+
es-ES
- - fr iPhone 8 + + fr-FR iPhone 8 -
fr
+
fr-FR
- id iPhone 8 + id iPhone 8
id
- it iPhone 8 + it iPhone 8
it
- ja iPhone 8 + ja iPhone 8
ja
- - nl iPhone 8 + + nl-NL iPhone 8 -
nl
+
nl-NL
- ru iPhone 8 + ru iPhone 8
ru
- sv iPhone 8 + sv iPhone 8
sv
- zh-Hans iPhone 8 + zh-Hans iPhone 8
zh-Hans
- da iPad Pro (10.5-inch) + da iPad Pro (10.5-inch)
da
- - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) -
de
+
de-DE
- - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) -
en
+
en-US
- - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) -
es
+
es-ES
- - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) -
fr
+
fr-FR
- id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch)
id
- it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch)
it
- ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch)
ja
- - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) -
nl
+
nl-NL
- ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch)
ru
- sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch)
sv
- zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch)
zh-Hans
- da iPad Pro (11-inch) (2nd generation) + da iPad Pro (11-inch) (2nd generation)
da
- - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation)
id
- it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation)
it
- ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation)
ja
- - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation)
ru
- sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation)
sv
- zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (2nd generation) + da iPad Pro (12.9-inch) (2nd generation)
da
- - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation)
id
- it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation)
it
- ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation)
ja
- - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation)
ru
- sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (3rd generation) + da iPad Pro (12.9-inch) (3rd generation)
da
- - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation)
id
- it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation)
it
- ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation)
ja
- - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation)
ru
- sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation)
zh-Hans
- da iPad Pro (9.7-inch) + da iPad Pro (9.7-inch)
da
- - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) -
de
+
de-DE
- - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) -
en
+
en-US
- - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) -
es
+
es-ES
- - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) -
fr
+
fr-FR
- id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch)
id
- it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch)
it
- ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch)
ja
- - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) -
nl
+
nl-NL
- ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch)
ru
- sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch)
sv
- zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch)
zh-Hans
+ iPhone 11 Pro Max
- da iPhone 11 Pro Max + da iPhone 11 Pro Max
da
- - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max -
de
+
de-DE
- - en iPhone 11 Pro Max + + en-US iPhone 11 Pro Max -
en
+
en-US
- - es iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max -
es
+
es-ES
- - fr iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max -
fr
+
fr-FR
+
+ + fr_FR iPhone 11 Pro Max + +
fr_FR
- id iPhone 11 Pro Max + id iPhone 11 Pro Max
id
- it iPhone 11 Pro Max + it iPhone 11 Pro Max
it
- ja iPhone 11 Pro Max + ja iPhone 11 Pro Max
ja
- - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max -
nl
+
nl-NL
- ru iPhone 11 Pro Max + ru iPhone 11 Pro Max
ru
- sv iPhone 11 Pro Max + sv iPhone 11 Pro Max
sv
- zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max
zh-Hans
- da iPhone 11 Pro + da iPhone 11 Pro
da
- - de iPhone 11 Pro + + de-DE iPhone 11 Pro -
de
+
de-DE
- - en iPhone 11 Pro + + en-US iPhone 11 Pro -
en
+
en-US
- - es iPhone 11 Pro + + es-ES iPhone 11 Pro -
es
+
es-ES
- - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro -
fr
+
fr-FR
- id iPhone 11 Pro + id iPhone 11 Pro
id
- it iPhone 11 Pro + it iPhone 11 Pro
it
- ja iPhone 11 Pro + ja iPhone 11 Pro
ja
- - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro -
nl
+
nl-NL
- ru iPhone 11 Pro + ru iPhone 11 Pro
ru
- sv iPhone 11 Pro + sv iPhone 11 Pro
sv
- zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro
zh-Hans
- da iPhone 8 Plus + da iPhone 8 Plus
da
- - de iPhone 8 Plus + + de-DE iPhone 8 Plus -
de
+
de-DE
- - en iPhone 8 Plus + + en-US iPhone 8 Plus -
en
+
en-US
- - es iPhone 8 Plus + + es-ES iPhone 8 Plus -
es
+
es-ES
- - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus -
fr
+
fr-FR
- id iPhone 8 Plus + id iPhone 8 Plus
id
- it iPhone 8 Plus + it iPhone 8 Plus
it
- ja iPhone 8 Plus + ja iPhone 8 Plus
ja
- - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus -
nl
+
nl-NL
- ru iPhone 8 Plus + ru iPhone 8 Plus
ru
- sv iPhone 8 Plus + sv iPhone 8 Plus
sv
- zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus
zh-Hans
- da iPhone 8 + da iPhone 8
da
- - de iPhone 8 + + de-DE iPhone 8 -
de
+
de-DE
- - en iPhone 8 + + en-US iPhone 8 -
en
+
en-US
- - es iPhone 8 + + es-ES iPhone 8 -
es
+
es-ES
- - fr iPhone 8 + + fr-FR iPhone 8 -
fr
+
fr-FR
- id iPhone 8 + id iPhone 8
id
- it iPhone 8 + it iPhone 8
it
- ja iPhone 8 + ja iPhone 8
ja
- - nl iPhone 8 + + nl-NL iPhone 8 -
nl
+
nl-NL
- ru iPhone 8 + ru iPhone 8
ru
- sv iPhone 8 + sv iPhone 8
sv
- zh-Hans iPhone 8 + zh-Hans iPhone 8
zh-Hans
- da iPad Pro (10.5-inch) + da iPad Pro (10.5-inch)
da
- - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) -
de
+
de-DE
- - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) -
en
+
en-US
- - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) -
es
+
es-ES
- - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) -
fr
+
fr-FR
- id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch)
id
- it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch)
it
- ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch)
ja
- - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) -
nl
+
nl-NL
- ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch)
ru
- sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch)
sv
- zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch)
zh-Hans
- da iPad Pro (11-inch) (2nd generation) + da iPad Pro (11-inch) (2nd generation)
da
- - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation)
id
- it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation)
it
- ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation)
ja
- - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation)
ru
- sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation)
sv
- zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (2nd generation) + da iPad Pro (12.9-inch) (2nd generation)
da
- - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation)
id
- it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation)
it
- ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation)
ja
- - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation)
ru
- sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (3rd generation) + da iPad Pro (12.9-inch) (3rd generation)
da
- - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation)
id
- it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation)
it
- ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation)
ja
- - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation)
ru
- sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation)
zh-Hans
- da iPad Pro (9.7-inch) + da iPad Pro (9.7-inch)
da
- - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) -
de
+
de-DE
- - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) -
en
+
en-US
- - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) -
es
+
es-ES
- - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) -
fr
+
fr-FR
- id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch)
id
- it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch)
it
- ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch)
ja
- - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) -
nl
+
nl-NL
- ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch)
ru
- sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch)
sv
- zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch)
zh-Hans
+ iPhone 11 Pro Max
- da iPhone 11 Pro Max + da iPhone 11 Pro Max
da
- - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max + +
de-DE
+
+ + en-US iPhone 11 Pro Max -
de
+
en-US
- - en iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max -
en
+
es-ES
- - es iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max -
es
+
fr-FR
- - fr iPhone 11 Pro Max + + fr_FR iPhone 11 Pro Max -
fr
+
fr_FR
- id iPhone 11 Pro Max + id iPhone 11 Pro Max
id
- it iPhone 11 Pro Max + it iPhone 11 Pro Max
it
- ja iPhone 11 Pro Max + ja iPhone 11 Pro Max
ja
- - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max -
nl
+
nl-NL
- ru iPhone 11 Pro Max + ru iPhone 11 Pro Max
ru
- sv iPhone 11 Pro Max + sv iPhone 11 Pro Max
sv
- zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max
zh-Hans
- da iPhone 11 Pro + da iPhone 11 Pro
da
- - de iPhone 11 Pro + + de-DE iPhone 11 Pro -
de
+
de-DE
- - en iPhone 11 Pro + + en-US iPhone 11 Pro -
en
+
en-US
- - es iPhone 11 Pro + + es-ES iPhone 11 Pro -
es
+
es-ES
- - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro -
fr
+
fr-FR
- id iPhone 11 Pro + id iPhone 11 Pro
id
- it iPhone 11 Pro + it iPhone 11 Pro
it
- ja iPhone 11 Pro + ja iPhone 11 Pro
ja
- - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro -
nl
+
nl-NL
- ru iPhone 11 Pro + ru iPhone 11 Pro
ru
- sv iPhone 11 Pro + sv iPhone 11 Pro
sv
- zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro
zh-Hans
- da iPhone 8 Plus + da iPhone 8 Plus
da
- - de iPhone 8 Plus + + de-DE iPhone 8 Plus -
de
+
de-DE
- - en iPhone 8 Plus + + en-US iPhone 8 Plus -
en
+
en-US
- - es iPhone 8 Plus + + es-ES iPhone 8 Plus -
es
+
es-ES
- - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus -
fr
+
fr-FR
- id iPhone 8 Plus + id iPhone 8 Plus
id
- it iPhone 8 Plus + it iPhone 8 Plus
it
- ja iPhone 8 Plus + ja iPhone 8 Plus
ja
- - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus -
nl
+
nl-NL
- ru iPhone 8 Plus + ru iPhone 8 Plus
ru
- sv iPhone 8 Plus + sv iPhone 8 Plus
sv
- zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus
zh-Hans
- da iPhone 8 + da iPhone 8
da
- - de iPhone 8 + + de-DE iPhone 8 -
de
+
de-DE
- - en iPhone 8 + + en-US iPhone 8 -
en
+
en-US
- - es iPhone 8 + + es-ES iPhone 8 -
es
+
es-ES
- - fr iPhone 8 + + fr-FR iPhone 8 -
fr
+
fr-FR
- id iPhone 8 + id iPhone 8
id
- it iPhone 8 + it iPhone 8
it
- ja iPhone 8 + ja iPhone 8
ja
- - nl iPhone 8 + + nl-NL iPhone 8 -
nl
+
nl-NL
- ru iPhone 8 + ru iPhone 8
ru
- sv iPhone 8 + sv iPhone 8
sv
- zh-Hans iPhone 8 + zh-Hans iPhone 8
zh-Hans
- da iPad Pro (10.5-inch) + da iPad Pro (10.5-inch)
da
- - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) -
de
+
de-DE
- - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) -
en
+
en-US
- - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) -
es
+
es-ES
- - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) -
fr
+
fr-FR
- id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch)
id
- it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch)
it
- ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch)
ja
- - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) -
nl
+
nl-NL
- ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch)
ru
- sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch)
sv
- zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch)
zh-Hans
- da iPad Pro (11-inch) (2nd generation) + da iPad Pro (11-inch) (2nd generation)
da
- - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation)
id
- it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation)
it
- ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation)
ja
- - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation)
ru
- sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation)
sv
- zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (2nd generation) + da iPad Pro (12.9-inch) (2nd generation)
da
- - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation)
id
- it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation)
it
- ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation)
ja
- - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation)
ru
- sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (3rd generation) + da iPad Pro (12.9-inch) (3rd generation)
da
- - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation)
id
- it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation)
it
- ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation)
ja
- - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation)
ru
- sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation)
zh-Hans
- da iPad Pro (9.7-inch) + da iPad Pro (9.7-inch)
da
- - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) -
de
+
de-DE
- - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) -
en
+
en-US
- - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) -
es
+
es-ES
- - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) -
fr
+
fr-FR
- id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch)
id
- it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch)
it
- ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch)
ja
- - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) -
nl
+
nl-NL
- ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch)
ru
- sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch)
sv
- zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch)
zh-Hans
+ iPhone 11 Pro Max
- da iPhone 11 Pro Max + da iPhone 11 Pro Max
da
- - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max -
de
+
de-DE
- - en iPhone 11 Pro Max + + en-US iPhone 11 Pro Max -
en
+
en-US
- - es iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max -
es
+
es-ES
- - fr iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max -
fr
+
fr-FR
+
+ + fr_FR iPhone 11 Pro Max + +
fr_FR
- id iPhone 11 Pro Max + id iPhone 11 Pro Max
id
- it iPhone 11 Pro Max + it iPhone 11 Pro Max
it
- ja iPhone 11 Pro Max + ja iPhone 11 Pro Max
ja
- - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max -
nl
+
nl-NL
- ru iPhone 11 Pro Max + ru iPhone 11 Pro Max
ru
- sv iPhone 11 Pro Max + sv iPhone 11 Pro Max
sv
- zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max
zh-Hans
- da iPhone 11 Pro + da iPhone 11 Pro
da
- - de iPhone 11 Pro + + de-DE iPhone 11 Pro -
de
+
de-DE
- - en iPhone 11 Pro + + en-US iPhone 11 Pro -
en
+
en-US
- - es iPhone 11 Pro + + es-ES iPhone 11 Pro -
es
+
es-ES
- - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro -
fr
+
fr-FR
- id iPhone 11 Pro + id iPhone 11 Pro
id
- it iPhone 11 Pro + it iPhone 11 Pro
it
- ja iPhone 11 Pro + ja iPhone 11 Pro
ja
- - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro -
nl
+
nl-NL
- ru iPhone 11 Pro + ru iPhone 11 Pro
ru
- sv iPhone 11 Pro + sv iPhone 11 Pro
sv
- zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro
zh-Hans
- da iPhone 8 Plus + da iPhone 8 Plus
da
- - de iPhone 8 Plus + + de-DE iPhone 8 Plus -
de
+
de-DE
- - en iPhone 8 Plus + + en-US iPhone 8 Plus -
en
+
en-US
- - es iPhone 8 Plus + + es-ES iPhone 8 Plus -
es
+
es-ES
- - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus -
fr
+
fr-FR
- id iPhone 8 Plus + id iPhone 8 Plus
id
- it iPhone 8 Plus + it iPhone 8 Plus
it
- ja iPhone 8 Plus + ja iPhone 8 Plus
ja
- - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus -
nl
+
nl-NL
- ru iPhone 8 Plus + ru iPhone 8 Plus
ru
- sv iPhone 8 Plus + sv iPhone 8 Plus
sv
- zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus
zh-Hans
- da iPhone 8 + da iPhone 8
da
- - de iPhone 8 + + de-DE iPhone 8 -
de
+
de-DE
- - en iPhone 8 + + en-US iPhone 8 -
en
+
en-US
- - es iPhone 8 + + es-ES iPhone 8 -
es
+
es-ES
- - fr iPhone 8 + + fr-FR iPhone 8 -
fr
+
fr-FR
- id iPhone 8 + id iPhone 8
id
- it iPhone 8 + it iPhone 8
it
- ja iPhone 8 + ja iPhone 8
ja
- - nl iPhone 8 + + nl-NL iPhone 8 -
nl
+
nl-NL
- ru iPhone 8 + ru iPhone 8
ru
- sv iPhone 8 + sv iPhone 8
sv
- zh-Hans iPhone 8 + zh-Hans iPhone 8
zh-Hans
- da iPad Pro (10.5-inch) + da iPad Pro (10.5-inch)
da
- - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) -
de
+
de-DE
- - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) -
en
+
en-US
- - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) -
es
+
es-ES
- - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) -
fr
+
fr-FR
- id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch)
id
- it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch)
it
- ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch)
ja
- - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) -
nl
+
nl-NL
- ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch)
ru
- sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch)
sv
- zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch)
zh-Hans
- da iPad Pro (11-inch) (2nd generation) + da iPad Pro (11-inch) (2nd generation)
da
- - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation)
id
- it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation)
it
- ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation)
ja
- - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation)
ru
- sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation)
sv
- zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (2nd generation) + da iPad Pro (12.9-inch) (2nd generation)
da
- - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation)
id
- it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation)
it
- ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation)
ja
- - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation)
ru
- sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (3rd generation) + da iPad Pro (12.9-inch) (3rd generation)
da
- - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation)
id
- it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation)
it
- ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation)
ja
- - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation)
ru
- sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation)
zh-Hans
- da iPad Pro (9.7-inch) + da iPad Pro (9.7-inch)
da
- - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) -
de
+
de-DE
- - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) -
en
+
en-US
- - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) -
es
+
es-ES
- - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) -
fr
+
fr-FR
- id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch)
id
- it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch)
it
- ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch)
ja
- - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) -
nl
+
nl-NL
- ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch)
ru
- sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch)
sv
- zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch)
zh-Hans
+ iPhone 11 Pro Max
- da iPhone 11 Pro Max + da iPhone 11 Pro Max
da
- - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max + +
de-DE
+
+ + en-US iPhone 11 Pro Max -
de
+
en-US
- - en iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max -
en
+
es-ES
- - es iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max -
es
+
fr-FR
- - fr iPhone 11 Pro Max + + fr_FR iPhone 11 Pro Max -
fr
+
fr_FR
- id iPhone 11 Pro Max + id iPhone 11 Pro Max
id
- it iPhone 11 Pro Max + it iPhone 11 Pro Max
it
- ja iPhone 11 Pro Max + ja iPhone 11 Pro Max
ja
- - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max -
nl
+
nl-NL
- ru iPhone 11 Pro Max + ru iPhone 11 Pro Max
ru
- sv iPhone 11 Pro Max + sv iPhone 11 Pro Max
sv
- zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max
zh-Hans
- da iPhone 11 Pro + da iPhone 11 Pro
da
- - de iPhone 11 Pro + + de-DE iPhone 11 Pro -
de
+
de-DE
- - en iPhone 11 Pro + + en-US iPhone 11 Pro -
en
+
en-US
- - es iPhone 11 Pro + + es-ES iPhone 11 Pro -
es
+
es-ES
- - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro -
fr
+
fr-FR
- id iPhone 11 Pro + id iPhone 11 Pro
id
- it iPhone 11 Pro + it iPhone 11 Pro
it
- ja iPhone 11 Pro + ja iPhone 11 Pro
ja
- - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro -
nl
+
nl-NL
- ru iPhone 11 Pro + ru iPhone 11 Pro
ru
- sv iPhone 11 Pro + sv iPhone 11 Pro
sv
- zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro
zh-Hans
- da iPhone 8 Plus + da iPhone 8 Plus
da
- - de iPhone 8 Plus + + de-DE iPhone 8 Plus -
de
+
de-DE
- - en iPhone 8 Plus + + en-US iPhone 8 Plus -
en
+
en-US
- - es iPhone 8 Plus + + es-ES iPhone 8 Plus -
es
+
es-ES
- - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus -
fr
+
fr-FR
- id iPhone 8 Plus + id iPhone 8 Plus
id
- it iPhone 8 Plus + it iPhone 8 Plus
it
- ja iPhone 8 Plus + ja iPhone 8 Plus
ja
- - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus -
nl
+
nl-NL
- ru iPhone 8 Plus + ru iPhone 8 Plus
ru
- sv iPhone 8 Plus + sv iPhone 8 Plus
sv
- zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus
zh-Hans
- da iPhone 8 + da iPhone 8
da
- - de iPhone 8 + + de-DE iPhone 8 -
de
+
de-DE
- - en iPhone 8 + + en-US iPhone 8 -
en
+
en-US
- - es iPhone 8 + + es-ES iPhone 8 -
es
+
es-ES
- - fr iPhone 8 + + fr-FR iPhone 8 -
fr
+
fr-FR
- id iPhone 8 + id iPhone 8
id
- it iPhone 8 + it iPhone 8
it
- ja iPhone 8 + ja iPhone 8
ja
- - nl iPhone 8 + + nl-NL iPhone 8 -
nl
+
nl-NL
- ru iPhone 8 + ru iPhone 8
ru
- sv iPhone 8 + sv iPhone 8
sv
- zh-Hans iPhone 8 + zh-Hans iPhone 8
zh-Hans
- da iPad Pro (10.5-inch) + da iPad Pro (10.5-inch)
da
- - de iPad Pro (10.5-inch) + + de-DE iPad Pro (10.5-inch) -
de
+
de-DE
- - en iPad Pro (10.5-inch) + + en-US iPad Pro (10.5-inch) -
en
+
en-US
- - es iPad Pro (10.5-inch) + + es-ES iPad Pro (10.5-inch) -
es
+
es-ES
- - fr iPad Pro (10.5-inch) + + fr-FR iPad Pro (10.5-inch) -
fr
+
fr-FR
- id iPad Pro (10.5-inch) + id iPad Pro (10.5-inch)
id
- it iPad Pro (10.5-inch) + it iPad Pro (10.5-inch)
it
- ja iPad Pro (10.5-inch) + ja iPad Pro (10.5-inch)
ja
- - nl iPad Pro (10.5-inch) + + nl-NL iPad Pro (10.5-inch) -
nl
+
nl-NL
- ru iPad Pro (10.5-inch) + ru iPad Pro (10.5-inch)
ru
- sv iPad Pro (10.5-inch) + sv iPad Pro (10.5-inch)
sv
- zh-Hans iPad Pro (10.5-inch) + zh-Hans iPad Pro (10.5-inch)
zh-Hans
- da iPad Pro (11-inch) (2nd generation) + da iPad Pro (11-inch) (2nd generation)
da
- - de iPad Pro (11-inch) (2nd generation) + + de-DE iPad Pro (11-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (11-inch) (2nd generation) + + en-US iPad Pro (11-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (11-inch) (2nd generation) + + es-ES iPad Pro (11-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (11-inch) (2nd generation) + + fr-FR iPad Pro (11-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (11-inch) (2nd generation) + id iPad Pro (11-inch) (2nd generation)
id
- it iPad Pro (11-inch) (2nd generation) + it iPad Pro (11-inch) (2nd generation)
it
- ja iPad Pro (11-inch) (2nd generation) + ja iPad Pro (11-inch) (2nd generation)
ja
- - nl iPad Pro (11-inch) (2nd generation) + + nl-NL iPad Pro (11-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (11-inch) (2nd generation) + ru iPad Pro (11-inch) (2nd generation)
ru
- sv iPad Pro (11-inch) (2nd generation) + sv iPad Pro (11-inch) (2nd generation)
sv
- zh-Hans iPad Pro (11-inch) (2nd generation) + zh-Hans iPad Pro (11-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (2nd generation) + da iPad Pro (12.9-inch) (2nd generation)
da
- - de iPad Pro (12.9-inch) (2nd generation) + + de-DE iPad Pro (12.9-inch) (2nd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (2nd generation) + + en-US iPad Pro (12.9-inch) (2nd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (2nd generation) + + es-ES iPad Pro (12.9-inch) (2nd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (2nd generation) + + fr-FR iPad Pro (12.9-inch) (2nd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (2nd generation) + id iPad Pro (12.9-inch) (2nd generation)
id
- it iPad Pro (12.9-inch) (2nd generation) + it iPad Pro (12.9-inch) (2nd generation)
it
- ja iPad Pro (12.9-inch) (2nd generation) + ja iPad Pro (12.9-inch) (2nd generation)
ja
- - nl iPad Pro (12.9-inch) (2nd generation) + + nl-NL iPad Pro (12.9-inch) (2nd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (2nd generation) + ru iPad Pro (12.9-inch) (2nd generation)
ru
- sv iPad Pro (12.9-inch) (2nd generation) + sv iPad Pro (12.9-inch) (2nd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (2nd generation) + zh-Hans iPad Pro (12.9-inch) (2nd generation)
zh-Hans
- da iPad Pro (12.9-inch) (3rd generation) + da iPad Pro (12.9-inch) (3rd generation)
da
- - de iPad Pro (12.9-inch) (3rd generation) + + de-DE iPad Pro (12.9-inch) (3rd generation) -
de
+
de-DE
- - en iPad Pro (12.9-inch) (3rd generation) + + en-US iPad Pro (12.9-inch) (3rd generation) -
en
+
en-US
- - es iPad Pro (12.9-inch) (3rd generation) + + es-ES iPad Pro (12.9-inch) (3rd generation) -
es
+
es-ES
- - fr iPad Pro (12.9-inch) (3rd generation) + + fr-FR iPad Pro (12.9-inch) (3rd generation) -
fr
+
fr-FR
- id iPad Pro (12.9-inch) (3rd generation) + id iPad Pro (12.9-inch) (3rd generation)
id
- it iPad Pro (12.9-inch) (3rd generation) + it iPad Pro (12.9-inch) (3rd generation)
it
- ja iPad Pro (12.9-inch) (3rd generation) + ja iPad Pro (12.9-inch) (3rd generation)
ja
- - nl iPad Pro (12.9-inch) (3rd generation) + + nl-NL iPad Pro (12.9-inch) (3rd generation) -
nl
+
nl-NL
- ru iPad Pro (12.9-inch) (3rd generation) + ru iPad Pro (12.9-inch) (3rd generation)
ru
- sv iPad Pro (12.9-inch) (3rd generation) + sv iPad Pro (12.9-inch) (3rd generation)
sv
- zh-Hans iPad Pro (12.9-inch) (3rd generation) + zh-Hans iPad Pro (12.9-inch) (3rd generation)
zh-Hans
- da iPad Pro (9.7-inch) + da iPad Pro (9.7-inch)
da
- - de iPad Pro (9.7-inch) + + de-DE iPad Pro (9.7-inch) -
de
+
de-DE
- - en iPad Pro (9.7-inch) + + en-US iPad Pro (9.7-inch) -
en
+
en-US
- - es iPad Pro (9.7-inch) + + es-ES iPad Pro (9.7-inch) -
es
+
es-ES
- - fr iPad Pro (9.7-inch) + + fr-FR iPad Pro (9.7-inch) -
fr
+
fr-FR
- id iPad Pro (9.7-inch) + id iPad Pro (9.7-inch)
id
- it iPad Pro (9.7-inch) + it iPad Pro (9.7-inch)
it
- ja iPad Pro (9.7-inch) + ja iPad Pro (9.7-inch)
ja
- - nl iPad Pro (9.7-inch) + + nl-NL iPad Pro (9.7-inch) -
nl
+
nl-NL
- ru iPad Pro (9.7-inch) + ru iPad Pro (9.7-inch)
ru
- sv iPad Pro (9.7-inch) + sv iPad Pro (9.7-inch)
sv
- zh-Hans iPad Pro (9.7-inch) + zh-Hans iPad Pro (9.7-inch)
zh-Hans
+ iPhone 11 Pro Max
- da iPhone 11 Pro Max + da iPhone 11 Pro Max
da
- - de iPhone 11 Pro Max + + de-DE iPhone 11 Pro Max + +
de-DE
+
+ + en-US iPhone 11 Pro Max -
de
+
en-US
- - en iPhone 11 Pro Max + + es-ES iPhone 11 Pro Max -
en
+
es-ES
- - es iPhone 11 Pro Max + + fr-FR iPhone 11 Pro Max -
es
+
fr-FR
- - fr iPhone 11 Pro Max + + fr_FR iPhone 11 Pro Max -
fr
+
fr_FR
- id iPhone 11 Pro Max + id iPhone 11 Pro Max
id
- it iPhone 11 Pro Max + it iPhone 11 Pro Max
it
- ja iPhone 11 Pro Max + ja iPhone 11 Pro Max
ja
- - nl iPhone 11 Pro Max + + nl-NL iPhone 11 Pro Max -
nl
+
nl-NL
- ru iPhone 11 Pro Max + ru iPhone 11 Pro Max
ru
- sv iPhone 11 Pro Max + sv iPhone 11 Pro Max
sv
- zh-Hans iPhone 11 Pro Max + zh-Hans iPhone 11 Pro Max
zh-Hans
- da iPhone 11 Pro + da iPhone 11 Pro
da
- - de iPhone 11 Pro + + de-DE iPhone 11 Pro -
de
+
de-DE
- - en iPhone 11 Pro + + en-US iPhone 11 Pro -
en
+
en-US
- - es iPhone 11 Pro + + es-ES iPhone 11 Pro -
es
+
es-ES
- - fr iPhone 11 Pro + + fr-FR iPhone 11 Pro -
fr
+
fr-FR
- id iPhone 11 Pro + id iPhone 11 Pro
id
- it iPhone 11 Pro + it iPhone 11 Pro
it
- ja iPhone 11 Pro + ja iPhone 11 Pro
ja
- - nl iPhone 11 Pro + + nl-NL iPhone 11 Pro -
nl
+
nl-NL
- ru iPhone 11 Pro + ru iPhone 11 Pro
ru
- sv iPhone 11 Pro + sv iPhone 11 Pro
sv
- zh-Hans iPhone 11 Pro + zh-Hans iPhone 11 Pro
zh-Hans
- da iPhone 8 Plus + da iPhone 8 Plus
da
- - de iPhone 8 Plus + + de-DE iPhone 8 Plus -
de
+
de-DE
- - en iPhone 8 Plus + + en-US iPhone 8 Plus -
en
+
en-US
- - es iPhone 8 Plus + + es-ES iPhone 8 Plus -
es
+
es-ES
- - fr iPhone 8 Plus + + fr-FR iPhone 8 Plus -
fr
+
fr-FR
- id iPhone 8 Plus + id iPhone 8 Plus
id
- it iPhone 8 Plus + it iPhone 8 Plus
it
- ja iPhone 8 Plus + ja iPhone 8 Plus
ja
- - nl iPhone 8 Plus + + nl-NL iPhone 8 Plus -
nl
+
nl-NL
- ru iPhone 8 Plus + ru iPhone 8 Plus
ru
- sv iPhone 8 Plus + sv iPhone 8 Plus
sv
- zh-Hans iPhone 8 Plus + zh-Hans iPhone 8 Plus
zh-Hans
- da iPhone 8 + da iPhone 8
da
- - de iPhone 8 + + de-DE iPhone 8 -
de
+
de-DE
- - en iPhone 8 + + en-US iPhone 8 -
en
+
en-US
- - es iPhone 8 + + es-ES iPhone 8 -
es
+
es-ES
- - fr iPhone 8 + + fr-FR iPhone 8 -
fr
+
fr-FR
- id iPhone 8 + id iPhone 8
id
- it iPhone 8 + it iPhone 8
it
- ja iPhone 8 + ja iPhone 8
ja
- - nl iPhone 8 + + nl-NL iPhone 8 -
nl
+
nl-NL
- ru iPhone 8 + ru iPhone 8
ru
- sv iPhone 8 + sv iPhone 8
sv
- zh-Hans iPhone 8 + zh-Hans iPhone 8
zh-Hans
- da iPhone SE + da iPhone SE
da
- - de iPhone SE + + de-DE iPhone SE -
de
+
de-DE
- - en iPhone SE + + en-US iPhone SE -
en
+
en-US
- - es iPhone SE + + es-ES iPhone SE -
es
+
es-ES
- - fr iPhone SE + + fr-FR iPhone SE -
fr
+
fr-FR
- id iPhone SE + id iPhone SE
id
- it iPhone SE + it iPhone SE
it
- ja iPhone SE + ja iPhone SE
ja
- - nl iPhone SE + + nl-NL iPhone SE -
nl
+
nl-NL
- ru iPhone SE + ru iPhone SE
ru
- sv iPhone SE + sv iPhone SE
sv
- zh-Hans iPhone SE + zh-Hans iPhone SE
zh-Hans
- da iPhone SE + da iPhone SE
da
- - de iPhone SE + + de-DE iPhone SE -
de
+
de-DE
- - en iPhone SE + + en-US iPhone SE -
en
+
en-US
- - es iPhone SE + + es-ES iPhone SE -
es
+
es-ES
- - fr iPhone SE + + fr-FR iPhone SE -
fr
+
fr-FR
- id iPhone SE + id iPhone SE
id
- it iPhone SE + it iPhone SE
it
- ja iPhone SE + ja iPhone SE
ja
- - nl iPhone SE + + nl-NL iPhone SE -
nl
+
nl-NL
- ru iPhone SE + ru iPhone SE
ru
- sv iPhone SE + sv iPhone SE
sv
- zh-Hans iPhone SE + zh-Hans iPhone SE
zh-Hans
- da iPhone SE + da iPhone SE
da
- - de iPhone SE + + de-DE iPhone SE -
de
+
de-DE
- - en iPhone SE + + en-US iPhone SE -
en
+
en-US
- - es iPhone SE + + es-ES iPhone SE -
es
+
es-ES
- - fr iPhone SE + + fr-FR iPhone SE -
fr
+
fr-FR
- id iPhone SE + id iPhone SE
id
- it iPhone SE + it iPhone SE
it
- ja iPhone SE + ja iPhone SE
ja
- - nl iPhone SE + + nl-NL iPhone SE -
nl
+
nl-NL
- ru iPhone SE + ru iPhone SE
ru
- sv iPhone SE + sv iPhone SE
sv
- zh-Hans iPhone SE + zh-Hans iPhone SE
zh-Hans
- da iPhone SE + da iPhone SE
da
- - de iPhone SE + + de-DE iPhone SE -
de
+
de-DE
- - en iPhone SE + + en-US iPhone SE -
en
+
en-US
- - es iPhone SE + + es-ES iPhone SE -
es
+
es-ES
- - fr iPhone SE + + fr-FR iPhone SE -
fr
+
fr-FR
- id iPhone SE + id iPhone SE
id
- it iPhone SE + it iPhone SE
it
- ja iPhone SE + ja iPhone SE
ja
- - nl iPhone SE + + nl-NL iPhone SE -
nl
+
nl-NL
- ru iPhone SE + ru iPhone SE
ru
- sv iPhone SE + sv iPhone SE
sv
- zh-Hans iPhone SE + zh-Hans iPhone SE
zh-Hans
- da iPhone SE + da iPhone SE
da
- - de iPhone SE + + de-DE iPhone SE -
de
+
de-DE
- - en iPhone SE + + en-US iPhone SE -
en
+
en-US
- - es iPhone SE + + es-ES iPhone SE -
es
+
es-ES
- - fr iPhone SE + + fr-FR iPhone SE -
fr
+
fr-FR
- id iPhone SE + id iPhone SE
id
- it iPhone SE + it iPhone SE
it
- ja iPhone SE + ja iPhone SE
ja
- - nl iPhone SE + + nl-NL iPhone SE -
nl
+
nl-NL
- ru iPhone SE + ru iPhone SE
ru
- sv iPhone SE + sv iPhone SE
sv
- zh-Hans iPhone SE + zh-Hans iPhone SE
zh-Hans
- da iPhone SE + da iPhone SE
da
- - de iPhone SE + + de-DE iPhone SE -
de
+
de-DE
- - en iPhone SE + + en-US iPhone SE -
en
+
en-US
- - es iPhone SE + + es-ES iPhone SE -
es
+
es-ES
- - fr iPhone SE + + fr-FR iPhone SE -
fr
+
fr-FR
- id iPhone SE + id iPhone SE
id
- it iPhone SE + it iPhone SE
it
- ja iPhone SE + ja iPhone SE
ja
- - nl iPhone SE + + nl-NL iPhone SE -
nl
+
nl-NL
- ru iPhone SE + ru iPhone SE
ru
- sv iPhone SE + sv iPhone SE
sv
- zh-Hans iPhone SE + zh-Hans iPhone SE
zh-Hans
- da iPhone SE + da iPhone SE
da
- - de iPhone SE + + de-DE iPhone SE -
de
+
de-DE
- - en iPhone SE + + en-US iPhone SE -
en
+
en-US
- - es iPhone SE + + es-ES iPhone SE -
es
+
es-ES
- - fr iPhone SE + + fr-FR iPhone SE -
fr
+
fr-FR
- id iPhone SE + id iPhone SE
id
- it iPhone SE + it iPhone SE
it
- ja iPhone SE + ja iPhone SE
ja
- - nl iPhone SE + + nl-NL iPhone SE -
nl
+
nl-NL
- ru iPhone SE + ru iPhone SE
ru
- sv iPhone SE + sv iPhone SE
sv
- zh-Hans iPhone SE + zh-Hans iPhone SE
zh-Hans
- da iPhone SE + da iPhone SE
da
- - de iPhone SE + + de-DE iPhone SE -
de
+
de-DE
- - en iPhone SE + + en-US iPhone SE -
en
+
en-US
- - es iPhone SE + + es-ES iPhone SE -
es
+
es-ES
- - fr iPhone SE + + fr-FR iPhone SE -
fr
+
fr-FR
- id iPhone SE + id iPhone SE
id
- it iPhone SE + it iPhone SE
it
- ja iPhone SE + ja iPhone SE
ja
- - nl iPhone SE + + nl-NL iPhone SE -
nl
+
nl-NL
- ru iPhone SE + ru iPhone SE
ru
- sv iPhone SE + sv iPhone SE
sv
- zh-Hans iPhone SE + zh-Hans iPhone SE
zh-Hans
- da iPhone SE + da iPhone SE
da
- - de iPhone SE + + de-DE iPhone SE -
de
+
de-DE
- - en iPhone SE + + en-US iPhone SE -
en
+
en-US
- - es iPhone SE + + es-ES iPhone SE -
es
+
es-ES
- - fr iPhone SE + + fr-FR iPhone SE -
fr
+
fr-FR
- id iPhone SE + id iPhone SE
id
- it iPhone SE + it iPhone SE
it
- ja iPhone SE + ja iPhone SE
ja
- - nl iPhone SE + + nl-NL iPhone SE -
nl
+
nl-NL
- ru iPhone SE + ru iPhone SE
ru
- sv iPhone SE + sv iPhone SE
sv
- zh-Hans iPhone SE + zh-Hans iPhone SE
zh-Hans
- da iPhone SE + da iPhone SE
da
- - de iPhone SE + + de-DE iPhone SE -
de
+
de-DE
- - en iPhone SE + + en-US iPhone SE -
en
+
en-US
- - es iPhone SE + + es-ES iPhone SE -
es
+
es-ES
- - fr iPhone SE + + fr-FR iPhone SE -
fr
+
fr-FR
- id iPhone SE + id iPhone SE
id
- it iPhone SE + it iPhone SE
it
- ja iPhone SE + ja iPhone SE
ja
- - nl iPhone SE + + nl-NL iPhone SE -
nl
+
nl-NL
- ru iPhone SE + ru iPhone SE
ru
- sv iPhone SE + sv iPhone SE
sv
- zh-Hans iPhone SE + zh-Hans iPhone SE
zh-Hans