A splendid route-matching, block-based way to handle your deep links.

Overview

DeepLink Kit

CI Status Coverage Status Version License Platform

Overview

DeepLink Kit is a splendid route-matching, block-based way to handle your deep links. Rather than decide how to format your URLs, parse them, pass data, and navigate to specific content or perform actions, this library and a few lines of code will get you on your way.

Full Documentation

Guide to add Universal Links to your app

Check it out

Try the DeepLinkKit sample project by running the following command:

pod try "DeepLinkKit"

Installation

CocoaPods

DeepLinkKit is available through CocoaPods. To install the library, simply add the following line to your Podfile:

pod "DeepLinkKit"

Carthage

To install via Carthage, add the following line to your Cartfile:

github "button/DeepLinkKit"

Other

If you don't use CocoaPods or Carthage, you can include all of the source files from the DeepLinkKit directory in your project.

Usage

Add deep link support to your app in 5 minutes or less following these simple steps.

Note: As of 1.0.0, all imports should be updated to import .

1. Make sure you have a URL scheme registered for your app in your Info.plist

2. Import DeepLinkKit

#import <DeepLinkKit/DeepLinkKit.h>

3. Create an instance of DPLDeepLinkRouter in your app delegate

- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  self.router = [[DPLDeepLinkRouter alloc] init];

  return YES;
}

4. Register a route handler

Objective-C

self.router[@"/log/:message"] = ^(DPLDeepLink *link) {
  NSLog(@"%@", link.routeParameters[@"message"]);
};

Swift

self.router.register("/log/:message") { link in
    if let link = link {
        print("\(link.routeParameters["message"])")
    }
}

5. Pass incoming URLs to the router

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {

  return [self.router handleURL:url withCompletion:NULL];
}

6. Passing NSUserActivity objects to the router (optional)

Note: If your application supports Apple's new universal links, implement the following in your app delegate:

- (BOOL)application:(UIApplication *)application
        continueUserActivity:(NSUserActivity *)userActivity
          restorationHandler:(void (^)(NSArray *))restorationHandler {

    return [self.router handleUserActivity:userActivity withCompletion:NULL];
}

Learn more about the DeepLinkKit by reading our Integration Guide.

Route Registration Examples

URLs coming into your app will be in a similar format to the following: :// / /

When registering routes, it's important to note that the first forward slash in your registered route determines the start of the path to be matched. A route component before the first forward slash will be considered to be the host.

Say you have an incoming URL of twitter://timeline

// Matches the URL.
router[@"timeline"] = ^{ … }

// Does not match the URL.
router[@"/timeline"] = ^{ … }

In another example, a URL of twitter://dpl.com/timeline

// Matches the URL.
router[@"/timeline"] = ^{ … }

// Does not match the URL.
router[@"timeline"] = ^{ … }

You can also be scheme specific. If you support multiple URL schemes in your app, you can register routes specific to those schemes as follows:

An incoming URL of scheme-one://timeline

// Matches the URL.
router[@"scheme-one://timeline"] = ^{ … }

// Does not match the URL.
router[@"scheme-two://timeline"] = ^{ … }

Regex Route Matching

You can use regex in your route patterns as well to give you maximum flexibility.

Match any url

The following will match all incoming urls

router[@".*"] ^(DPLDeepLink *link){
  // This will match all incoming links
}

Note: Routes are matched in the order they're registered so registering this route first will prevent all other more specific routes from matching.

Match any url with a given scheme

The following will match all incoming links with the scheme, myscheme://

router[@"myscheme://.*"] ^(DPLDeepLink *link){
  // matches all urls with a scheme of `myscheme://`
}

You can name your regex groups too

The following will match any url with a host of trycaviar.com and hand you :path in the route params.

@"manhattan/nicoletta-297" } ">
// Given the url ‘https://trycaviar.com/manhattan/nicoletta-297`
router[@"trycaviar.com/:path(.*)"] ^(DPLDeepLink *link){
  // `link[@"path"]` => @"manhattan/nicoletta-297"
}

Match multiple path components

In this example, you'll get :city and :restaurant in the route params.

@"manhattan" // `link[@"restaurant"]` => @"nicoletta-297" } ">
// Given the url ‘https://trycaviar.com/manhattan/nicoletta-297`
router[@"trycaviar.com/:city([a-zA-Z]+)/:restaurant(.*)"] ^(DPLDeepLink *link){
  // `link[@"city"]` => @"manhattan"
  // `link[@"restaurant"]` => @"nicoletta-297"
}

If the restaurant ids are numbers, you could limit your matches as follows.

@"manhattan" // `link[@"restaurant"]` => @"297" } ">
// Given the url ‘https://trycaviar.com/manhattan/297`
router[@"trycaviar.com/:city([a-zA-Z]+)/:restaurant([0-9])"] ^(DPLDeepLink *link){
  // `link[@"city"]` => @"manhattan"
  // `link[@"restaurant"]` => @"297"
}

Name some groups and not others

@"manhattan" // `link[@"restaurant"]` => @"nicoletta-297" } ">
// Lets say the url is ‘https://trycaviar.com/manhattan/pizza/nicoletta-297`
router[@"trycaviar.com/:city([a-zA-Z]+)/[a-z]+/:restaurant(.*)"] ^(DPLDeepLink *link){
  // `link[@"city"]` => @"manhattan"
  // `link[@"restaurant"]` => @"nicoletta-297"
}

The above would match ‘https://trycaviar.com/manhattan/pizza/nicoletta-297’ but not ‘https://trycaviar.com/manhattan/PIZZA/nicoletta-297’ or ‘https://trycaviar.com/manhattan/pizza-places/nicoletta-297’, etc

AppLinks Support

Does your app support AppLinks? You can easily handle incoming AppLinks by importing the AppLinks category DPLDeepLink+AppLinks. The AppLinks category provides convenience accessors to all AppLinks 1.0 properties.

router[@"/timeline"] = ^(DPLDeepLink *link) {
  NSURL *referrerURL  = link.referralURL;
  NSString *someValue = link.extras[@"some-key"];
}

Running the Demo

To run the example project, run pod try DeepLinkKit in your terminal. You can also clone the repo, and run pod install from the project root. If you don't have CocoaPods, begin by follow this guide.

There are two demo apps, SenderDemo, and ReceiverDemo. ReceiverDemo has some registered routes that will handle specific deep links. SenderDemo has a couple actions that will deep link out to ReceiverDemo for fulfillment.

Run theSenderDemo build scheme first, then stop the simulator and switch the build scheme to ReceiverDemo and run again. Now you can switch back to the SenderDemo app in the simulator and tap on one of the actions.

Creating Deep Links

You can also create deep links with DPLMutableDeepLink. Between two DeepLinkKit integrated apps, you can pass complex objects via deep link from one app to another app and easily get that object back on the other end.

In the first app:

DPLMutableDeepLink *link = [[DPLMutableDeepLink alloc] initWithString:@"app-two://categories"];
link[@"brew-types"] = @[@"Ale", @"Lager", @"Stout", @"Wheat"]
link[@"beers"] = @{
  @"ales": @[
    @{
        @"name": @"Southern Tier Pumking Ale",
        @"price": @799
    },
    @{
        @"name": @"Sierra Nevada Celebration Ale",
        @"price": @799
    }
  ],
  @"lagers": @[
     ...
  ],
  ...
}

[[UIApplication sharedApplication] openURL:link.URL];

In the second app:

router[@"categories"] = ^(DPLDeepLink *link) {
  NSArray *brewTypes  = link[@"brew-types"];
  NSDictionary *beers = link[@"beers"];
}

Authors

Wes Smith
Chris Maddern

License

DeepLinkKit is available under the MIT license. See the LICENSE file for more info.

Contributing

We'd love to see your ideas for improving this library. The best way to contribute is by submitting a pull request. We'll do our best to respond to you as soon as possible. You can also submit a new Github issue if you find bugs or have questions. :octocat:

Please make sure to follow our general coding style and add test coverage for new features!

Comments
  • registerHandlerClass function is not there?

    registerHandlerClass function is not there?

    I have been upgrading to swift 3 for the passed hours i have put everything to work, except for DeepLinkKit. I am not able to find the function registerHandlerClass anymore. The weird thing is it is in the DPLDeepLinkRouter.h but when i command click on DeepLinkKit within my own code i get the following:

    dlk

    I am not sure that this is a problem I have or this is a problem in the pod. I have deleted the pods, deleted Podfile.lock, deleted derived data, cleaned my project, everything, but it still doesn't show up. Does anyone know what to do?

    opened by borek2 19
  • Xcode 8.3 beta compilation fails

    Xcode 8.3 beta compilation fails

    On Xcode 8.3 beta (8W109m) compilation fails with the following error : redefinition of module 'DeepLinkKit'

    not sure if it is a DeepLinkKit issue or a Cocoapods issue ..

    opened by taher-mosbah 18
  • Swift inline route registration support

    Swift inline route registration support

    Based off of the discussion from #28, I've added a wrapper class and created a new method for us to register routes in Swift. This now allows developers who are writing Swift code to perform the inline matching:

    self.router["/say/:title/:message"] = DPLRouteHandlerBlockWrapper(routeHandlerBlock: { (deepLink) -> Void in
        if let title = deepLink.routeParameters["title"] as? String,
            message = deepLink.routeParameters["message"] as? String {
                UIAlertView(title: title, message: message, delegate: nil, cancelButtonTitle: "OK").show()
        }
    })
    

    I would love to start a discussion with everyone as to if this is the way we'd like to handle this moving forward. It's merely my first stab at it and would love some feedback so we can get this to the right level of doneness.

    opened by platedbay 14
  • Adds a method to get a Deep Link for a given URL from the Deep Link router

    Adds a method to get a Deep Link for a given URL from the Deep Link router

    This PR adds a method to DPLDeepLinkRouter to get a DPLDeepLink for a given URL, if the router has a route that matches the URL. This is in effect saying “can the router handle this URL?” (but we thought it’d be more useful to return the deep link, if it exists). The method returns nil if the URL cannot be handled.

    opened by jbrennan 12
  • Swift Port

    Swift Port

    Hey guys,

    First of all, thank you very much for this framework. It saves us so much time I can't thank you enough.

    I know this is a delicate subject, there are those that are forward and against this, but do you guys plan on doing a Swift port of the framework?

    opened by fjcaetano 10
  • Fixes DPLRouteMatcher Incorrectly Matching URL Without Host or Path

    Fixes DPLRouteMatcher Incorrectly Matching URL Without Host or Path

    Closes #114

    See details at #114. This prevents a URL with just a scheme from being matched to a route that has a single variable. The example given at #114 is the following route registration:

    self.router[@":log_message"] = ^(DPLDeepLink *link) {
        NSLog(@"%@", link[@"log_message"]);
    };
    

    This should properly log hello for the URL dpl://hello in the ReceiverDemo sample project. The block, however, should not execute for dpl://. Before this change, it would execute and log the string (null)(null).

    selected for review 
    opened by mliberatore 9
  • WIP: internal router

    WIP: internal router

    This is the very first take into trying to extract an internal router as said in #60

    I feel the code is a bit cluttered, I don't know. I specially don't like to pass pointers of pointers to anything other then NSError.

    Any suggestions on how to improve this?

    selected for review 
    opened by alcarvalho 9
  • Allow routes to be filtered by hosts

    Allow routes to be filtered by hosts

    Allow routes to be filtered by hosts, or allow a route to match only a host value.

    For example 'twitter://timeline' would be matched with a route of '[timeline]' http://wiki.akosma.com/IPhone_URL_Schemes#Twitter

    opened by zimmpatrick 8
  • Lower deployment target for `DeepLinkKit` build target

    Lower deployment target for `DeepLinkKit` build target

    The iOS deployment target for the DeepLinkKit build target was set to 10.3. When added as a dependency through Carthage, this will make apps built with lower deployment target crash when running on iOS version lower than 10.3.

    This PR lowers the deployment target to 7.0, consistent with what's specified in the Podspec.

    opened by jou 7
  • Update Slather config

    Update Slather config

    This should reactivate Slather builds on Coveralls.

    My results locally:

    SampleApps/ReceiverDemo/DPLReceiverAppDelegate.m: 17 of 33 lines (51.52%)
    SampleApps/ReceiverDemo/ProductData/DPLProduct.m: 13 of 13 lines (100.00%)
    SampleApps/ReceiverDemo/ProductData/DPLProductDataSource.m: 20 of 36 lines (55.56%)
    SampleApps/ReceiverDemo/ProductDetail/DPLProductDetailViewController.m: 13 of 13 lines (100.00%)
    SampleApps/ReceiverDemo/ProductList/DPLProductTableViewController.m: 0 of 17 lines (0.00%)
    SampleApps/ReceiverDemo/RouteHandlers/DPLProductRouteHandler.m: 5 of 5 lines (100.00%)
    SampleApps/ReceiverDemo/SupportingFiles/main.m: 5 of 5 lines (100.00%)
    Test Coverage: 60.16%
    Slathered
    

    Note: it looks like DPLProductTableViewController.m needs some tests :smile:

    opened by dasmer 7
  • Use as internal router

    Use as internal router

    I would like to use this library as an internal router, too. Has anyone used for this yet?

    In my view, for this use case, it would be nice to have a method in DPLDeepLinkRouter that returns the configured ViewController for a URL. To make it easier customizing transitions or even setting cached values on the target ViewController.

    Another thing that may help is to separate the logic for matching and creating the DPLDeepLink. With this I could subclass the DPLDeepLinkRouter to make the above mentioned functionality available much easier.

    Any thoughts on this? I could do it and create PR.

    opened by alcarvalho 7
  • Bump nokogiri from 1.10.8 to 1.13.9

    Bump nokogiri from 1.10.8 to 1.13.9

    Bumps nokogiri from 1.10.8 to 1.13.9.

    Release notes

    Sourced from nokogiri's releases.

    1.13.9 / 2022-10-18

    Security

    Dependencies

    • [CRuby] Vendored libxml2 is updated to v2.10.3 from v2.9.14.
    • [CRuby] Vendored libxslt is updated to v1.1.37 from v1.1.35.
    • [CRuby] Vendored zlib is updated from 1.2.12 to 1.2.13. (See LICENSE-DEPENDENCIES.md for details on which packages redistribute this library.)

    Fixed

    • [CRuby] Nokogiri::XML::Namespace objects, when compacted, update their internal struct's reference to the Ruby object wrapper. Previously, with GC compaction enabled, a segmentation fault was possible after compaction was triggered. [#2658] (Thanks, @​eightbitraptor and @​peterzhu2118!)
    • [CRuby] Document#remove_namespaces! now defers freeing the underlying xmlNs struct until the Document is GCed. Previously, maintaining a reference to a Namespace object that was removed in this way could lead to a segfault. [#2658]

    sha256 checksums:

    9b69829561d30c4461ea803baeaf3460e8b145cff7a26ce397119577a4083a02  nokogiri-1.13.9-aarch64-linux.gem
    e76ebb4b7b2e02c72b2d1541289f8b0679fb5984867cf199d89b8ef485764956  nokogiri-1.13.9-arm64-darwin.gem
    15bae7d08bddeaa898d8e3f558723300137c26a2dc2632a1f89c8574c4467165  nokogiri-1.13.9-java.gem
    f6a1dbc7229184357f3129503530af73cc59ceba4932c700a458a561edbe04b9  nokogiri-1.13.9-x64-mingw-ucrt.gem
    36d935d799baa4dc488024f71881ff0bc8b172cecdfc54781169c40ec02cbdb3  nokogiri-1.13.9-x64-mingw32.gem
    ebaf82aa9a11b8fafb67873d19ee48efb565040f04c898cdce8ca0cd53ff1a12  nokogiri-1.13.9-x86-linux.gem
    11789a2a11b28bc028ee111f23311461104d8c4468d5b901ab7536b282504154  nokogiri-1.13.9-x86-mingw32.gem
    01830e1646803ff91c0fe94bc768ff40082c6de8cfa563dafd01b3f7d5f9d795  nokogiri-1.13.9-x86_64-darwin.gem
    8e93b8adec22958013799c8690d81c2cdf8a90b6f6e8150ab22e11895844d781  nokogiri-1.13.9-x86_64-linux.gem
    96f37c1baf0234d3ae54c2c89aef7220d4a8a1b03d2675ff7723565b0a095531  nokogiri-1.13.9.gem
    

    1.13.8 / 2022-07-23

    Deprecated

    • XML::Reader#attribute_nodes is deprecated due to incompatibility between libxml2's xmlReader memory semantics and Ruby's garbage collector. Although this method continues to exist for backwards compatibility, it is unsafe to call and may segfault. This method will be removed in a future version of Nokogiri, and callers should use #attribute_hash instead. [#2598]

    Improvements

    • XML::Reader#attribute_hash is a new method to safely retrieve the attributes of a node from XML::Reader. [#2598, #2599]

    Fixed

    ... (truncated)

    Changelog

    Sourced from nokogiri's changelog.

    1.13.9 / 2022-10-18

    Security

    Dependencies

    • [CRuby] Vendored libxml2 is updated to v2.10.3 from v2.9.14.
    • [CRuby] Vendored libxslt is updated to v1.1.37 from v1.1.35.
    • [CRuby] Vendored zlib is updated from 1.2.12 to 1.2.13. (See LICENSE-DEPENDENCIES.md for details on which packages redistribute this library.)

    Fixed

    • [CRuby] Nokogiri::XML::Namespace objects, when compacted, update their internal struct's reference to the Ruby object wrapper. Previously, with GC compaction enabled, a segmentation fault was possible after compaction was triggered. [#2658] (Thanks, @​eightbitraptor and @​peterzhu2118!)
    • [CRuby] Document#remove_namespaces! now defers freeing the underlying xmlNs struct until the Document is GCed. Previously, maintaining a reference to a Namespace object that was removed in this way could lead to a segfault. [#2658]

    1.13.8 / 2022-07-23

    Deprecated

    • XML::Reader#attribute_nodes is deprecated due to incompatibility between libxml2's xmlReader memory semantics and Ruby's garbage collector. Although this method continues to exist for backwards compatibility, it is unsafe to call and may segfault. This method will be removed in a future version of Nokogiri, and callers should use #attribute_hash instead. [#2598]

    Improvements

    • XML::Reader#attribute_hash is a new method to safely retrieve the attributes of a node from XML::Reader. [#2598, #2599]

    Fixed

    • [CRuby] Calling XML::Reader#attributes is now safe to call. In Nokogiri <= 1.13.7 this method may segfault. [#2598, #2599]

    1.13.7 / 2022-07-12

    Fixed

    XML::Node objects, when compacted, update their internal struct's reference to the Ruby object wrapper. Previously, with GC compaction enabled, a segmentation fault was possible after compaction was triggered. [#2578] (Thanks, @​eightbitraptor!)

    1.13.6 / 2022-05-08

    Security

    • [CRuby] Address CVE-2022-29181, improper handling of unexpected data types, related to untrusted inputs to the SAX parsers. See GHSA-xh29-r2w5-wx8m for more information.

    ... (truncated)

    Commits
    • 897759c version bump to v1.13.9
    • aeb1ac3 doc: update CHANGELOG
    • c663e49 Merge pull request #2671 from sparklemotion/flavorjones-update-zlib-1.2.13_v1...
    • 212e07d ext: hack to cross-compile zlib v1.2.13 on darwin
    • 76dbc8c dep: update zlib to v1.2.13
    • 24e3a9c doc: update CHANGELOG
    • 4db3b4d Merge pull request #2668 from sparklemotion/flavorjones-namespace-scopes-comp...
    • 73d73d6 fix: Document#remove_namespaces! use-after-free bug
    • 5f58b34 fix: namespace nodes behave properly when compacted
    • b08a858 test: repro namespace_scopes compaction issue
    • 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 
    opened by dependabot[bot] 0
  • Bump tzinfo from 1.2.5 to 1.2.10

    Bump tzinfo from 1.2.5 to 1.2.10

    Bumps tzinfo from 1.2.5 to 1.2.10.

    Release notes

    Sourced from tzinfo's releases.

    v1.2.10

    TZInfo v1.2.10 on RubyGems.org

    v1.2.9

    • Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a zoneinfo file that includes rules specifying an additional transition to the final defined offset (for example, Africa/Casablanca in version 2018e of the Time Zone Database). #123.

    TZInfo v1.2.9 on RubyGems.org

    v1.2.8

    • Added support for handling "slim" format zoneinfo files that are produced by default by zic version 2020b and later. The POSIX-style TZ string is now used calculate DST transition times after the final defined transition in the file. The 64-bit section is now always used regardless of whether Time has support for 64-bit times. #120.
    • Rubinius is no longer supported.

    TZInfo v1.2.8 on RubyGems.org

    v1.2.7

    • Fixed 'wrong number of arguments' errors when running on JRuby 9.0. #114.
    • Fixed warnings when running on Ruby 2.8. #112.

    TZInfo v1.2.7 on RubyGems.org

    v1.2.6

    • Timezone#strftime('%s', time) will now return the correct number of seconds since the epoch. #91.
    • Removed the unused TZInfo::RubyDataSource::REQUIRE_PATH constant.
    • Fixed "SecurityError: Insecure operation - require" exceptions when loading data with recent Ruby releases in safe mode.
    • Fixed warnings when running on Ruby 2.7. #106 and #111.

    TZInfo v1.2.6 on RubyGems.org

    Changelog

    Sourced from tzinfo's changelog.

    Version 1.2.10 - 19-Jul-2022

    Version 1.2.9 - 16-Dec-2020

    • Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a zoneinfo file that includes rules specifying an additional transition to the final defined offset (for example, Africa/Casablanca in version 2018e of the Time Zone Database). #123.

    Version 1.2.8 - 8-Nov-2020

    • Added support for handling "slim" format zoneinfo files that are produced by default by zic version 2020b and later. The POSIX-style TZ string is now used calculate DST transition times after the final defined transition in the file. The 64-bit section is now always used regardless of whether Time has support for 64-bit times. #120.
    • Rubinius is no longer supported.

    Version 1.2.7 - 2-Apr-2020

    • Fixed 'wrong number of arguments' errors when running on JRuby 9.0. #114.
    • Fixed warnings when running on Ruby 2.8. #112.

    Version 1.2.6 - 24-Dec-2019

    • Timezone#strftime('%s', time) will now return the correct number of seconds since the epoch. #91.
    • Removed the unused TZInfo::RubyDataSource::REQUIRE_PATH constant.
    • Fixed "SecurityError: Insecure operation - require" exceptions when loading data with recent Ruby releases in safe mode.
    • Fixed warnings when running on Ruby 2.7. #106 and #111.
    Commits
    • 0814dcd Fix the release date.
    • fd05e2a Preparing v1.2.10.
    • b98c32e Merge branch 'fix-directory-traversal-1.2' into 1.2
    • ac3ee68 Remove unnecessary escaping of + within regex character classes.
    • 9d49bf9 Fix relative path loading tests.
    • 394c381 Remove private_constant for consistency and compatibility.
    • 5e9f990 Exclude Arch Linux's SECURITY file from the time zone index.
    • 17fc9e1 Workaround for 'Permission denied - NUL' errors with JRuby on Windows.
    • 6bd7a51 Update copyright years.
    • 9905ca9 Fix directory traversal in Timezone.get when using Ruby data source
    • 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 
    opened by dependabot[bot] 0
  • Bump cocoapods-downloader from 1.1.3 to 1.6.3

    Bump cocoapods-downloader from 1.1.3 to 1.6.3

    Bumps cocoapods-downloader from 1.1.3 to 1.6.3.

    Release notes

    Sourced from cocoapods-downloader's releases.

    1.6.3

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.2

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.1

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.0

    Enhancements
    • None.
    Bug Fixes
    • Adds a check for command injections in the input for hg and git.
      orta #124

    1.5.1

    Enhancements
    • None.
    Bug Fixes
    • Fix "can't modify frozen string" errors when pods are integrated using the branch option
      buju77 #10920

    1.5.0

    ... (truncated)

    Changelog

    Sourced from cocoapods-downloader's changelog.

    1.6.3 (2022-04-01)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.2 (2022-03-28)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.1 (2022-03-23)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.0 (2022-03-22)

    Enhancements
    • None.
    Bug Fixes
    • Adds a check for command injections in the input for hg and git.
      orta #124

    1.5.1 (2021-09-07)

    Enhancements
    • None.

    ... (truncated)

    Commits
    • c03e2ed Release 1.6.3
    • f75bccc Disable Bazaar tests due to macOS 12.3 not including python2
    • 52a0d54 Merge pull request #128 from CocoaPods/validate_before_dl
    • d27c983 Ensure that the git pre-processor doesn't accidentally bail also
    • 3adfe1f [CHANGELOG] Add empty Master section
    • 591167a Release 1.6.2
    • d2564c3 Merge pull request #127 from CocoaPods/validate_before_dl
    • 99fec61 Switches where we check for invalid input, to move it inside the download fun...
    • 96679f2 [CHANGELOG] Add empty Master section
    • 3a7c54b Release 1.6.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 
    opened by dependabot[bot] 0
  • Empty query parameter when url containing special character

    Empty query parameter when url containing special character

    Config

    URL test: myapp://path.com/profile/rezé?id=123456

    Result

    registerBlock completion return me a link like : myapp://path.com/profile/rez%C3%A9%3Fid=123456

    So query parameters are empty.

    opened by florianbaudin 0
  • query parameter has base64string

    query parameter has base64string

    like this schema://entry?q=eyJ0eXBlIjoiTUVTU0FHRV9ERVRBSUwiLCJpZCI6Ik00YzNmNmE5Yzc4MjA0ZTE3OTQyZDBiMjdiNjFlZmEyMyIsInN0YXR1cyI6IkVOQUJMRUQiLCJxdWVyeSI6eyJib2R5IjoiQSBnZW50bGUgcmVtaW5kZXIgdGhhdCBTR0QgMTAuMDAgd2lsbCBiZSBkZWR1Y3RlZCBmb3IgdGhlIDJuZCBQYXltZW50IGZvciB5b3VyIG9yZGVyIE8wNTg1OTY5OTg4IG9uIDAxLUF1Zy0yMDIwLiIsImNyZWF0ZVRpbWUiOjE1OTU5OTUyMDAyMDAsImlzUmVhZCI6dHJ1ZSwibWVzc2FnZUlkIjoiTTRjM2Y2YTljNzgyMDRlMTc5NDJkMGIyN2I2MWVmYTIzIiwidGl0bGUiOiJQYXltZW50IFJlbWluZGVyIiwidXNlcklkIjoiVTVEQ0NDNzNDQ0M0ODc2MDAwMTA0MTRGQSJ9fQ==

    opened by TimberTang 1
Releases(1.5.1)
Owner
Button
Powering incredibly connected mobile experiences.
Button
URL routing library for iOS with a simple block-based API

JLRoutes What is it? JLRoutes is a URL routing library with a simple block-based API. It is designed to make it very easy to handle complex URL scheme

Joel Levin 5.6k Jan 6, 2023
🎯Linker Lightweight way to handle internal and external deeplinks in Swift for iOS

Linker Lightweight way to handle internal and external deeplinks in Swift for iOS. Installation Dependency Managers CocoaPods CocoaPods is a dependenc

Maksim Kurpa 128 May 20, 2021
An easier way to handle third-party URL schemes in iOS apps.

IntentKit ========= IntentKit is an easier way to handle third-party URL schemes in iOS apps. Linking to third-party apps is essentially broken on iOS

null 1.8k Dec 24, 2022
An open source library for building deep-linkable SwiftUI applications with composition, testing and ergonomics in mind

Composable Navigator An open source library for building deep-linkable SwiftUI applications with composition, testing and ergonomics in mind Vanilla S

Bahn-X 538 Dec 8, 2022
A deep copy of Pinterest in Swift

Demo YouTube: Demo (2 minutes) 优酷:http://v.youku.com/v_show/id_XMzE3OTc5NDY2MA==.html?spm=a2h3j.8428770.3416059.1 The app is actually smoother than sh

Andy Tong 73 Sep 14, 2022
⛵️ URLNavigator provides an elegant way to navigate through view controllers by URLs.

URLNavigator ⛵️ URLNavigator provides an elegant way to navigate through view controllers by URLs. URL patterns can be mapped by using URLNavigator.re

Suyeol Jeon 2.6k May 27, 2021
Monarch Router is a Declarative URL- and state-based router written in Swift.

Monarch Router is a declarative routing handler that is capable of managing complex View Controllers hierarchy transitions automatically, decoupling View Controllers from each other via Coordinator and Presenters. It fits right in with Redux style state flow and reactive frameworks.

Eliah Snakin 31 May 19, 2021
RxFlow is a navigation framework for iOS applications based on a Reactive Flow Coordinator pattern

About Navigation concerns RxFlow aims to Installation The key principles How to use RxFlow Tools and dependencies GitHub Actions Frameworks Platform L

RxSwift Community 1.5k May 26, 2021
Easy and maintainable app navigation with path based routing for SwiftUI.

Easy and maintainable app navigation with path based routing for SwiftUI.

Freek Zijlmans 278 Jun 7, 2021
DZURLRoute is an Objective-C implementation that supports standard-based URLs for local page jumps.

DZURLRoute Example To run the example project, clone the repo, and run pod install from the Example directory first. Requirements s.dependency 'DZVie

yishuiliunian 72 Aug 23, 2022
Helm - A graph-based SwiftUI router

Helm is a declarative, graph-based routing library for SwiftUI. It fully describ

Valentin Radu 99 Dec 5, 2022
LiteRoute is easy transition for your app. Written on Swift 4

LiteRoute Description LiteRoute is easy transition between VIPER modules, who implemented on pure Swift. We can transition between your modules very e

Vladislav Prusakov 90 Mar 12, 2021
Marshroute is an iOS Library for making your Routers simple but extremely powerful

Marshroute Contents Overview Detailes Tuning the transition animation 3d touch support PeekAndPopUtility Peek and pop state observing Demo Requirement

avito.tech 215 Jan 4, 2023
This is OTPView made by HsynLoyiii in order to use in your login flow or whereever need it.

CustomOTPView This is OTPView made by HsynLoyiii in order to use in your login flow or wherever need it. It can use in IOS 15 and later in SwiftUI pro

Mohamad Hosein Hakimi 2 Jul 12, 2022
Eugene Kazaev 713 Dec 25, 2022
How to handle HelaPay links inside UIWebView and WKWebView

Handling හෙළPay Links Setup Clone this repo. git clone https://github.com/PayHereDevs/helapay-link-handler.git To properly handle හෙළPay Links in you

PayHereDevs 0 Feb 9, 2022
Gradients 🌔 A curated collection of 180 splendid gradients made in swift

Gradients ?? A curated collection of 180 splendid gradients made in swift 180 splendid Gradients inspired by itmeo/webgradients View all the gradients

Gradients 775 Jan 1, 2023
Intuitive cycling tracker app for iOS built with SwiftUI using Xcode. Features live route tracking, live metrics, storage of past cycling routes and many customization settings.

GoCycling Available on the iOS App Store https://apps.apple.com/app/go-cycling/id1565861313 App Icon About Go Cycling is a cycling tracker app built e

Anthony Hopkins 64 Dec 19, 2022
An iOS library to route API paths to objects on client side with request, mapping, routing and auth layers

WANetworkRouting Developed and Maintained by ipodishima Founder & CTO at Wasappli Inc. Sponsored by Wisembly A routing library to fetch objects from a

null 10 Nov 20, 2022
🦁 🃏 📱 An animal matching puzzle card game– built with turn-based game engine boardgame.io and React-Native + React-Native-Web

Matchimals.fun an animal matching puzzle card game ?? ?? ?? Download for iOS from the App Store ?? Download for Android from the Google Play Store ??

iGravity Studios 137 Nov 24, 2022