Deeplinks for Stories

Deeplinks for Stories

This guide shows you how to handle deep links in your application and show a story.

The Storyly Dashboard generates a deep link with the application's predefined custom scheme. The application needs to handle the setup of intent handling and route the related URI to Storyly SDK to open the related story.

Open Story

The first way to open the related story is to use the URI which is received from the dashboard:

this.storylyViewController.openStoryUri(String uri)

The second way to open a story is to use story group id and story id as in the function signature:

this.storylyViewController.openStory(String storyGroupId, String storyId)

🚧

Warning

Application can determine from URL's host if it's related with Storyly, host will be storyly for Storyly Dashboard generated deep link URLs.

🚧

Warning

You need to set the URL Scheme for Deep Links field in the Storyly Dashboard -> Settings -> App Settings in order to get the deep links properly from the dashboard.

🚧

Warning

Make sure that the application schema is defined in your application's AndroidManifest.xml file.

🚧

Warning

Make sure that the application schema is defined in your application's Info.plist file.

Brand Domain Usage

This guide shows you how to use your own domain while sharing deeplinks for stories.

πŸ“˜

Before you begin

You need to handle deeplinks in your application as described in Deeplinks for Stories

Normally, when you get the deeplinks from Storyly Dashboard -> Settings -> App Settings, they are in this format: https://open.storyly.io/share/v2/{story_id}.

With following methods, you can use your own domain while sharing a deeplink in this format: https://example.com?id={story_id}.

Here are two methods to handle this on your backend:

package main

import (
	"fmt"
	"log"
	"net/http"
	"net/http/httputil"
	"net/url"
)

func ReProxy(remote *url.URL, p *httputil.ReverseProxy) func(http.ResponseWriter, *http.Request) {
	return func(w http.ResponseWriter, r *http.Request) {
		storyID := r.URL.Query().Get("id")

		if storyID == "" {
			http.NotFound(w, r)
		} else {
			r.Host = remote.Host
			r.URL.Path = fmt.Sprintf("/share/v2/%s", storyID)
			p.ServeHTTP(w, r)
		}
	}
}

func main() {
	remote, err := url.Parse("https://open.storyly.io")
	if err != nil {
		panic(err)
	}

	proxy := httputil.NewSingleHostReverseProxy(remote)

	http.HandleFunc("/", ReProxy(remote, proxy))

	if err := http.ListenAndServe(":9090", nil); err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}
package main

import (
	"fmt"
	"log"
	"net/http"
)

func Redirect(w http.ResponseWriter, r *http.Request) {
	storyID := r.URL.Query().Get("id")

	if storyID == "" {
		http.NotFound(w, r)
	} else {
		redirectionURL := fmt.Sprintf("https://open.storyly.io/share/v2/%s", storyID)
		http.Redirect(w, r, redirectionURL, 302)
	}
}

func main() {
	http.HandleFunc("/", Redirect)

	if err := http.ListenAndServe(":9090", nil); err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

🚧

Warning

Make sure that your URL includes {story_id} as variable to indicate shared story, Storyly SDK will automatically replaces this. Moreover, do not forget the replace it in your backend with correct parameter as shown in samples.

After handling brand domain usage in your backend, you can use the following function in the initialization process:

StorylyParam()
    ...
    ..storylyShareUrl = string