Firebase Deep Link short URL

99封情书 提交于 2019-12-04 17:18:55

问题


Can the links for Firebase deep links be shortened? Do they have that feature? Links generated are too long and that is not good.


回答1:


UPDATE

Firebase now supports shorten dynamic links programmatically.

I've faced the same problem getting a long and not user friendly URL when creating a dynamic link programmatically.

The solution I've found is to use the Google URL Shortener API that works brilliant. That link points to the Java library, I'm using it in Android, but you can do also a simple http request.

I'll post my Android code in case you need it:

private void createDynamicLink() {
    // 1. Create the dynamic link as usual
    String packageName = getApplicationContext().getPackageName();
    String deepLink = "YOUR DEEPLINK";
    Uri.Builder builder = new Uri.Builder()
            .scheme("https")
            .authority(YOUR_DL_DOMAIN)
            .path("/")
            .appendQueryParameter("link", deepLink)
            .appendQueryParameter("apn", packageName);

    final Uri uri = builder.build();

//2. Create a shorten URL from the dynamic link created.

    Urlshortener.Builder builderShortener = new Urlshortener.Builder (AndroidHttp.newCompatibleTransport(), AndroidJsonFactory.getDefaultInstance(), null);
    final Urlshortener urlshortener = builderShortener.build();

    new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(Void... params) {
            Url url = new Url();
            url.setLongUrl(uri.toString());
            try {
                Urlshortener.Url.Insert insert=urlshortener.url().insert(url);
                insert.setKey("YOUR_API_KEY");
                url = insert.execute();
                Log.e("url.getId()", url.getId());
                return url.getId();
            } catch (IOException e) {
                e.printStackTrace();
                return uri.toString();
            }
        }

        @Override
        protected void onPostExecute(String dynamicLink) {
            Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
            sharingIntent.setType("text/plain");
            sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, getResources().getString(R.string.share_subject));
            sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, dynamicLink);
            startActivity(Intent.createChooser(sharingIntent, getResources().getString(R.string.share_using)));
            Log.e("dynamicLink", dynamicLink);
        }
    }.execute(null, null, null);

}

Hope it helps!!




回答2:


The links can be shortened in the Firebase console in the Dynamic Links tab. Tap on 'New Dynamic Link', which gives you an option to create a short link from an existing link.




回答3:


This can be done programmatically using the Firebase Dynamic Links REST API, for example:

POST https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=api_key
Content-Type: application/json

{
   "longDynamicLink": "https://abc123.app.goo.gl/?link=https://example.com/&apn=com.example.android&ibi=com.example.ios"
}

See https://firebase.google.com/docs/dynamic-links/short-links

And I just had to code it for Android - here's the code in case it helps someone:

at the top of the activity:

lateinit private var dynamicLinkApi: FbDynamicLinkApi

private var remoteCallSub: Subscription? = null // in case activity is destroyed after remote call made

in onCreate (not really but to keep it simple, actually you should inject it):

val BASE_URL = "https://firebasedynamiclinks.googleapis.com/"

val retrofit = Retrofit.Builder().baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io()))
            .build()

dynamicLinkApi = retrofit.create(FbDynamicLinkApi::class.java)

then when it's time to shorten a URL:

remoteCallSub = dynamicLinkApi.shortenUrl(getString(R.string.fbWebApiKey), UrlRo(dynamicLink))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                    { url -> Log.d("Shortened: $url") },
                    { e -> Log.e("APP","Error with dynamic link REST api", e) })

Don't forget to unsubscribe in onDestroy:

override fun onDestroy() {
    super.onDestroy()
    remoteCallSub?.unsubscribe()
}

And here's the classes you need for the dynamic API:

interface FbDynamicLinkApi {
    @POST("v1/shortLinks")
    fun shortenUrl(@Query("key") key: String, @Body urlRo: UrlRo): Observable<ShortUrlRo>
}

data class UrlRo(val longDynamicLink: String, val suffix: SuffixRo = SuffixRo())
data class SuffixRo(val option: String = "UNGUESSABLE")

data class ShortUrlRo(val shortLink: String, val warnings: List<WarningRo>, val previewLink: String)
data class WarningRo(val warningCode: String, val warningMessage: String)



回答4:


Try This , its working fine in my case, https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=[api-key]

{
  "dynamicLinkInfo": {
    "dynamicLinkDomain": "peg3z.app.goo.gl",
    "link": "[Your Long Url Which you want to make short]",
    "androidInfo": {
      "androidPackageName": "com.xyz"//
    },
    "iosInfo": {
      "iosBundleId": "com.dci.xyz"
    }
  }
}

'Content-Type: text/plain'




回答5:


This cannot be done programmatically as of the moment.



来源:https://stackoverflow.com/questions/37549465/firebase-deep-link-short-url

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!