Deep Linking with iOS and Android
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.
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.
#!python from kivy.app 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: sleep(0.1) intent_data = intent.getData() uri = intent_data.toString() # send full URI to a cross-platform function to process self.process_deep_link(uri) def ios_message(self, window, uri): # send full URI to a cross-platform function to process self.process_deep_link(uri) def process_deep_link(self, uri): # Validate, parse, do things... pass if __name__ == '__main__': app_instance = TestApp() if platform == 'android': import android.activity android.activity.bind(on_new_intent=app_instance.android_message) elif platform == 'ios': Window.bind(on_dropfile=app_instance.ios_message) app_instance.run()