Branch.io: javascript detect whether mobile app is installed

江枫思渺然 提交于 2019-12-12 03:49:36

问题


I have a web page where I want a particular link on a page to open our native mobile app if the app is installed, and if not, do what it is currently doing (which submits a form).

Note: I think this is different than a smart banner - I don't want the banner on this page. I just want the normal app flow if there is no mobile app.

I have integrated branch-sdk in the web page and in my ios app. I have successfully set up a deep link from the web page to the iOS app (code not shown), but I am not getting results I expect when sniffing for whether the app is installed.

Here's the code in the <head> of my webpage:

    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);
    })

Here's my code in application(_:didFinishLaunchingWithOptions:) in the iOS side:

    //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")
    }

Every time I load the webpage (even after loading it, and following the deep link), I get the following as output in the console. Note that +isfirstsession is true, and the hasApp property is 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

What am I doing wrong? I was hoping I could just look at the has_app property after init or after setting the identity. Is it incorrect to assume that has_app would return true in this case? Is there a more appropriate way to do what I want to do?


回答1:


Alex from Branch.io here:

Unfortunately the has_app parameter is not especially reliable. It's good enough for switching a button between displaying an Open or an Install label, but ideally you don't want to use it for functional things. This is a limitation caused by iOS: Apple doesn't allow web pages to query for which apps are installed on a device (for obvious privacy reasons), so Branch has to rely on cookie matching. This means if we can't match the cookie, or haven't seen the user recently, or the user clears their device cache, or the user has uninstalled the app since the last time Branch saw them, the value of has_app will be incorrect.

HOWEVER, even though Apple doesn't allow web pages to query access this data, iOS itself can still act on it. Universal Links do exactly this — when the user opens a Universal Link (which includes Branch links, assuming you got all the configuration done), the app will open if it is installed. If it is not installed, the user will be sent to the URL of the link. You just need to put a Branch link behind that button.

Note however that this doesn't work for form submission buttons, so you would need to come up with some UX workaround for this. Or you might be able to find a way to submit the form after a delay if the app doesn't open, by using a Javascript timer.



来源:https://stackoverflow.com/questions/41880919/branch-io-javascript-detect-whether-mobile-app-is-installed

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