All Projects → MaksimKurpa → Linker

MaksimKurpa / Linker

Licence: mit
🎯 Your easiest way to handle all URLs.

Programming Languages

swift
15916 projects
scheme
763 projects

Labels

Projects that are alternatives of or similar to Linker

Weakify
Provides a way use a method on a class as a closure value that would be referenced by some other component without causing memory leaks.
Stars: ✭ 65 (-49.61%)
Mutual labels:  closure
Gravity
Gravity Programming Language
Stars: ✭ 3,968 (+2975.97%)
Mutual labels:  closure
Gollback
Go asynchronous simple function utilities, for managing execution of closures and callbacks
Stars: ✭ 55 (-57.36%)
Mutual labels:  closure
Selector-Closure
A light way to convert objc target-action style to closure
Stars: ✭ 14 (-89.15%)
Mutual labels:  closure
Closure Stylesheets
A CSS+ transpiler that lints, optimizes, and I18n-izes
Stars: ✭ 304 (+135.66%)
Mutual labels:  closure
Fastexpressioncompiler
Fast ExpressionTree compiler to delegate
Stars: ✭ 631 (+389.15%)
Mutual labels:  closure
objects-hooks-remover
Package to remove WordPress hook callbacks that uses object methods or closures.
Stars: ✭ 44 (-65.89%)
Mutual labels:  closure
Actionclosurable
Extensions which helps to convert objc-style target/action to swifty closures
Stars: ✭ 120 (-6.98%)
Mutual labels:  closure
Arrayy
🗃 Array manipulation library for PHP, called Arrayy!
Stars: ✭ 363 (+181.4%)
Mutual labels:  closure
Pre Short Closures
Stars: ✭ 36 (-72.09%)
Mutual labels:  closure
yii2-facades
Facades for Yii 2
Stars: ✭ 21 (-83.72%)
Mutual labels:  closure
Actionkit
Easy, closure-based Swift methods for working with interactive UIKit elements.
Stars: ✭ 255 (+97.67%)
Mutual labels:  closure
Pmsuperbutton
🔥 PMSuperButton is a powerful UIButton coming from the countryside, but with super powers! 😎
Stars: ✭ 653 (+406.2%)
Mutual labels:  closure
nj
NJ is a simple script engine in golang with Lua-like syntax.
Stars: ✭ 19 (-85.27%)
Mutual labels:  closure
Android Linq
Manipulate collections easily using C# LINQ style queries and Java 8 closures.
Stars: ✭ 76 (-41.09%)
Mutual labels:  closure
Functor
Mappable objects
Stars: ✭ 20 (-84.5%)
Mutual labels:  closure
Closure Library
Google's common JavaScript library
Stars: ✭ 4,294 (+3228.68%)
Mutual labels:  closure
Javascript.anomaly
Examples of not obvious behaviors for javascript beginner programmers
Stars: ✭ 124 (-3.88%)
Mutual labels:  closure
Shadow Build
[DEPRECATED] merged into the thheller/shadow-cljs project
Stars: ✭ 101 (-21.71%)
Mutual labels:  closure
Js Leakage Patterns
🎯这是关于JavaScript内存泄露和CSS优化相关序列文章,相信你读完会有所收获的✈️
Stars: ✭ 756 (+486.05%)
Mutual labels:  closure

Linker

Lightweight way to handle internal and external deeplinks in Swift for iOS.


Installation

Dependency Managers

CocoaPods

CocoaPods is a dependency manager for Cocoa projects. You can install it with the following command:

$ gem install cocoapods

To integrate Linker into your Xcode project using CocoaPods, specify it in your Podfile:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!

pod 'Linker'

Then, run the following command:

$ pod install
Carthage

Carthage is a decentralized dependency manager that automates the process of adding frameworks to your Cocoa application.

You can install Carthage with Homebrew using the following command:

$ brew update
$ brew install carthage

To integrate Linker into your Xcode project using Carthage, specify it in your Cartfile:

github "Linker"

Usage

(see sample Xcode project Demo)

The main thought of this framework is useful and convenient handling of external and internal URLs in your iOS application. Linker provides only one function to install your own handler to specific URL. A dependency between specific URL and your closure is based on scheme and host of each URL. That is you can configure miscellaneous behavior for different components of specific URL. You can split handling by query with different parameters and/or by path, fragment.

Realization details On start of your application occurs swizzling methods in `UIApplication` and `UIApplicationDelegate` of your application. Original implementation exchanged on Linker's implementation, where occur handle process. If Linker can't handle specific URL, original implementation of this method will be called.

Swizzled functions:

UIApplication.shared - openURL:options:completionHandler:

UIApplication.shared - openURL: (deprecated since iOS 10.0)

UIApplication.shared.delegate - application:openURL:options:

UIApplication.shared.delegate - application:openURL:sourceApplication:annotation: (deprecated since iOS 9.0)

UIApplication.shared.delegate - application:handleOpenURL: (deprecated since iOS 9.0)

For complience with URL style, use format:

your_app_url_scheme://inapp_am/buy_subscription?type=subscription&productID=com.yourapp.7days_trial#test

where:

scheme - your_app_url_scheme,

host - inapp_am,

path - buy_subscription

query - type=subscription&productID=com.yourapp.7days_trial

fragment - test

If you don't need configuration with complexed behavior, you can use URL just with host:

your_app_url_scheme://some_host_from_your_app

One special case - handle external URLs when app isn't launched. You should install closure for specific URL and if this url will be in pair with UIApplicationLaunchOptionsKey in launchOptions - this url will be handled.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
{
    let launchURL = URL(string: "linker://launchURL")!
    
    //if launchUrl equal launchOptions?[UIApplicationLaunchOptionsKey.url] -> this closure will be handled after app launch
    Linker.handle(launchURL, closure: { url in
	print("Your URL has been handle!")
    })
        return true
    }

In other cases of usage you should set your handle closure for special URL before calling its from somewhere. If you have a few places where you need handle one specific url, you should reassign closure where latest set closure should have right context.

(!) Notice: Only the last sent closure for a unique URL (scheme + host) will be executed.
class ViewController: UIViewController {
    
    let sourceURL = URL(string: "linker://viewcontroller?title=ExampleAlert&description=ExampleDescriptionAlert")!

    @IBAction func action(_ sender: Any) {
        UIApplication.shared.open(sourceURL, options: [:], completionHandler: nil)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        Linker.handle(sourceURL) { url in
        
            guard let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: true)?.queryItems! else {
                return }
            var title : String? = nil
            var description: String? = nil
            
            for item in queryItems {
                if item.name == "title" {
                    title = item.value
                }
                if item.name == "description" {
                    description = item.value;
                }
            }
            
            if let name = title, let message = description {
                let alertVC = UIAlertController(title: name, message: message, preferredStyle: UIAlertControllerStyle.alert)
                alertVC.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: {action in
                    alertVC.dismiss(animated: true, completion: nil)
                }))
                self.present(alertVC, animated: false, completion: nil)
            }
        }
    }
}

You can also find Objective-C version of this here.

Contributing

Issues and pull requests are welcome!

Author

Maksim Kurpa - @maksim_kurpa

License

This code is distributed under the terms and conditions of the MIT license.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].