Skip to content
/ Appz Public

📱 Launch external apps, and deeplink, with ease using Swift!

License

Notifications You must be signed in to change notification settings

SwiftKitz/Appz

Repository files navigation

Appz 📱

Deeplinking to external applications made easy

Version Version Swift Platforms Carthage Supported Apps

Highlights

  • Web Fallback Support:
    In case the app can't open the external application, it will fall-back to a web URL that is guaranteed to succeed by opening the browser.

  • Isolated App Specs:
    It was crucial to make sure the library can scale as the number of supported apps increase. Therefor, each supported app is implemented in isolation in a separate file.

  • Full Autocomplete Support: The API has been carefully designed to make the most out of auto complete features, so you don't even have to peak into any docs or code!

  • Full Testing:
    To make the specs as transparent as possible, the library has tests to make sure every external application action has tests with the expected results.

Features

You can try them in the playground shipped with the framework!

Concise syntax to trigger deep linking:

let app = UIApplication.shared
app.canOpen(Applications.Instagram())
app.open(Applications.AppStore(), action: .account(id: "395107918"))
app.open(Applications.AppSettings(), action: .open)

Transparent web fallback:

// In case the user doesn't have twitter installed, it will fallback to
// https://twitter.com/testUser/statuses/2
app.open(Applications.Twitter(), action: .status(id: "2",  screenName: "testUser"))

Add your applications:

// Applications are recommended to be part of the
// "Applications" namespace
extension Applications {
    // Define your application as a type that
    // conforms to "ExternalApplication"
    struct MyApp: ExternalApplication {

        typealias ActionType = Applications.MyApp.Action

        let scheme = "myapp:"
        let fallbackURL = ""
        let appStoreId = ""
    }
}
// Then, you define the actions your app supports
extension Applications.MyApp {

    enum Action: ExternalApplicationAction {

        case open

        // Each action should provide an app path and web path to be
        // added to the associated URL
        var paths: ActionPaths {

            switch self {
            case .open:
                return ActionPaths()
            }
        }
    }
}

app.open(Applications.MyApp(), action: .open)

Supported Apps (for now!):

App Actions
AirLaunch Open
AliExpress Open
AllCast Open
AppleMaps Open
AppSettings Open
AppStore Developer, App, Rate App
AppleWatch Open
Audible Open
Ayah Open
Behance Open, UserProfile
BNR Open
Box Open
Buzzfeed Open
Calendars5 Open
Camera360 Open
Careem Open
Chromecast Open
CirclePay Open, Request, Send
Clips Open
Cnet Open
CNN Open
Currency Open
DailyMotion Open
DamaKing Open
DayCost Open
DayOne Open
Diigo Open
Documents Open
Dropbox Open
Duolingo Open
eBay Open
Echofon Open
Epson Open
Everypost Open
EyeEm Open
Facebook Open, Profile, Notification, Feed, Page, Action
FaceTime Video Call
FaceTime audio Audio Call
Feedly Open
FileApp Open
FindFriends Open
FindiPhone Open
Fitbit Open
Flickr Open
Flipboard Open
FlippsTV Open
Forest Open
Foursquare Open
FriendlySocial Open
Gallery Open
Glympse Open
GoogleCalendar Open, CreateEvent
GoogleChrome Open
GoogleDocs Open
GoogleDrive Open
GoogleEarth Open
GoogleMail Open
GoogleMaps Open, Display Directions, Display Location, Search
GooglePhotos Open
GooglePlus Open
GoogleSheets Open
GoogleSlides Open
GoogleTranslate Open
GroupeMe Open
Heapo Open
HootSuite Open
iBooks Open
IMDb Open, Search, Title, Boxoffice, Showtimes, Feature Coming Soon, Feature Best Picture, Feature Born Today, Top rated movies, Most popular movies.
iMovie Open
INRIXTraffic Open
Instagram Open, Camera, Library, Media, Username, Location, Tag
Instapaper Open
iShows Open
iTranslate Open, Translate
iTunesU Open
KakaoTalk Open
Kayak Open
Keeper Open
Kik Open
LastPass Open
Line Open
Linkedin Open
Mail Compose
Marktplaats Open
Marvis Open
Meerkat Open
Messages SMS
MobileMouse Open
Mopico Open
Moves Open
Music Open
MyFitnessPal Open
NameShark Open
Netflix Open
Notes Open
NPORadio Open
NU.nl Open
NYTimes Open
OneMorething Open
OneDrive Open
OnePassword Open
Outlook Open, Compose
Paypal Open
Periscope Open
Phone Open
Photos Open
PicCollage Open
Pinterest Open, UserProfile, Search
Pocket Open
Podcasts Open
Quora Open
Radium Open
RemindersApp Open
Remote Open
Rijnmond Open
RoboForm Open
RunKeeper Open
ScannerPro Open
Simplenote Open
Skitch Open
Skype Open
Slack Open, Channel, Direct Message, Open File, Search
Snapchat Open, Add
Snapseed Open
Songpop2 Open
Sonos Open
Soundflake Open
Spark Compose
StitcherRadio Open
Strava Open
SubwayKorea Open
SunriseCalendar Open
Swarm Open
Super-Stickman-Golf-2 Open
Talabat Open
Tango Open
Ted Open
Telegram Open, SMS, openFromID
TestFlight Open
Tinder Open
Trello Open
Tubex Open
Tumblr Open, Dashboard, Explore, Activity, Blog, Tag
Tweetbot Timeline, Post, Mentions, Lists, Retweets, Favorites, Messages, Status, Search, Profile, Follow, Unfollow, Favorite, Unfavorite, Retweet, List
Twitter Status, UserHandle, UserId, List, Post, Search, Timeline, Mentions, Messages
Twitterrific Open, MentionsView, MessagesView, FavoritesView, Search, TweetID, MessageID, Post, UserProfile
Uber Open
Unread Open
Ustream Open
Viber Open Calls Tab, Open Chats Tab
Videos Open
Views Open
Vimeo Open
Vine Open, Popular Timelines
VIPAccess Open
Vox Open
Voxer Open
VSCO Open
Wallet Open
Waze Open, NavigateToDirection
WeChat Open
Weibo Open
WhatsApp Open
Whyd Open
Wikipanion Open
WordPress Open
Workflow Open
Yammer Open
Yelp Open, Search, Search Location, Search Category, Search Category Location, Business
Youtube Open, Open Video
FRIL Open

Getting Started

Configure Info.plist

You must add the schemes you want to use to your app's info.plist file under LSApplicationQueriesSchemes. See here for more.

Carthage

Carthage is fully supported. Simply add the following line to your Cartfile:

github "SwiftKitz/Appz"

Cocoapods

Cocoapods is fully supported. Simply add the following line to your Podfile:

pod 'Appz'

Submodule

For manual installation, you can grab the source directly or through git submodules, then simply:

  • Drop the Appz.xcodeproj file as a subproject (make sure Copy resources is not enabled)
  • Navigate to your root project settings. Under "Embedded Binaries", click the "+" button and select the Appz.framework

Motivation

I've gone through way too much pain than I am willing to admit integrating deeplinking in my app. It is very easy to forget calling canOpenURL or missing a colon somewhere. Another pain point was savaging the web for all the different specs for different applications.

With this library, you can keep the external application deep linking spec separately and rest assured as it is open source and maintained by the wonderful github community!

Author

Mazyod (@Mazyod)

Contributors

This library could not have made it so far without the generous contributions of various developers!

License

Appz is released under the MIT license. See LICENSE for details.