📱The official Wikipedia iOS app.


Wikipedia iOS

The official Wikipedia iOS app.

Wikipedia MIT license

Note: The latest main branch is set up to build with Xcode 12.

Building and Running

In the directory, run ./scripts/setup. Note: going to scripts directory and running setup will not work due to relative paths.

Running scripts/setup will setup your computer to build and run the app. The script assumes you have Xcode installed already. It will install homebrew and ClangFormat. It will also create a pre-commit hook that uses ClangFormat for linting.

After running scripts/setup, you should be able to open Wikipedia.xcodeproj and run the app on the iOS Simulator (using the Wikipedia scheme and target). If you encounter any issues, please don't hesitate to let us know via a bug report or messaging us on IRC in #wikimedia-mobile on Freenode.

Required dependencies

If you'd rather install the development prerequisites yourself without our script:

  • Xcode - The easiest way to get Xcode is from the App Store, but you can also download it from developer.apple.com if you have an AppleID registered with an Apple Developer account.
  • ClangFormat - We use this for linting


Covered in the contributing document.

Development Guidelines

These are general guidelines rather than hard rules.




We use Xcode's default 4 space indentation and our .clang-format file with the pre-commit hook setup by scripts/setup. Currently, this does not enforce Swift formatting.

Process and code review norms

Covered in the process document.


When reading logs, note that the log levels are shortened to emoji.

  • 🗣️ Verbose
  • 💬 Debug
  • ℹ️ Info
  • ⚠️ Warning
  • 🚨 Error


The Wikipedia scheme is configured to execute the project's iOS unit tests, which can be run using the Cmd+U hotkey or the Product->Test menu bar action. Screenshot tests will fail unless you are running on one of the configurations defined by configurations_to_test_on_pull in fastlane/Fastfile. In order for the tests to pass, the test device's language and region must be set to en-US in Settings > General > Language & Region. There is a ticket filed to update the tests to pass regardless of region and language.



Points to production servers.


Points to the Apps team's staging environment for page content and production for everything else. Has additional debugging menus and is pushed to TestFlight as a separate app bundle.

Local Page Content Service and Announcements

Points to the mobileapps and wikifeeds repos running locally.

MediaWiki Beta Cluster

Points to the MediaWiki beta cluster for MediaWiki API calls and production for everything else.


Launches the app in an RTL locale using the -AppleLocale argument.


For one off builds, can point to whatever is needed for the given experiment.

User Testing

For user testing. Has an alternate configuration so that it can be delivered ad hoc.

Event Logging Dev Debug

For testing the events that the app sends to Event Logging. Points to the Event Logging staging environment.

Beta Cluster tests

Tests that run against the MediaWiki beta cluster, checking for upstream changes to MediaWiki that might break any assumptions we have.


Runs automated screenshot tests.


Bundles up the app logic shared between the main app and the extensions (widgets, notifications).

Updating localizations

Covered in the localization document.

Adding new Wikipedia languages or updating language configurations

Covered in the languages document.

{{name}}Widget, {{name}}Notification, {{name}}Stickers

Extensions for widgets, notifications, and stickers.


Generates the CodeMirror configuration files. CodeMirror is used in the section editor.

Continuous integration

Covered in the ci document.

Event logging

Covered in the event logging document.

Web development

The article view and several other components of the app rely on web components. Instructions for working on these components is covered in the web development document.

Contact us

If you have any questions or comments, you can email us at mobile-ios-wikipedia[at]wikimedia dot org. We'll also gladly accept any bug reports.

  • Banners


    Covers: https://phabricator.wikimedia.org/T97786 https://phabricator.wikimedia.org/T118350

    Adding TSMessages pod for the banner logic. This is managed by a WMFAlertManager.

    • [x] Need real assets
    • [x] Fine tune the styling
    opened by coreyfloyd 29
  • Adding welcome on boarding

    Adding welcome on boarding

    Adds welcome screens

    This includes:

    • a container welcome VC that transitions between each welcome page
    • a welcome page listing new items
    • a welcome page for picking languages that allows re-ordering and deletion
    • a welcome page for enabling analytics/crash reporting

    For preferred language reordering and forthcoming deletion, the language classes were refactored:

    • LanguagelinkController now manages OS languages and preferred languages
    • An MWKLanguageFilter was extracted to handle filtering
    • An MWKTitleLanguageController was extracted to handle languages for specific articles.
    • The Language picker was refactored to allow the hiding of preferred languages

    Other small refactors song the way.

    opened by coreyfloyd 25
  • Update Share-a-fact card design

    Update Share-a-fact card design


    opened by joewalsh 24
  • More CSS updates

    More CSS updates

    Summary of commits:

    The first updates the bundled CSS from production;

    The second switches CSS loading to MW-Vagrant and pulls in the new styles about to be deployed to hide the (listen) parenthetical in IPA spans, and makes some other changes to the request params for correctness (with no current effect);

    The third removes styles that are no longer needed;

    The fourth removes the bundled legacy enwiki.less styles and adds support for loading the current MediaWiki:Mobile.css from ResourceLoader as mobile.site;

    The fifth cleans up by switching default CSS loading back to production.

    Note that the third and fourth are based on MobileApp extension patches currently awaiting review. Reviews on those in time to make this week's MediaWiki train deployment (i.e., by ~18:00 UTC Tuesday) are very welcome!

    opened by mdholloway 24
  • Add share to tool bar

    Add share to tool bar

    Most of this ended up being a refactor to get most of the sharing logic in the same place.

    Basically all sharing logic is now in the WMFShareOptionsController (which is no longer a view controller, because it want being used as one anyways)

    WMFShareOptionsController has also been refactored to no longer require a delegate.

    The share funnel has also pretty much been moved inside of the share options controller - EXCEPT - there is some logging that can't be moved (it involves selection of text in the webview) - so that object is passed to the options controller on initialization.

    (In case you were wondering, we can't move to using the UIAlertController - because you can't customize it to add images)

    While I was in there: I moved auto layout to masonry Made the options menu fill the width of the screen I fixed the display / dismiss animation to look native Added the camera roll as an option for output (https://phabricator.wikimedia.org/T37764) Did some minor clean up of the web view controller in regards to singleton references

    opened by coreyfloyd 23
  • T117474: Status bar white background

    T117474: Status bar white background

    Note: feel free to close this PR if the method used here is shabby

    • Added a background view with bottom border as a subview of presentation view
    • hiding the view on landscape mode
    • removing the view on completion
    • changed the background view tint from white to black

    Bug: https://phabricator.wikimedia.org/T117474

    opened by nirzar 22
  • Remove MWKTitle and MWKSite

    Remove MWKTitle and MWKSite

    This pr removes all references to MWKSite and MWKTitle in favor of the new NSURL methods.

    • [x] Replace all references to MWKTitle and MWKSite
    • [x] Handle deserialization of Saved pages
    • [x] Handle deserialization of history
    • [x] Update Unit Tests
    • [x] Update and verify deserialization of all former persisted classes
    • [x] Rename all "domainURL" references to "siteURL"
    • [x] File separate ticket to re-enable saved page fetcher tests

    Out of scope for this PR:

    • Any refactoring of logic that is now duplicative due to NSURLs being used for both title and site (refactoring such as this should be performed while boyscouting during normal development)
    • Preserving the persisted feed data (The feed model will be completely changed during the feed refactor)
    opened by coreyfloyd 22
  • Implement gallery POTD in Home view

    Implement gallery POTD in Home view

    Phab: T119669, T119903

    • [x] refactor galleries
      • [x] base gallery (RTL handling + data source property)
      • [x] article header gallery (basic data source for article images)
      • [x] modal article gallery (modal data source for article images + info)
      • [x] modal POTD gallery (modal data source for POTD images + info)
    • [x] tap POTD to view in gallery
    • [x] peek POTD to view in gallery
    • [x] fetch "medium" POTD image w/ desc for home view
    • [x] fetch "large" POTD image w/ all info for modal gallery
    • [x] extra credit add older POTDs in gallery

    regression tests: (see Phab tasks for dev testing notes)

    What's New

    Image gallery VC & data source architecture

    See header comments in:

    • WMFModalImageGalleryViewController: formerly known as WMFImageGalleryViewController, which is now more dependent on its data sources (i.e. no longer fetches image info).
    • WMFImageGalleryDataSource: and its "big brother,"WMFModalImageGalleryDataSource are the interface through which domain-specific data can be displayed in the image gallery:
      • WMFModalArticleImageGalleryDataSource: as the name implies, provides data to the modal gallery for images in an article
      • WMFModalPOTDImageGalleryDataSource: I think you've got it by now: this one provides data for the gallery when viewing pictures of the day

    Each gallery data source is created as part of one of WMFModalImageGalleryViewController's new initialization methods. Check the header for details.

    Standardized image widths

    Took a little time to refactor all our disparate image-width stuff into a centralized collection of categories. See UIScreen+WMFImageWidth for details.


    • they're collected in a UIScreen category since all the view-specific resolutions are dependent on the screen's scale
    • we're maxing out scaling at 2x to prevent ourselves from fetching insanely high resolution images for the home feed. For example: 3x scaling would result in 960-px thumbnails (if available) for an article preview cell in the home view :scream:
    • we were previously always showing 1280px thumbnails in the gallery, it now scales from 640 to 1280 depending on screen scale. this means older devices will get lower-res gallery pics and newer devices will remain the same.
    • ideally, we'd download higher resolution images on 2-3x devices when on WiFi, but that's out of scope for now. I'll file a ticket to look into this later.

    Split WMFHomeSectionController protocols

    As part of adding POTD to the Home view, we needed a way to handle selection of home section items which weren't related to articles. And lo, two new protocols were conceived:

    • WMFArticleHomeSectionController: all the article-specific stuff from WMFHomeSectionController
    • WMFGenericHomeSectionController: (open to better names) non-article stuff for home sections. only provides a "detail view controller" when one of its items are selected. might need to add specialized footer interaction methods here if we ever get around to doing a "more POTDs" list view.

    Add'l boyscouting

    • Removed unused gallery & gallery cell properties (most of these were added when I tried to use WMFImageGalleryViewController for all galleries, but that got way too complicated, and I forgot to remove these properties when I backed out the changes)
    • DRY'd up image view placeholder logic in the cells (category already existed it, just integrated in more places and provided explicit, documented overrides where necessary)
    • Fixed image gallery animations. Previously the detail overlay and higher-res images weren't animating into view, nor was the chrome cross dissolving on taps
    opened by bgerstle 22
  • Restyle welcome screens

    Restyle welcome screens

    • [x] Update strings
    • [x] Update images/icons
    • [x] Restyle all 3 welcome screens
    • [x] Ensure layout on small screens and iPads isn't explody - i.e. doesn't stretch to full width on iPads, doesn't clip top or bottom of content on 4s, etc.
    • [x] Fix crashing bug on existing welcome lang picker (see https://github.com/wikimedia/wikipedia-ios/commit/1e5bb13f0d4b0c5f6ab605eafbc40d84c87c4ce7) - prob need a test case for TSG for this.
    • [x] Use WMF green for switches system-wide (and use for a couple Settings icons)
    • [x] Add and hook up back button from mocks at top of second 2 screens
    • [x] Add "Thank you" flourish when opt-ing in to send usage reports
    • [x] Auto-hide welcome screens after opt-in, per the mock video Changed the 'Send usage reports' message instead
    • [x] Double-check for RTL issues (identical to UINavigationController behavior)
      • [x] iOS 9 RTL
        • [x] Push starts on left (trailing)
        • [x] Pop starts on right (leading)
        • [x] Back button pinned to right (leading)
      • [x] iOS 8 RTL
        • [x] Back button pinned to left (not flipped for RTL, mirror
    • [x] DRY up a couple colors which are presently in the storyboard - move to UIColor category
    • [x] Use built-in navigation bar for back button & better transitions
    • [x] Enable swipe to go back
    • [x] Use light status bar on first panel, dark on the rest

    Note: animations (will be follow-on ticket)

    iPhone 6 1 mov

    iPad 2 mov

    iPhone 4s 0 mov

    opened by montehurd 22
  • Localisation updates from https://translatewiki.net.

    Localisation updates from https://translatewiki.net.

    Translation updates

    opened by translatewiki 0
  • Update to Xcode 13.1

    Update to Xcode 13.1

    Phabricator: https://phabricator.wikimedia.org/T291382


    This attempts to fix bugs that building with Xcode 13.1 surfaces, as well as update various settings files to the latest (Circle CI tests, build server version target, etc.)

    Test Steps

    Do some light regression testing on iOS 13, 14, and 15 in these areas:

    1. Navigation bars. Particularly Settings navigation bars and the Editing view navigation bar, where I was seeing UI bugs. Sometimes they showed as clear for me, which the UI underneath poking through. Test theming for these as well.
    2. The tab bar. Similar to navigation bars, it's background color sometimes showed as clear. Test changing the theme through Settings, Article view, and the Editing flow, and be sure the tab bar updates correctly.
    3. Settings section headers and footers theming and spacing. These weren't theming well on iOS15. I updated these to a custom header / footer view (which we were already halfway using on these screens) which already themed properly.
    opened by tonisevener 0
  • Notifications - add mark as read functionality

    Notifications - add mark as read functionality

    Phabricator: https://phabricator.wikimedia.org/T287302 https://phabricator.wikimedia.org/T288687


    This PR sets up some basic functionality of marking notifications as read or unread, or marking all notification as read via the MediaWiki notifications API. It builds on PR #4066 to trigger marking a single notification as read or unread via the swipe action sheet option. I decided to do a bit of a fire-and-forget approach on these without completion blocks, but I'm open to altering it here or later when we work on the other mark as read task.

    Note that even though I am triggering one of these methods through a swipe action, the state won't update itself because the data flow PR is not merged yet. For a preview of all PRs working together you can test the notifications-plus-prs-2 branch.

    Test Steps

    1. Fresh launch app. Login and go to Notifications Center. Also open the Notifications Center on desktop Wikipedia (https://en.wikipedia.org/wiki/Special:Notifications), and go to the "Unread" section in a browser.
    2. Swipe on one of your notifications on device and see the the action sheet display. Tap the "Mark as read/unread" option.
    3. When you swipe and mark something as unread, the notification should appear on this Desktop unread section after a browser refresh. When you swipe again mark something as read, the notification should disappear from this Desktop unread section after a browser refresh.
    opened by tonisevener 0
  • Fix link in article has wrong prefix

    Fix link in article has wrong prefix "app://"

    Phabricator: https://phabricator.wikimedia.org/T291298


    • Currently, link in article has a custom url scheme app://, so when it's copied & pasted into other App, the link doesn't work. So I changed app:// to https:// to fix this

    Test Steps

    1. Go to any article
    2. Copy a sentence with a link in it
    3. Open up Apple's Notes app
    4. Paste copied text
    opened by kojiGit55 0
  • Notifications - Rework data flow & add ability to locally page

    Notifications - Rework data flow & add ability to locally page

    Phabricator: https://phabricator.wikimedia.org/T288662


    This PR modifies the data handling of Notification Center. It refactors out NSFetchedResultsController into basic NSFetchRequests in RemoteNotificationsController, and uses a diffable data source to animate the changes instead of CollectionViewUpdater. It also adds paging through local results and a basic edit mode to see the different cell styles.

    I tested the performance and I didn't notice any issues with this particular code. I found other areas of improvement, but I will handle that in a followup PR.

    Test Steps

    1. Fresh install app. Login to an account with notifications. Go to Settings > Languages and add additional app languages to get the number of notifications pretty large. You might want to consider tweaking the fetch limit here to something lower if you have a smaller number of notifications so you can experience local paging.
    2. Go to notification center. Wait for it to complete importing, then scroll around. Scroll down to the bottom, confirm next 50 cells are fetched and added to the list.
    3. Tap the Edit button at the top, the view will switch to edit mode. Tap the circles in the cells and confirm they show as checked. Scroll down, then scroll back up. Confirm your checked cells are still checked.


    I've been working ahead in a T288662-paging-future prototype branch, if you're curious to see the data flow for future functionality. It has a pull to refresh, mark as read (just tapping the cell background for this), filtering (just one type), and 10,000 mock notifications importing for testing performance.

    opened by tonisevener 7
  • Convert AppDelegate and WMFSettingsViewController to Swift

    Convert AppDelegate and WMFSettingsViewController to Swift

    I tried my hand at converting a couple of classes to Swift. The motivation for this was to eliminate the need for Objective-C interoperability in the EventPlatformClient class, but wholesale conversion of all callers to Swift proved to be too much to take on right now, so I ended up taking a different approach to resolving our immediate need (#3991).

    Disclaimer: I kept the logic pretty close to how it was in the Obj-C classes, the automated tests pass, and the app seems to be working well, but I'm not an iOS or Swift expert by any means, so please review with care!

    opened by mdholloway 0
Wikimedia is a global movement whose mission is to bring free educational content to the world.
WordPress for iOS - Official repository

WordPress for iOS Build Instructions Please refer to the sections below for more detailed information. The instructions assume the work is performed f

WordPress Mobile 3.2k Nov 28, 2021
The official OS X client to the Radio Paradise web radio.

Introduction Radio Paradise is a unique blend of many styles and genres of music, carefully selected and mixed by two real human beings — enhanced by

Giacomo Tufano 16 Jul 28, 2020
:octocat: iOS app to browse open-source-ios-apps

osia Super basic iOS app to browse open-source-ios-apps Getting Started git clone https://github.com/dkhamsing/osia.git open Swift/osia.xcodeproj CMD

null 61 Nov 14, 2021
📱 Nextcloud iOS app

Nextcloud iOS app Check out https://nextcloud.com and follow us on twitter.com/nextclouders or twitter.com/NextcloudiOS How to contribute If you want

Nextcloud 1.1k Nov 26, 2021
Our new iOS portfolio app for WWDCScholars

WWDCScholars iOS App WWDCScholars is a community of Apple WWDC Scholarship winners. Every year bright minds from all around the world compete against

WWDCScholars 61 Sep 21, 2021
Turn your Swift data model into a working CRUD app.

Model2App is a simple library that lets you quickly generate a CRUD iOS app based on just a data model defined in Swift. (CRUD - Create Read Update De

Q Mobile 119 Nov 6, 2021
Add “Launch at Login” functionality to your macOS app in seconds

LaunchAtLogin Add “Launch at Login” functionality to your macOS app in seconds It's usually quite a convoluted and error-prone process to add this. No

Sindre Sorhus 993 Nov 15, 2021
A Attendance Taking app to assist the SST Fearless Falcons (Assistant) Patrol Leaders in taking attendance for their own patrols.

Scouts Attendance A Attendance Taking app to assist the SST Fearless Falcons (Assistant) Patrol Leaders in taking attendance for their own patrols. Do

Ethan Chew 3 May 17, 2021
India Vaccine Availability Tracker - MacOS 'Big Sur' Menubar App

VaccineAvailability is a vaccine tracker MacOS Big Sur Menu bar app to track vaccine availability across India by using pincodes a

Sriram Narasimhan 8 Jun 30, 2021
A better way to handle gestures on iOS

Tactile is a safer and more idiomatic way to respond to gestures and control events. It lets you catch bugs at compile time and write more expressive

Damien 711 Nov 16, 2021
String (and more) validation for iOS

Swift Validators ?? String validation for iOS. Contents Installation Walkthrough Usage Available validators License ReactiveSwift + SwiftValidators Wa

George Kaimakas 233 Oct 27, 2021
CODING iOS 客户端源代码

Coding_iOS客户端项目介绍 编译环境:Xcode-Version 8.0 (8A218a) 让项目跑起来先 项目里用到了 CocoaPods 和 Carthage,如果没有安装的话,需要先自行安装。 Clone 代码后,初次执行前,需要双击运行根目录下的bootstrap脚本。这个过程涉及到

CODING 3.8k Nov 25, 2021
DuckDuckGo iOS Application

DuckDuckGo iOS We are excited to engage the community in development! We are hiring! DuckDuckGo is growing fast and we continue to expand our fully di

DuckDuckGo 1.2k Nov 23, 2021
Firefox for iOS

Firefox for iOS Download on the App Store. This branch (main) This branch works with Xcode 12.4, Swift 5.3 and supports iOS 12.4 and above. Please not

Mozilla Mobile 10.6k Nov 26, 2021
Legacy Ghostery Browser for iOS

DEPRECATED - Ghostery for iOS version 2.x This project is no longer active. Please see our current iOS browser project for Ghostery iOS v3+. Ghostery

Ghostery 15 Oct 28, 2021
Kickstarter for iOS. Bring new ideas to life, anywhere.

Welcome to Kickstarter’s open source iOS app! Come on in, take your shoes off, stay a while—explore how Kickstarter’s native squad has built and conti

Kickstarter 7.8k Nov 21, 2021
Team Kodi 13.1k Nov 18, 2021
📱😀 Video & audio calls through Nextcloud on iOS

Nextcloud Talk iOS app Video & audio calls and chat through Nextcloud on iOS Nextcloud Talk is a fully on-premises audio/video and chat communication

Nextcloud 92 Nov 26, 2021
Simplenote for iOS

Simplenote for iOS A Simplenote client for iOS. Learn more about Simplenote at Simplenote.com. Build Instructions Download Xcode At the moment Simplen

Automattic 1.8k Nov 12, 2021