Branch.io:javascript检测是否安装了移动应用程序

Branch.io:javascript检测是否安装了移动应用程序,javascript,ios,branch.io,Javascript,Ios,Branch.io,我有一个网页,如果安装了本机移动应用程序,我希望在网页上有一个特定链接来打开该应用程序,如果没有,则执行当前正在执行的操作(提交表单) 注意:我认为这与智能横幅不同-我不想在这一页上的横幅。我只想正常的应用程序流,如果没有移动应用程序 我已经在网页和ios应用程序中集成了分支sdk。我已成功设置了从网页到iOS应用程序的深层链接(代码未显示),但在嗅探应用程序是否已安装时,我没有得到预期的结果 以下是我的网页中的代码: branch.init('MY_KEY', null, functi

我有一个网页,如果安装了本机移动应用程序,我希望在网页上有一个特定链接来打开该应用程序,如果没有,则执行当前正在执行的操作(提交表单)

注意:我认为这与智能横幅不同-我不想在这一页上的横幅。我只想正常的应用程序流,如果没有移动应用程序

我已经在网页和ios应用程序中集成了
分支sdk
。我已成功设置了从网页到iOS应用程序的深层链接(代码未显示),但在嗅探应用程序是否已安装时,我没有得到预期的结果

以下是我的网页
中的代码:

    branch.init('MY_KEY', null, function(err, data) {
        console.log('init...');
        console.dir(data);
    });
    branch.setIdentity('test-user', function(err, data) {
        console.log('identity...');
        console.dir(data);
    });
    branch.data(function(err, data) {
        console.log('data...');
        console.dir(data);
    })
以下是我在iOS端的
应用程序(uux0:didfishlaunchingwithoptions:)中的代码

    //Initialize Branch
    if let branch = Branch.getInstance() {
        branch.setDebug()
        branch.initSession(launchOptions: launchOptions, andRegisterDeepLinkHandler: { params, error in
            if let params = params, error == nil {
                // 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 ...
                print("params: %@", params.description)
            }
        })
        branch.setIdentity("test-user")
    } else {
        readerLog.error("failed to initialize branch")
    }
每次我加载网页时(即使在加载之后,并遵循深层链接),我都会在控制台中得到以下内容作为输出。请注意,
+isfirstsession
为true,
hasApp
属性为
null

[Log] init... (localhost, line 18)
[Log] Object (localhost, line 20)
    data: "{\"+is_first_session\":true,\"+clicked_branch_link\":false}"
    data_parsed: {+is_first_session: true, +clicked_branch_link: false}
    has_app: null
    identity: null
    referring_identity: null
    referring_link: null

[Log] identity... (localhost, line 23)
[Log] Object (localhost, line 25)
    identity_id: "352945822373397525"
    link: "https://nlfd.app.link/?%24identity_id=352945822373397525"
    link_click_id: "352947632809063724"
    referring_data: "{\"$one_time_use\":false,\"+click_timestamp\":1485387510,\"_branch_match_id\":\"352945819276765390\",\"_t\":\"352945819276765390\",\"referrer\":\"link_clic…"
    referring_data_parsed: Object
    session_id: "352945822337503746"

[Log] data... (localhost, line 28)
[Log] Object (localhost, line 30)
    data: "{\"+is_first_session\":true,\"+clicked_branch_link\":false}"
    data_parsed: null
    has_app: null
    identity: null
    referring_identity: null
    referring_link: null

我做错了什么?我希望我可以在初始化或设置标识后查看
has\u app
属性。假设在这种情况下,
has\u app
将返回true,这是错误的吗?有没有更合适的方法来完成我想做的事情?

来自Branch.io的Alex:

不幸的是,
has_app
参数不是特别可靠。这对于在显示打开或安装标签之间切换按钮来说已经足够好了,但理想情况下,您不希望将其用于功能性的事情。这是iOS造成的限制:苹果不允许网页查询设备上安装了哪些应用程序(出于明显的隐私原因),因此分支机构必须依赖cookie匹配。这意味着,如果我们无法匹配cookie,或者最近没有看到用户,或者用户清除了设备缓存,或者自Branch上次看到他们以来用户卸载了应用程序,
has\u app
的值将不正确

然而,即使苹果不允许网页查询访问这些数据,iOS本身也可以对其进行操作。通用链接正是这样做的——当用户打开一个通用链接(包括分支链接,假设您完成了所有配置),应用程序将在安装后打开。如果未安装,用户将被发送到链接的URL。你只需要在按钮后面放一个分支链接


但是请注意,这不适用于表单提交按钮,因此您需要为此想出一些UX解决方案。或者,如果应用程序无法打开,您也可以通过使用Javascript计时器在延迟后提交表单。

Alex from Branch.io此处:

不幸的是,
has_app
参数不是特别可靠。这对于在显示打开或安装标签之间切换按钮来说已经足够好了,但理想情况下,您不希望将其用于功能性的事情。这是iOS造成的限制:苹果不允许网页查询设备上安装了哪些应用程序(出于明显的隐私原因),因此分支机构必须依赖cookie匹配。这意味着,如果我们无法匹配cookie,或者最近没有看到用户,或者用户清除了设备缓存,或者自Branch上次看到他们以来用户卸载了应用程序,
has\u app
的值将不正确

然而,即使苹果不允许网页查询访问这些数据,iOS本身也可以对其进行操作。通用链接正是这样做的——当用户打开一个通用链接(包括分支链接,假设您完成了所有配置),应用程序将在安装后打开。如果未安装,用户将被发送到链接的URL。你只需要在按钮后面放一个分支链接

但是请注意,这不适用于表单提交按钮,因此您需要为此想出一些UX解决方案。或者,如果应用程序无法打开,您也可以使用Javascript计时器找到一种在延迟后提交表单的方法