Branch.io initSession 返回空的引用参数 json

Posted

技术标签:

【中文标题】Branch.io initSession 返回空的引用参数 json【英文标题】:Branch.io initSession returns empty referringParams json 【发布时间】:2018-01-18 15:55:15 【问题描述】:

先决条件 1. App以LinkActivity启动,此时我们没有deep link intent,没关系。

    主要活动已启动。在那里我们可以点击深层链接。 通过点击深层链接打开LinkActivity,uri是正确的,referringParams json不为空(ok)。但是... 当我们重播第 2 步时:uri 正确,但引用参数为空:“”;所有其他尝试都具有相同的结果。

仅当我们暂停应用程序(例如切换到最近的应用程序菜单)然后返回应用程序时 - 深层链接按预期工作,但仅在第一次尝试时。会话关闭可能存在一些问题(但在当前版本的 sdk 中,它可以自行控制会话关闭)

public class LinkActivity extends AppCompatActivity 

        private static final String TAG = LinkActivity.class.getSimpleName();

        @Override
        protected void onNewIntent(Intent intent) 
            setIntent(intent);
        

        @Override
        protected void onStart() 
            super.onStart();

            Uri uri = getIntent().getData();

            Log.w(TAG, "uri: " + uri);

            Branch.getInstance().initSession(new Branch.BranchReferralInitListener() 
                @Override
                public void onInitFinished(JSONObject referringParams, BranchError error) 
                    Log.w(TAG, "json: " + referringParams);
                    startActivity(new Intent(LinkActivity.this, MainActivity.class));
                
            , uri, this);
        
    

    public class MainActivity extends AppCompatActivity 

        @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        
    

    public class BranchApplication extends Application 

        @Override
        public void onCreate() 
            super.onCreate();
            Branch.enableLogging();
            Branch.getAutoInstance(this);
        
    

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.test.myapp">

        <uses-permission android:name="android.permission.INTERNET"/>

        <application
            android:name=".BranchApplication"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">

            <activity android:name=".LinkActivity">

                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>

                <intent-filter android:autoVerify="true">
                    <action android:name="android.intent.action.VIEW" />

                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />

                    <data
                        android:host="myapp.link"
                        android:scheme="https" />
                </intent-filter>
            </activity>

            <activity android:name=".MainActivity"/>

            <meta-data
                android:name="io.branch.sdk.BranchKey"
                android:value="@string/branch_io_live_key" />

            <meta-data
                android:name="io.branch.sdk.BranchKey.test"
                android:value="@string/branch_io_test_key" />

            <meta-data
                android:name="io.branch.sdk.TestMode"
                android:value="false" />
        </application>
    </manifest>

实现“io.branch.sdk.android:library:2.14.3”

更新: 即使使用 android:launchMode="singleInstance" 进行 LinkActivity 钢再现(我认为不是这种情况)。

更新2: Bhardwaj 提到我们通过 getAutoInstance 初始化 Branch 时不需要调用 initSession。但是在这种情况下如何从 uri 中获取 refferingParams 呢?

更新3: 来自 Branch.checkIntentForSessionRestart 文档:

检查强制会话重启。分支会话重新启动,如果 传入意图将 branch_force_new_session 设置为 true。这是 用于支持在应用程序已经运行时打开深层链接路径 在前台。例如在应用程序中单击推送通知 前景。

所以,我想要的行为符合这个描述。但是如何强制会话重启?

【问题讨论】:

【参考方案1】:

你可以尝试如下:-

Branch.getAutoInstance(this) -> Branch.getAutoInstance(this, true)
Branch.getInstance(context) -> Branch.getInstance()
Do not call initSession when you have getAutoInstance()

【讨论】:

如何在没有initSession的情况下检索分支链接数据(referringParams)?【参考方案2】:
 if(!initiatedBranchDeepLinks) 
        // Configure Branch.io
        initiatedBranchDeepLinks = true;
        Branch branch = Branch.getInstance();
        branch.initSession(new Branch.BranchReferralInitListener()
            @Override
            public void onInitFinished(JSONObject referringParams, BranchError error) 
                if (error == null) 
                    // params are the deep linked params associated with the link that the user clicked -> was re-directed to this app
                    // params will be empty if no data found
                    // ... insert custom logic here ...
                    String message = "Branch.io onInitFinished. Params: " + referringParams.toString();
                    Log.d(TAG, message);

                 else 
                    Log.i(TAG, error.getMessage());
                
            
        , this.getIntent().getData(), this);
    

这是 Branch Test Bed 应用程序: https://github.com/BranchMetrics/android-branch-deep-linking/tree/master/Branch-SDK-TestBed

你可以以此为参考,看看你做错了什么。

【讨论】:

【参考方案3】:

这可能是由您的清单配置引起的。在您的&lt;activity&gt; 标签中,您应该包含android:launchMode="singleTask"。请参阅我们docs 的这一部分。这可以解释为什么您第一次收到参数,但重新打开时没有收到。

【讨论】:

以上是关于Branch.io initSession 返回空的引用参数 json的主要内容,如果未能解决你的问题,请参考以下文章

Branch.io 使用时返回 Branch.getInstance().setIdentity("your_user_id");

Branch.io 返回“会话初始化已经发生”错误消息

在 Branch.io 中,如何在 facebook 中发布带有查询参数的深层链接

Branch.initSession 函数未命中

Branch.io 事件记录

Branch.io 通过安装传递自定义数据