Deep Linking with iOS and Android

gorgonaut04 edited this page Jan 4, 2017 · 10 revisions
Clone this wiki locally


  • author: Hunter Knight
  • kivy: >= 1.9.1

Thanks to Python for Dads for the Android tips and ideas for how to handle simultaneous launch of on_resume and on_new_intent.

Also, for iOS you need to Register a Custom URL Scheme, and you'll want to read up on securing inter-app communication

Please note that this is not a complete, working app demo. You need to integrate the functionality of these methods, and particularly the bindings at the bottom during initialization.



from import App
from kivy.core.window import Window
from kivy.clock import Clock

class TestApp(App):

    resuming = False
    processing_uri = False

    def on_pause(self):

        # Handle pause behavior here
        # set resuming to True so on_new_intent will definitely wait for on_resume 
        # to finish
        self.resuming = True

        # Important! on_dropfile events are not received while the event loop is 
        # paused! This ensures that the event loop will resume before any 
        # on_dropfile event is fired. Many Bothans died to  bring us this information...
        if platform == 'ios':
            # Set this to True elsewhere in your code if you are pausing to wait for a 
            # deeplink redirect back to your app (e.g. after FB OAUTH)
            if self.processing_uri:
                self.processing_uri = False
                Clock.schedule_once(self.resume_tasks, -1)
                Clock.schedule_once(self.on_resume, -1)

        return True

    def resume_tasks(self, *args):
        Window._pause_loop = False

    def on_resume(self):
        # In case on_resume and on_new_intent are triggered at launch
        self.resuming = True

        # Handle resume behavior here

        self.resuming = False

    def android_message(self, intent):
        while self.resuming:
        intent_data = intent.getData()
        uri = intent_data.toString()
        # send full URI to a cross-platform function to process

    def ios_message(self, window, uri):
        # send full URI to a cross-platform function to process

    def process_deep_link(self, uri):
        # Validate, parse, do things...

if __name__ == '__main__':
    app_instance = TestApp()
    if platform == 'android':
        import android.activity
    elif platform == 'ios':