📱The official Wikipedia iOS app.

Overview

Wikipedia iOS

The official Wikipedia iOS app.

Wikipedia MIT license

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

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 Apple ID registered with an Apple Developer account.
  • ClangFormat - We use this for linting.

Contributing

Covered in the contributing document.

Development Guidelines

These are general guidelines rather than hard rules.

Coding Guidelines

Formatting

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.

Logging

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

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

Testing

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. 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 language and region.

Schemes and Targets

  • Wikipedia - Points to production servers.
  • Staging - Pushed to TestFlight as a separate app bundle, and has the ability to toggle different staging environments within the current property of Configuration:
    • An option of appsLabsForPCS will point to the Apps team's staging environment for page content. This is selected by default.
    • An option of deploymentLabsForEventLogging will point to the Event Logging staging environment. It is for testing analytics events that the app sends to Event Logging. It is not selected by default.
    • All other endpoints will point to production.
  • Local Page Content Service and Announcements - used in Debug mode only, has the ability to toggle different local environments within the current property of Configuration:
    • An option of localPCS will point to a locally running mobileapps repository for page content. This is selected by default.
    • An option of localAnnouncements will point to a locally running wikifeeds repository for the announcements endpoint. This is selected by default.
    • All other endpoints will point to production.
  • RTL - Launches the app in an RTL locale using the -AppleLocale argument.
  • Experimental - For one off builds. Can point to whatever is needed for the given experiment. Pushed to TestFlight as a separate app bundle.
  • User Testing - For user testing. Has an alternate configuration so that it can be delivered ad hoc. Pushed to TestFlight as a separate app bundle.
  • WMF - Bundles up the app logic shared between the main app and the extensions (widgets, notifications).
  • Update Localizations - Covered in the localization document.
  • Update Languages - For 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.

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.

Comments
  • Banners

    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
  • 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
  • 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
  • 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
  • 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
  • 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.

    Takeaways

    • 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
  • continue reading section

    continue reading section

    Pushing last read article if less than 24 hours and the app was quit.

    And adding new section, which means:

    • New section controller
    • New cell
    • New Schema item
    • Updating the Schema to vend the section based on the rules (show after 24 hours)

    Additionally added the support for icons on the sections

    opened by coreyfloyd 19
  • Show links in article summary

    Show links in article summary

    :checkered_flag: Ready for review :checkered_flag:

    Checklist

    • [x] Render HTML natively (DTCoreText)
    • [x] Custom XPath for summary
      • [x] filter out coordinates (see taj mahal snapshot reference)


    - [ ] filter out IPA? - [ ] Interactions w/ native content Going to do interaction in a separate patch

    Amendments

    • [x] change UIColor+WMFPalette to the un-artistic UIColor+WMFStyle
    • [x] remove premature @autoreleasepool optimization
    • [x] remove #define WMFParagraphSelector in favor of vanilla string formatting
    • [x] move "minimal content controller" into a custom attributed text cell, encapsulating all logic in one place

    Using DTCoreText to render pages natively, doing a different XPath to grab section content. See Extraction section in MWKArticle for implementation details and the new WikipediaUnitTests/ReferenceImages folder for visual examples.

    opened by bgerstle 19
  • Make certain feed headers respond to taps.

    Make certain feed headers respond to taps.

    • [x] "Continue reading..." (tap should load the article)
    • [x] "Featured article" (tap should load the article)
    • [x] "Today on Wikipedia" (tap should load the article)
    • [x] "Random" (tap should load the article - but should not prevent refresh from working)
    • [x] "Nearby" (tap should load full Nearby list)
    • [x] "Today's picture" (tap should load the picture)
    • [x] Make header taps use same highlighting - (Josh said it's ok for now if the cell beneath the header highlights)
    • [x] Bypass this tap handling for other header types
    • [x] "Because you read..." (no longer make only the link tappable - make tapping anywhere on the "Because you read..." header load the article, the link can still be highlighted, it just won't handle taps)
    opened by montehurd 18
  • Remove excessive newlines in talk page headers

    Remove excessive newlines in talk page headers

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

    Notes

    • Currently, there are sometimes sequences of consecutive newlines in the headers of talk pages, which creates large gaps in the text. This makes it difficult to read the pages
    • This is fixed by cutting off consecutive newlines so that there are no more than two in a sequence

    Test Steps

    1. Navigate to an article (Example: Black Panther)
    2. Navigate to the article talk page
    3. Tap read more and view the topics
    4. There should be no large gaps of multiple newlines between the text

    Screenshots/Videos

    Before change:

    Simulator Screen Shot - iPhone 14 Pro - 2022-12-31 at 14 10 46

    After change:

    Simulator Screen Shot - iPhone 14 Pro - 2022-12-31 at 14 12 35

    opened by junholee6a 0
  • Scroll to article URL fragments

    Scroll to article URL fragments

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

    Notes

    • Currently, links with fragments (such as sections and equations) do not scroll to the fragment when opened in the app, unless that article is already open. This is fixed by adding the fragment to the web view's request before loading, which triggers the existing restoreScrollStateIfNecessary method to scroll the view to the fragment after the web view loads.
    • Currently, if the user has an article open in the app and clicks on a link to a fragment in that same article, nothing happens. This is fixed by adding a statement to scroll to the fragment in this case.

    Test 1 Steps: External link with fragment, different article

    1. Make sure the “Juice” article is not currently open in the app
    2. Paste this link into Safari: https://en.wikipedia.org/wiki/Juice#Preparation
    3. Select the link and “Open in Wikipedia”
    4. Should open the “Juice” article in the app and scroll to the “Preparation” section

    Test 2 Steps: Internal link with fragment, same article

    1. Open this article in the app: https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors
    2. Scroll to the “Algebraic multiplicity” section
    3. Click the “Equation (4)” link
    4. Should scroll to equation 4
    opened by junholee6a 0
  • Fix peek/pop bug: References should not peek

    Fix peek/pop bug: References should not peek

    Phabricator: N/A

    Notes

    • 👋🏻 I realized I introduced this bug when working on peek/pop. Sorry!
    • Currently, if you long press on an article reference (or note), a user gets a preview of the article they're currently in, which is not intended. This PR suppresses long press preview for references (and notes).
    • Additionally, when a user long presses an element that cannot be previewed (like an external URL or [now] a reference), the text they tap grows as if it can be previewed. I changed the completion handler to nil (from nilConfig), which tells iOS suppresses this behavior. Please let me know if you'd like to keep the current behavior, and I can remove this from the PR.
    • Also, I renamed a variable to newArticleUrl as we use articleUrl for the current VC's article. While the compiler can handle it, I think this improves readability for humans - but feel free to request that I revert that.

    Test Steps

    1. Load an article.
    2. Use peek/pop on a reference. It should not work.
    3. Use peek/pop on an article link. It should work.
    opened by mcleinman 0
  • Enable scrolling on long title article history pages

    Enable scrolling on long title article history pages

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

    Notes

    Previously, long titled article history pages would not scroll because the navigation bar in the view didn't enable allowsUnderbarHitsFallThrough. This adds a PageHistoryCountsView to represent the existing implemented XIB, and adds the point inside override to support allowsUnderbarHitsFallThrough and allow scrolling the view when interacting with the header.

    If there's a better way to handle this, I'm happy to change this PR!

    Test Steps

    From Phabricator:

    - Go to the article: https://en.wikipedia.org/wiki/Cneoridium_dumosum_(Nuttall)_Hooker_F._Collected_March_26%2C_1960%2C_at_an_Elevation_of_about_1450_Meters_on_Cerro_Quemaz%C3%B3n%2C_15_Miles_South_of_Bah%C3%ADa_de_Los_Angeles%2C_Baja_California%2C_M%C3%A9xico%2C_Apparently_for_a_Southeastward_Range_Extension_of_Some_140_Miles within the iOS app
    - Navigate to the article's history page
    - Scroll down on the history page
    

    Confirm in the case above (and any other article history page) that interacting with the navigation bar to scroll works and allows the user to see the rest of the view.

    opened by staykids 0
  • Perform search on appearance of `InsertLinkViewController`

    Perform search on appearance of `InsertLinkViewController`

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

    Notes

    This resolves the issue where tapping link on an unlinked term in the section editor presented the insert link view, but did not immediately start populating search results for the selected term. Now, we perform a search on appearance of the InsertLinkViewController.

    Test Steps

    1. Open an article and edit a section
    2. Select a piece of unlinked text on the page and tap the link button in the toolbar
    3. Confirm the Insert Link controller appears with the selected term in the search bar, and that a search is immediately performed to populate the results list
    4. Confirm tapping a search result populates that link in the section editor
    opened by staykids 0
Releases(releases/7.0.1)
Owner
Wikimedia
Wikimedia is a global movement whose mission is to bring free educational content to the world.
Wikimedia
VLC for iOS and tvOS official mirror

This is the official mirror repository of VLC for iOS and tvOS application. You can find the official repository here. It's currently written in Objec

VideoLAN 798 Dec 28, 2022
Sample app to demonstrate data sharing between a WatchKit app and its main app using Realm

#Done! A sample app demonstrating how to share data between an app an its Watch extension using Realm. You can read more about it here. ##Screenshot #

Fancy Pixel 147 Dec 8, 2022
An experimental clone of the new iOS 11 App Store app

appstore-clone An experimental clone of the new iOS 11 App Store app for this Medium Article Description Apple announced an entirely redesigned iOS Ap

Phill Farrugia 498 Dec 13, 2022
iOS app to record how much things cost using various data persistence implementations.

how-much iOS app to record how much things cost using various data persistence implementations. The basic data unit is an item, a simple dictionary: {

null 22 Aug 15, 2022
The (second) best iOS app for GitHub.

GitHawk is the second-highest rated iOS app for GitHub. Features 0️⃣ Inbox Zero your notifications ?? Comment even faster than on GitHub desktop ?? Th

GitHawk 2.8k Dec 23, 2022
iOS app for 5calls.org

5Calls iOS App This is the repository for the iOS app for 5Calls.org. Requirements Xcode 10.2.1 iOS 10.2 Getting Started Install the dependencies: bun

5 Calls 129 Dec 25, 2022
Development of the TUM Campus App for iOS devices - for and from students at Technical University of Munich.

Tum Campus App - An Unofficial Guide Through University Life The TUM Campus App (TCA) is an open source project, developed by volunteers and available

TUM Developers 93 Dec 16, 2022
Lightweight iOS Photo Blur App

Blurry Blurry is the go-to image blurring tool to help you apply beautiful blurs for your photos. It is perfect for creating wallpapers, backgrounds,

Andy 17 Nov 22, 2022
Alfresco iOS App - Alfresco is the open platform for business-critical content management and collaboration.

Welcome to the Alfresco iOS App Alfresco is the open platform for business-critical content management and collaboration. Alfresco Mobile was designed

Alfresco Software 42 Sep 26, 2022
📱 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.4k Dec 30, 2022
🍣Making Recipes iOS app

Recipes App ❤️ Support my apps ❤️ Push Hero - pure Swift native macOS application to test push notifications PastePal - Pasteboard, note and shortcut

Khoa 88 Nov 22, 2022
Sample iOS app demonstrating Coordinators, Dependency Injection, MVVM, Binding

iOS Sample App Sample iOS app written the way I write iOS apps because I cannot share the app I currently work on. Shown concepts Architecture concept

Igor Kulman 632 Dec 28, 2022
This app shows the current percentage of the vaccination campaign in Brazil and its states

This app shows the current percentage of the vaccination campaign in Brazil and its states. The data is obtained thanks to covid19br.

Anderson Kloss Maia 8 Jul 22, 2022
Open-Source Messaging App

Acani Chats Open-Source Native iOS Messages App This project and its submodules no longer work and are no longer being maintained. Acani Chats is an i

Acani 2.1k Dec 21, 2022
The Artsy Auction Kiosk App.

Eidolon The Artsy Auction Kiosk App. Note: Current development is done on the xcode-9 branch using Xcode 9 (available for download on Apple's develope

Artsy 2.7k Dec 25, 2022
Build a Swift App as a designer

DesignerNewsApp Simple iOS client for Designer News, by the creator of Design+Code and the team, written in Swift. Usage Download the repository $ git

Meng To 2.4k Dec 24, 2022
Basic app to show how to login with Facebook, Google, Twitter. Created for learning purpose :) using Xcode 9 and Swift 4.0

Social Logins iOS Basic app to show how to login with Facebook, Google, Twitter. Created for learning purpose :) using Xcode 9 and Swift 4.0 Note: Bef

Jogendra 12 Nov 4, 2022
PixPic, a Photo Editing App

PixPic PixPic, a Photo Editing App Built by Our iOS Interns What's the best way to teach interns how to write an iOS app? Just let them do it! This ap

Yalantis 1.3k Dec 24, 2022
An app focused on show in a visual way how sorting algorithms actually works.

Sorting Algorithms App An open source app focused on show in a visual way how sorting algorithms actually works. Available on the app store Do you wan

Victor Panitz Magalhães 45 Nov 25, 2022