Official ProtonVPN iOS and macOS app

Overview

ProtonVPN for iOS and macOS

Copyright (c) 2021 Proton Technologies AG

Dependencies

This app uses CocoaPods for most dependencies. Everything is inside this repository, so no need to run pod install.

Third-party dependencies

ACKNOWLEDGEMENTS.md

Setup

  • Enable Git LFS on your machine
  • Clone this repository
  • Make sure you have go installed (brew install go)
  • Configure code signing for all targets with a paid Apple developer account (required due to VPN entitlements) and change the bundle identifiers to something unique
  • Clean build folder in Xcode (Cmd+Shift+K)
  • Build app twice

Localization

The app uses SwiftGen to generate the Localizable.strings file for accessing all the app strings stored in the standard Localizable.strings files. Just add a new string, build the project and Localizable.strings gets regenerated with the new string. The configuration can be found in libraries/vpncore/swiftgen.yml.

Obscure XCode errors

If you get obscure XCode errors like an error from swiftlint without a place where it comes from, switch to vpncore-ios or vpncore-macos scheme and build it. Most probably lint error is in the Core project.

License

The code and data files in this distribution are licensed under the terms of the GPLv3 as published by the Free Software Foundation. See https://www.gnu.org/licenses/ for a copy of this license.

Copyright (c) 2021 Proton Technologies AG

Comments
  • Code for the latest versions

    Code for the latest versions

    Please complete the following checklist (by adding [x]):

    • [x] I have searched open and closed issues for duplicates
    • [x] This isn't a feature request
    • [x] This is not a report about my app not working as expected

    After new designed apps released I decided to check the code for them and didn't find the code for the latest v3.0.0 for MacOS and v3.1.3 for iOS, where can I find it? and seems like iOS app for ProtonMail lags behind in the version as well

    opened by fsimonov 7
  • [!] Invalid `Podfile` file: no implicit conversion of nil into String.

    [!] Invalid `Podfile` file: no implicit conversion of nil into String.

    clb@clbdeMac-mini ios-mac-app-develop % pod install

    [!] Invalid Podfile file: no implicit conversion of nil into String.

    from /Users/clb/Downloads/ios-mac-app-develop/Podfile:7

    -------------------------------------------

    def proton_url

    'git@' + ENV["PROTON_GIT_URL"]

    end

    -------------------------------------------

    opened by wfs498121294 2
  • Is there a way to put the custom API domain for fetching the servers?

    Is there a way to put the custom API domain for fetching the servers?

    Well here is the thing: Currently I'm living in a country in which when I open the app, the initial call for fetching servers is blocked and I should wait for a couple of minutes until it changes the URI to the fallback one.

    When I was using Linux and more specifically this repo, I could merge this PR in my code and build the project myself, with that the initial call would be successfully fulfilled.

    I was looking for a way to do the same thing in the mac version of ProtonVPN so I can avoid the long loading time when I open the app.

    I saw this post about using TunnelBlick but I prefer using the ProtonVPN mac app if it's possible.

    Thanks a lot and sorry if it's not the right place to raise this issue 🙏🏻.

    opened by officer47p 1
  • Any protocol couldnt open

    Any protocol couldnt open

    We are happy to answer your questions about the code or discuss technical ideas.

    Please complete the following checklist (by adding [x]):

    • [ ] I have searched open and closed issues for duplicates
    • [ ] This isn't a feature request
    • [ ] This is not a report about my app not working as expected

    It is interesting that only the protocol (tcp) can be connected, but no website can open

    opened by asadayaz 0
  • Protocols

    Protocols

    We are happy to answer your questions about the code or discuss technical ideas.

    Please complete the following checklist (by adding [x]):

    • [ ] I have searched open and closed issues for duplicates
    • [ ] This isn't a feature request
    • [ ] This is not a report about my app not working as expected

    Why none of the protocols work in Iran?

    opened by asadayaz 0
  • Would you be able to upload the .ipa files for iPhone installation?

    Would you be able to upload the .ipa files for iPhone installation?

    Hi. People in certain countries in the world are suffering access to the internet. Many of them have iPhone phones but Apple App Store is blocked in those countries and they cannot download ProtonVPN. Could you please upload the .ipa files as an asset in your releases so that people from outside of Iran can download the .ipa file and share it with people in Iran via email or other methods? I would really appreciate it if you could upload the .ipa file for the latest version of ProtonVPN here as soon as possible. Please do not wait until the next version is released even if it means you have to create a new release in order to be able to add an asset (the .ipa) file.

    Thank you thank you thank you

    opened by Amir-Arsalan 3
  • Kill Switch blocks Gradle sync because of localhost use

    Kill Switch blocks Gradle sync because of localhost use

    • [x] I have searched open and closed issues for duplicates
    • [x] This isn't a feature request
    • [x] This is not a report about my app not working as expected

    I think the Kill Switch is be blocking localhost connections on my Mac, and I'm not sure it should be. I've come for some advice about it. I'm not too well-versed in managing networks, so please bear with me as I ask.

    I'm an Android developer using Android Studio and Gradle build tools. I often need to run the gradle sync command to pull code dependencies. (I know Xcode uses different build tools, but your Android team will know what I'm referring to if it's necessary.)

    With Kill Switch off, the gradle sync completes normally. With Kill Switch on, it immediately fails. (log below)

    (It might be worth noting that I always have Allow LAN Connections disabled.)

    Gradle runs a daemon on localhost to help with its processes, and what I think I've figured out is that the connection to that daemon is blocked by the Kill Switch. But this is just a process running on my local machine. Is this expected? I'm not making any outside connections to other devices so it seems weird to me that localhost is having issues, but again - I'm not a network expert.

    **EXPAND FOR LOG OUTPUT**
    Starting a Gradle Daemon, 15 stopped Daemons could not be reused, use --status for details
    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Could not connect to the Gradle daemon.
    Daemon uid: dfa58bf1-9dc8-41b2-9e05-1d3c2b6487ac with diagnostics:
    Daemon pid: 47724
      log file: /Users/[username]/.gradle/daemon/7.5.1/daemon-47724.out.log
    ----- Last  20 lines from daemon log file - daemon-47724.out.log -----
    2022-09-26T21:26:25.088-0500 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a loopback interface? false
    2022-09-26T21:26:25.088-0500 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /192.168.0.4
    2022-09-26T21:26:25.089-0500 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding IP addresses for network interface lo0
    2022-09-26T21:26:25.089-0500 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a loopback interface? true
    2022-09-26T21:26:25.089-0500 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Ignoring remote address on loopback interface /fe80:0:0:0:0:0:0:1%lo0
    2022-09-26T21:26:25.089-0500 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding loopback address /0:0:0:0:0:0:0:1%lo0
    2022-09-26T21:26:25.089-0500 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding loopback address /127.0.0.1
    2022-09-26T21:26:25.091-0500 [DEBUG] [org.gradle.internal.remote.internal.inet.TcpIncomingConnector] Listening on [77f01216-b83a-4c7f-8b6f-90a4be42dfe6 port:51410, addresses:[localhost/127.0.0.1]].
    2022-09-26T21:26:25.094-0500 [DEBUG] [org.gradle.launcher.daemon.server.Daemon] Daemon starting at: Mon Sep 26 21:26:25 CDT 2022, with address: [77f01216-b83a-4c7f-8b6f-90a4be42dfe6 port:51410, addresses:[localhost/127.0.0.1]]
    2022-09-26T21:26:25.094-0500 [INFO] [org.gradle.launcher.daemon.server.DaemonRegistryUpdater] Advertising the daemon address to the clients: [77f01216-b83a-4c7f-8b6f-90a4be42dfe6 port:51410, addresses:[localhost/127.0.0.1]]
    2022-09-26T21:26:25.095-0500 [DEBUG] [org.gradle.launcher.daemon.server.DaemonRegistryUpdater] Advertised daemon context: DefaultDaemonContext[uid=dfa58bf1-9dc8-41b2-9e05-1d3c2b6487ac,javaHome=/Library/Java/JavaVirtualMachines/temurin-18.jdk/Contents/Home,daemonRegistryDir=/Users/[username]/.gradle/daemon,pid=47724,idleTimeout=10800000,priority=NORMAL,daemonOpts=--add-opens,java.base/java.util=ALL-UNNAMED,--add-opens,java.base/java.lang=ALL-UNNAMED,--add-opens,java.base/java.lang.invoke=ALL-UNNAMED,--add-opens,java.base/java.util=ALL-UNNAMED,--add-opens,java.prefs/java.util.prefs=ALL-UNNAMED,--add-opens,java.prefs/java.util.prefs=ALL-UNNAMED,--add-opens,java.base/java.nio.charset=ALL-UNNAMED,--add-opens,java.base/java.net=ALL-UNNAMED,--add-opens,java.base/java.util.concurrent.atomic=ALL-UNNAMED,-Xmx2048m,-Dfile.encoding=UTF-8,-Duser.country=US,-Duser.language=en,-Duser.variant]
    2022-09-26T21:26:25.095-0500 [DEBUG] [org.gradle.launcher.daemon.registry.PersistentDaemonRegistry] Storing daemon address: [77f01216-b83a-4c7f-8b6f-90a4be42dfe6 port:51410, addresses:[localhost/127.0.0.1]], context: DefaultDaemonContext[uid=dfa58bf1-9dc8-41b2-9e05-1d3c2b6487ac,javaHome=/Library/Java/JavaVirtualMachines/temurin-18.jdk/Contents/Home,daemonRegistryDir=/Users/[username]/.gradle/daemon,pid=47724,idleTimeout=10800000,priority=NORMAL,daemonOpts=--add-opens,java.base/java.util=ALL-UNNAMED,--add-opens,java.base/java.lang=ALL-UNNAMED,--add-opens,java.base/java.lang.invoke=ALL-UNNAMED,--add-opens,java.base/java.util=ALL-UNNAMED,--add-opens,java.prefs/java.util.prefs=ALL-UNNAMED,--add-opens,java.prefs/java.util.prefs=ALL-UNNAMED,--add-opens,java.base/java.nio.charset=ALL-UNNAMED,--add-opens,java.base/java.net=ALL-UNNAMED,--add-opens,java.base/java.util.concurrent.atomic=ALL-UNNAMED,-Xmx2048m,-Dfile.encoding=UTF-8,-Duser.country=US,-Duser.language=en,-Duser.variant]
    2022-09-26T21:26:25.100-0500 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire exclusive lock on daemon addresses registry.
    2022-09-26T21:26:25.101-0500 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired on daemon addresses registry.
    2022-09-26T21:26:25.103-0500 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
    2022-09-26T21:26:25.103-0500 [LIFECYCLE] [org.gradle.launcher.daemon.server.Daemon] Daemon server started.
    2022-09-26T21:26:25.104-0500 [DEBUG] [org.gradle.launcher.daemon.bootstrap.DaemonStartupCommunication] Completed writing the daemon greeting. Closing streams...
    2022-09-26T21:26:25.106-0500 [DEBUG] [org.gradle.launcher.daemon.server.Daemon] stopOnExpiration() called on daemon
    2022-09-26T21:26:25.106-0500 [DEBUG] [org.gradle.launcher.daemon.server.Daemon] awaitExpiration() called on daemon
    2022-09-26T21:26:25.106-0500 [DEBUG] [org.gradle.launcher.daemon.server.DaemonStateCoordinator] daemon is running. Sleeping until state changes.
    ----- End of the daemon log -----
    

    I guess I'd like to know if there's any way to make this sync work with Kill Switch enabled, or if it's even supposed to be working already. I've looked into proxying (though I barely know what's up there), and I saw that for Windows and Android (ironically), split tunneling is supported that I could maybe use, except it's not supported on Mac. Not sure.

    Worst case, maybe I just disable Kill Switch? But I like the idea of no leaks, and I don't have this issue on other VPNs. But like... I like Proton, so I'm interested in figuring this out.

    opened by aormsby 0
  • Please give more techincal details on kill switch issue

    Please give more techincal details on kill switch issue

    We are happy to answer your questions about the code or discuss technical ideas.

    Please complete the following checklist (by adding [x]):

    • [x] I have searched open and closed issues for duplicates
    • [x] This isn't a feature request
    • [x] This is not a report about my app not working as expected

    I have searched for ever to figure out why my macbook kept crashing in the watchdog driver. After a lot of digger I have come to the conclusion it is because of this: https://protonvpn.com/support/macos-t2-chip-kill-switch/

    It would be really helpful if you would supply more technical information so that people can find the issue. Your application crashes the watchdog driver which causes a CPU panic.

    opened by ph00lt0 0
Owner
ProtonVPN
ProtonVPN
The official iOS client library for api.video

api.video iOS client api.video is the video infrastructure for product builders.

api.video 8 Dec 2, 2022
🌏 A zero-dependency networking solution for building modern and secure iOS, watchOS, macOS and tvOS applications.

A zero-dependency networking solution for building modern and secure iOS, watchOS, macOS and tvOS applications. ?? TermiNetwork was tested in a produc

Bill Panagiotopoulos 90 Dec 17, 2022
Bonjour networking for discovery and connection between iOS, macOS and tvOS devices.

Merhaba Bonjour networking for discovery and connection between iOS, macOS and tvOS devices. Features Creating Service Start & Stop Service Stop Brows

Abdullah Selek 67 Dec 5, 2022
OAuth2 framework for macOS and iOS, written in Swift.

OAuth2 OAuth2 frameworks for macOS, iOS and tvOS written in Swift 5.0. ⤵️ Installation ?? Usage ?? Sample macOS app (with data loader examples) ?? Tec

Pascal Pfiffner 1.1k Jan 8, 2023
MQTT for iOS and macOS written with Swift

CocoaMQTT MQTT v3.1.1 client library for iOS/macOS/tvOS written with Swift 5 Build Build with Xcode 11.1 / Swift 5.1 Installation CocoaPods Install us

EMQ X MQTT Broker 1.4k Jan 1, 2023
Socket framework for Swift using the Swift Package Manager. Works on iOS, macOS, and Linux.

BlueSocket Socket framework for Swift using the Swift Package Manager. Works on iOS, macOS, and Linux. Prerequisites Swift Swift Open Source swift-5.1

Kitura 1.3k Dec 26, 2022
A delightful networking framework for iOS, macOS, watchOS, and tvOS.

AFNetworking is a delightful networking library for iOS, macOS, watchOS, and tvOS. It's built on top of the Foundation URL Loading System, extending t

AFNetworking 33.3k Jan 5, 2023
ZeroMQ Swift Bindings for iOS, macOS, tvOS and watchOS

SwiftyZeroMQ - ZeroMQ Swift Bindings for iOS, macOS, tvOS and watchOS This library provides easy-to-use iOS, macOS, tvOS and watchOS Swift bindings fo

Ahmad M. Zawawi 60 Sep 15, 2022
A networking library for iOS, macOS, watchOS and tvOS

Thunder Request Thunder Request is a Framework used to simplify making http and https web requests. Installation Setting up your app to use ThunderBas

3 SIDED CUBE 16 Nov 19, 2022
Kiwix for offline access on iOS and macOS

Kiwix for iOS & macOS This is the home for Kiwix apps on iOS and macOS. Mobile app for iPads & iPhones Download the iOS mobile app on iTunes App Store

Kiwix 299 Dec 21, 2022
Lightweight library for web server applications in Swift on macOS and Linux powered by coroutines.

Why Zewo? • Support • Community • Contributing Zewo Zewo is a lightweight library for web applications in Swift. What sets Zewo apart? Zewo is not a w

Zewo 1.9k Dec 22, 2022
A tool to build projects on MacOS and a remote linux server with one command

DualBuild DualBuild is a command line tool for building projects on MacOS and a remote Linux server. ##Setup Install the repository git clone https://

Operator Foundation 0 Dec 26, 2021
This generic SOAP client allows you to access web services using a your iOS app, Mac OS X app and AppleTV app.

This generic SOAP client allows you to access web services using a your iOS app, Mac OS X app and Apple TV app. With this Framework you can create iPh

Prioregroup.com 479 Nov 22, 2022
The civilized way to write REST API clients for iOS / macOS

The elegant way to write iOS / macOS REST clients Drastically simplifies app code by providing a client-side cache of observable models for RESTful re

Bust Out 2.2k Nov 20, 2022
Super lightweight async HTTP server library in pure Swift runs in iOS / MacOS / Linux

Embassy Super lightweight async HTTP server in pure Swift. Please read: Embedded web server for iOS UI testing. See also: Our lightweight web framewor

Envoy 540 Dec 15, 2022
Access the native iOS / macOS reminders (get, update, delete) in TiDev / Titanium.

Titanium iOS Reminders API Access the native iOS reminders (get, update, delete) in TiDev / Titanium. Requirements The NSRemindersUsageDescription pri

Hans Knöchel 5 Nov 28, 2021
Minecraft server RCON client for iOS/macOS

iRCON Minecraft server RCON client for iOS/macOS. Features Full remote console window Player list with ability to easily op, kick, ban, etc. Quickly s

JackMacWindows 7 Dec 26, 2022
Simple Wi-Fi analyzer for macOS

Wandra Simple Wi-Fi analyzer for macOS built in SwiftUI. It displays your Signal to Noise Ratio and Received Signal Strength. Basestation SSID and MAC

Mikael Löfgren 15 Dec 29, 2022
A macOS application for browsing the IOKit registry.

IOBrowser About A macOS application for browsing the IOKit registry. License Project is released under the terms of the MIT License. Repository Infos

JD Gadina 128 Jan 1, 2023