Legacy Ghostery Browser for iOS

Overview

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 for iOS

This branch (master) Build Status

This branch is for mainline development.

This branch only works with Xcode 10.1 and supports iOS 11 and above.

This branch is written in Swift 4

Please make sure you aim your pull requests in the right direction.

Getting involved

We encourage you to participate in this open source project. We love Pull Requests, Bug Reports, ideas, (security) code reviews or any kind of positive contribution.

Building the code

As of April 2019, this project requires the following versions of dependencies:

  • MacOS Mojave
  • Xcode 10.1
  • Node.js 9
  • Cocoapods 1.5.3

Make sure you have homebrew installed:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew update

Then setup the project following these steps:

  1. Install Xcode 10.1
  • Open the .xip archive
  • Move Xcode to Application folder
  • Setup Xcode and install CLI tools with the following commands:
sudo xcode-select -switch /Applications/Xcode.app
xcode-select --install
  1. Install Node.js 9 (recommended: use nvm) + latest npm (this assumes you are using bash as your shell, if not, replace bash by your shell in the following commands):
brew install curl
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
source ~/.bashrc
nvm install 9
npm install -g [email protected]
  1. Install Carthage
brew install carthage
  1. Install Ruby bundler:
sudo gem install bundler
  1. Fork the repository https://github.com/ghostery/browser-ios from GitHub UI
  2. Clone the forked repository + add upstream remote:
git clone https://github.com/YOUR_USERNAME/ghostery-ios
cd ghostery-ios
git remote add upstream https://github.com/ghostery/browser-ios
git fetch upstream
git checkout upstream/master
git checkout -b my-working-branch
  1. Pull in the project dependencies:
sh ./bootstrap.sh
npm run bundle-ghostery
# Or for Cliqz: npm run bundle-cliqz
# Or for Lumen: npm run bundle-lumen
rm -rf Pods
bundle install
bundle exec pod install
npm run postinstall
  1. Open Client.xcworkspace in Xcode.
  2. Build the Ghostery/Cliqz/Lumen scheme in Xcode.

Note: When you run bundle install, you might get following error An error occurred while installing unf_ext (0.0.7.5), and Bundler cannot continue.. Above error happens with ruby 2.5.1. Just make sure to use 2.5.3 ruby version rvm use 2.5.3 and problem will be fixed.

Building User Scripts

User Scripts (JavaScript injected into the WKWebView) are compiled, concatenated and minified using webpack. User Scripts to be aggregated are placed in the following directories:

/Client
|-- /Frontend
    |-- /UserContent
        |-- /UserScripts
            |-- /AllFrames
            |   |-- /AtDocumentEnd
            |   |-- /AtDocumentStart
            |-- /MainFrame
                |-- /AtDocumentEnd
                |-- /AtDocumentStart

This reduces the total possible number of User Scripts down to four. The compiled output from concatenating and minifying the User Scripts placed in these folders resides in /Client/Assets and are named accordingly:

  • AllFramesAtDocumentEnd.js
  • AllFramesAtDocumentStart.js
  • MainFrameAtDocumentEnd.js
  • MainFrameAtDocumentStart.js

To simplify the build process, these compiled files are checked-in to this repository. When adding or editing User Scripts, these files can be re-compiled with webpack manually. This requires Node.js to be installed and all required npm packages can be installed by running npm install in the root directory of the project. User Scripts can be compiled by running the following npm command in the root directory of the project:

npm run build

Contributor guidelines

Swift style

Whitespace

  • New code should not contain any trailing whitespace.
  • We recommend enabling both the "Automatically trim trailing whitespace" and "Including whitespace-only lines" preferences in Xcode (under Text Editing).
  • git rebase --whitespace=fix can also be used to remove whitespace from your commits before issuing a pull request.

Commits

  • Each commit should have a single clear purpose. If a commit contains multiple unrelated changes, those changes should be split into separate commits.
  • If a commit requires another commit to build properly, those commits should be squashed.
  • Follow-up commits for any review comments should be squashed. Do not include "Fixed PR comments", merge commits, or other "temporary" commits in pull requests.
Comments
  • Update README's instructions

    Update README's instructions

    This PR updates README.md with updated instructions to build the project from scratch. @pavel-cliqz thanks for your help with this, could you maybe have a look and check everything I changed makes sense?

    Notes for testing this patch

    Ideally the instructions should be enough to start from a fresh install of MacOS Mojave and build the project successfully.

    opened by remusao 3
  • [IB-1894] Migrate Bookmarks over from old Cliqz

    [IB-1894] Migrate Bookmarks over from old Cliqz

    This extends the BrowserDB class so that before accessing the database for the first time the following will happen:

    1. Check if a profile.profile folder exists in the place where Old Cliqz Mobile put it, and if yes, move it to the new location for the current code to find
    2. When accessing bookmarks for the first time, check if there are any bookmarks without a bookmarksLocalStructure entry. If yes, create that entry for those bookmarks. This fixes a bug where they would not show up in the bookmarks tab.

    Bonus Content

    I added a Cliqz Debug scheme and unreleased behind the scenes commentary.

    Pull Request Checklist

    • [x] My PR has a standard commit message that looks like [IP-123] This fixes something something
    • [x] I have updated the Unit Tests to cover new or changed functionality
    • [x] I have made sure that localizable strings use NSLocalizableString()

    Notes for testing this patch

    To test, install Old Cliqz Mobile from the App Store and install this code on top of it via Xcode.

    bug 
    opened by winsmith 2
  •  IP-462: set lumen.protection.isEnabled on toggling

    IP-462: set lumen.protection.isEnabled on toggling

    Thank you for submitting a pull request, your contributions are greatly appreciated!

    Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.

    Pull Request Checklist

    • [ ] My patch has gone through review and I have addressed review comments

    • [ ] My patch has a standard commit message that looks like Bug 12345678 - This fixes something something

    • [ ] I have updated the Unit Tests to cover new or changed functionality

    • [ ] I have updated the UI Tests to cover new or changed functionality

    • [ ] I have marked the bug with [needsuplift]

    • [ ] I have made sure that localizable strings use NSLocalizableString()

    Screenshots

    If your patch includes user interface changes that you would like to suggest or that you would like UX to look at, please include them here.

    Notes for testing this patch

    If useful, please leave notes for QA, explaining what this patch changes and how it can be best tested and verified.

    opened by giota-cliqz 2
  • EX-8495: fix for video downloader

    EX-8495: fix for video downloader

    https://cliqztix.atlassian.net/browse/EX-8495. This is still WIP

    TODO

    • use v3.33 branch (once v1.33 is created) @luciancor
    • add @cliqz/indexeddbshim 4.1.1 as a dependency (once it is pushed to npm registry) and move it as a peer dependency in the navigation-extension project -> Done
    opened by giota-cliqz 2
  • fix overlapping accesses to keyData

    fix overlapping accesses to keyData

    Thank you for submitting a pull request, your contributions are greatly appreciated!

    Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.

    Pull Request Checklist

    • [ ] My patch has gone through review and I have addressed review comments

    • [ ] My patch has a standard commit message that looks like Bug 12345678 - This fixes something something

    • [ ] I have updated the Unit Tests to cover new or changed functionality

    • [ ] I have updated the UI Tests to cover new or changed functionality

    • [ ] I have marked the bug with [needsuplift]

    • [ ] I have made sure that localizable strings use NSLocalizableString()

    Screenshots

    If your patch includes user interface changes that you would like to suggest or that you would like UX to look at, please include them here.

    Notes for testing this patch

    If useful, please leave notes for QA, explaining what this patch changes and how it can be best tested and verified.

    opened by giota-cliqz 2
  • MOZ_PRODUCT_NAME is not overwritten by German translation

    MOZ_PRODUCT_NAME is not overwritten by German translation

    We've noticed this in telemetry data that all German browser report with product name $(MOZ_PRODUCT_NAME) instead of Cliqz. This does not happen for other languages.

    bug cliqz 
    opened by chrmod 1
  • [IP-474] Fix Query suggestions disappearing randomly

    [IP-474] Fix Query suggestions disappearing randomly

    Some result suggestion providers (mainly google) return ASCII formatted JSON instead of UTF-8 formatted JSON. To counter this, we first try to decode the result provider data using UTF-8, but retry with ASCII if that fails.

    It has been discussed to check the header data, but since that is misleading in some cases (e.g. Google gives gzip as the encoding), this way is more robust.

    Firefox solves this a different way by completely replacing AlamoFire in the project. I advocate that we should update our codebase with the FF codebase at some point, but for now this fixes the issue.

    Pull Request Checklist

    • [ ] My patch has gone through review and I have addressed review comments
    • [x] My patch has a standard commit message that looks like Bug 12345678 - This fixes something something
    • [x] I have updated the Unit Tests to cover new or changed functionality
    • [x] I have updated the UI Tests to cover new or changed functionality
    • [ ] I have marked the bug with [needsuplift]
    • [x] I have made sure that localizable strings use NSLocalizableString()

    Screenshots

    n/a

    Notes for testing this patch

    Try to force the search engine to reply with umlauts or other special characters. A string that tripped up the query suggestion before was un, because the result contained unwetter münchen. Also good is fc bayern m because the results will include fc augsburg is viel besser als münchen or something.

    opened by ghost 1
  • update README

    update README

    Thank you for submitting a pull request, your contributions are greatly appreciated!

    Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.

    Pull Request Checklist

    • [ ] My patch has gone through review and I have addressed review comments

    • [ ] My patch has a standard commit message that looks like Bug 12345678 - This fixes something something

    • [ ] I have updated the Unit Tests to cover new or changed functionality

    • [ ] I have updated the UI Tests to cover new or changed functionality

    • [ ] I have marked the bug with [needsuplift]

    • [ ] I have made sure that localizable strings use NSLocalizableString()

    Screenshots

    If your patch includes user interface changes that you would like to suggest or that you would like UX to look at, please include them here.

    Notes for testing this patch

    If useful, please leave notes for QA, explaining what this patch changes and how it can be best tested and verified.

    opened by giota-cliqz 1
  • Eliminate dispatching from LocalDataStore + Updated the LocalDataStor…

    Eliminate dispatching from LocalDataStore + Updated the LocalDataStor…

    @mahmoud-cliqz I took out the dispatches. I adapted the syntax to Swift, since most of the things in Swift are values...and we don't save classes (which are objects) in UserDefaults.

    opened by timoteipalade 1
  • Bump jquery from 3.4.1 to 3.5.0

    Bump jquery from 3.4.1 to 3.5.0

    Bumps jquery from 3.4.1 to 3.5.0.

    Commits
    • 7a0a850 3.5.0
    • 8570a08 Release: Update AUTHORS.txt
    • da3dd85 Ajax: Do not execute scripts for unsuccessful HTTP responses
    • 065143c Ajax: Overwrite s.contentType with content-type header value, if any
    • 1a4f10d Tests: Blacklist one focusin test in IE
    • 9e15d6b Event: Use only one focusin/out handler per matching window & document
    • 966a709 Manipulation: Skip the select wrapper for <option> outside of IE 9
    • 1d61fd9 Manipulation: Make jQuery.htmlPrefilter an identity function
    • 04bf577 Selector: Update Sizzle from 2.3.4 to 2.3.5
    • 7506c9c Build: Resolve Travis config warnings
    • Additional commits viewable in compare view
    Maintainer changes

    This version was pushed to npm by mgol, a new releaser for jquery since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 0
  • Bump acorn from 3.3.0 to 6.4.1

    Bump acorn from 3.3.0 to 6.4.1

    Bumps acorn from 3.3.0 to 6.4.1.

    Commits
    • 9a2e9b6 Mark version 6.4.1
    • 90a9548 More rigorously check surrogate pairs in regexp validator
    • df0cf1a Mark version 6.4.0
    • 5303412 Also export Parser via Parser.acorn
    • efe273e give token types and etc to plugins
    • ac6decb Mark version 6.3.0
    • 7e9817d Allow sourceType: module even with ecmaVersion < 6
    • e2b8cc0 Fix broken parsing of new expressions when allowReserved=="never"
    • 1555c52 Update acorn.d.ts
    • 77c20fa Mark version 6.2.1
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 0
  • Delist simply.com

    Delist simply.com

    We aquired simply.com and are working on launching a webhosting project on it. However the domain is blocked by you, due to past advertising activity (before we bought it).

    Can you delist the domain from your blocklists?

    opened by tomsommer 0
  • Bump handlebars from 4.0.11 to 4.5.3

    Bump handlebars from 4.0.11 to 4.5.3

    Bumps handlebars from 4.0.11 to 4.5.3.

    Changelog

    Sourced from handlebars's changelog.

    v4.5.3 - November 18th, 2019

    Bugfixes:

    • fix: add "no-prototype-builtins" eslint-rule and fix all occurences - f7f05d7
    • fix: add more properties required to be enumerable - 1988878

    Chores / Build:

    • fix: use !== 0 instead of != 0 - c02b05f
    • add chai and dirty-chai and sinon, for cleaner test-assertions and spies, deprecate old assertion-methods - 93e284e, 886ba86, 0817dad, 93516a0

    Security:

    • The properties __proto__, __defineGetter__, __defineSetter__ and __lookupGetter__ have been added to the list of "properties that must be enumerable". If a property by that name is found and not enumerable on its parent, it will silently evaluate to undefined. This is done in both the compiled template and the "lookup"-helper. This will prevent new Remote-Code-Execution exploits that have been published recently.

    Compatibility notes:

    • Due to the security-fixes. The semantics of the templates using __proto__, __defineGetter__, __defineSetter__ and __lookupGetter__ in the respect that those expression now return undefined rather than their actual value from the proto.
    • The semantics have not changed in cases where the properties are enumerable, as in:
    {
      __proto__: 'some string'
    }
    
    • The change may be breaking in that respect, but we still only increase the patch-version, because the incompatible use-cases are not intended, undocumented and far less important than fixing Remote-Code-Execution exploits on existing systems.

    Commits

    v4.5.2 - November 13th, 2019

    Bugfixes

    • fix: use String(field) in lookup when checking for "constructor" - d541378
    • test: add fluent API for testing Handlebars - c2ac79c

    Compatibility notes:

    • no incompatibility are to be expected
    ... (truncated)
    Commits
    • c819c8b v4.5.3
    • 827c9d0 Update release notes
    • f7f05d7 fix: add "no-prototype-builtins" eslint-rule and fix all occurences
    • 1988878 fix: add more properties required to be enumerable
    • 886ba86 test/chore: add chai/expect and sinon to "runtime"-environment
    • 0817dad test: add sinon as global variable to eslint in the specs
    • 93516a0 test: add sinon.js for spies, deprecate current assertions
    • 93e284e chore: add chai and dirty-chai for better test assertions
    • c02b05f fix: use !== 0 instead of != 0
    • 8de121d v4.5.2
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot ignore this [patch|minor|major] version will close this PR and stop Dependabot creating any more for this minor/major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 0
  • PDF tabs don't load

    PDF tabs don't load

    Steps to reproduce:

    • open PDF url
    • switch tab
    • go back to previous tab

    Current result:

    • blank background is shown

    Expected result:

    • pdf document should load

    Pdf example: https://www.degiro.de/data/pdf/de/Preisverzeichnis.pdf

    bug cliqz 
    opened by chrmod 0
Releases(v2.0.7-cliqzRelease)
Owner
Ghostery
Making the web cleaner, faster and safer
Ghostery
An open-source, privacy-enhancing web browser for iOS, utilizing the Tor anonymity network

Onion Browser Official Site | Support | Release History | Donate © 2012-2020, Tigas Ventures, LLC (Mike Tigas) This is the Onion Browser 2.X branch, b

Onion Browser 2k Dec 30, 2022
A small Swift tool/server to serve DocC archives to your browser

servedocc Small Swift script to serve "DocC" archives, a format to document Swift frameworks and packages: Documenting a Swift Framework or Package. N

DocZ 8 Jan 29, 2022
Flare is a simplistic web browser for macOS built using UIKit.

Flare is a simplistic web browser for macOS built using UIKit. It demonstrates a custom address field toolbar item using an NSTextField subclass

Steven Troughton-Smith 97 Nov 1, 2022
A chromeless web browser for viewing prototypes.

Frameless Frameless is a web browser for iOS 8+ that gets out of your way. It was built for designers and prototypers who need to interact with your p

Jay Stakelon 644 Dec 12, 2022
A Powerful Private Browser Developed to Truly Protect your Data

SnowHaze SnowHaze is the first and only iOS browser that truly protects your data! Designed for best possible privacy and security and made to be easi

SnowHaze 115 Nov 6, 2022
WebKit aims to provide platform agnostic isolated browser environments without the need for sketchy C bindings or a bloated V8 runtime.

WebKit WebKit aims to provide platform agnostic isolated browser environments without the need for sketchy C bindings or a bloated V8 runtime. Running

Linden 1 Nov 26, 2021
SwiftWebKit - This app look like a browser, but you can navigate between 2 sites

import UIKit import WebKit My first app for WebKit. This app look like a browser

Ahmet Onur Şahin 3 Apr 18, 2022
Browser-ext - Safari Extension Container App

browser-ext See article on dev.to. Please refer to Safari Web Extensions on how

Bing Qiao 4 Jul 18, 2022
An unofficial E-Hentai App for iOS built with SwiftUI.

EhPanda An unofficial E-Hentai App for iOS. English・ Deutsch・ 한국어・ 日本語・ 繁體中文・ 简体中文 ?? Translations Wanted ?? Please submit a pull request if you want

Tatsuzou Araki 2k Jan 1, 2023
Firefox for iOS

Firefox for iOS Download on the App Store. This branch (main) This branch works with Xcode 13.0, Swift 5.5 and supports iOS 13 and above. Please note:

Mozilla Mobile 11.2k Jan 9, 2023
Firefox Focus for iOS

Firefox Focus for iOS Browse like no one’s watching. The new Firefox Focus automatically blocks a wide range of online trackers — from the moment you

Mozilla Mobile 1.2k Jan 7, 2023
Overamped - an iOS app that disables AMP and Yandex Turbo in Safari via a Web Extension⚡️

Overamped Overamped is an iOS app that disables AMP and Yandex Turbo in Safari via a Web Extension. More information is available at overamped.app. Th

Joseph Duffy 36 Dec 14, 2022
Legacy mobile Rocket.Chat client in Swift for iOS

IMPORTANT: PLEASE READ THIS FIRST Rocket.Chat mobile is moving to React Native. Development on this repository by Rocket.Chat has now ceased. If your

Rocket.Chat 1k Dec 22, 2022
This repository accompanies Modularizing Legacy Projects Using TDD: Test Driven Development with XCTest for iOS

Apress Source Code This repository accompanies Modularizing Legacy Projects Using TDD: Test Driven Development with XCTest for iOS by Khaled El-Morabe

Apress 13 Dec 15, 2022
ips2crash is a macOS command line too to convert a .ips file to a legacy .crash log file.

Synopsis ips2crash is a macOS command line too to convert a .ips file to a legacy .crash log file. Motivation It should be possible to read .ips file

null 36 Nov 25, 2022
Updater option for Chromium-legacy

Chromium Updater A tiny updater option for Chromium-legacy. features check/notify updates colored status icon represents updates available download th

null 1 Apr 4, 2022
Erik is an headless browser based on WebKit. An headless browser allow to run functional tests, to access and manipulate webpages using javascript.

Erik Erik is a headless browser based on WebKit and HTML parser Kanna. An headless browser allow to run functional tests, to access and manipulate web

Eric Marchand 544 Dec 30, 2022
Erik is an headless browser based on WebKit. An headless browser allow to run functional tests, to access and manipulate webpages using javascript.

Erik Erik is a headless browser based on WebKit and HTML parser Kanna. An headless browser allow to run functional tests, to access and manipulate web

Eric Marchand 544 Dec 30, 2022
Mathias Köhnke 1.1k Dec 16, 2022
🏞 A simple iOS photo and video browser with optional grid view, captions and selections written in Swift5.0

Introduction ?? MediaBrowser can display one or more images or videos by providing either UIImage objects, PHAsset objects, or URLs to library assets,

Kyle Yi 631 Dec 29, 2022