Going through the v3 example file in modifying it with my project works fine. However my friend just tested the code by turning wi-fi off and turning on airplane mode. This
Problem is, that in your first approach, the API do not know what SKUs exist and per default (the single param version) is trying to query that list. In airplane mode this is not possible - either because it does not cache a list of skus or there is some internal error preventing it from finishing.
You can either send in a list of SKUs you want to query (like you did later on) or you can just supress the online query for sku list.
helper.queryInventoryAsync(false, yourListener);
credits to: jmrmb80
It depends more likely if you need this information (i.e. displaying prices in your app).
(see the other overloads for that function or already given answers. Most likely you don't need the SKUs for checking if a purchase was made I think, so I would go for the answer of jmrmb80 - for me this solved the problem of not recognizing a purchase in airplane mode