2017-02-09 29 views
2

您可以將引用鏈接添加到播放存儲鏈接。react-native和安裝時的引用鏈接

https://play.google.com/store/apps/details?id=com.myapp&referrer=foobar

我如何收到此引用的反應,本機應用程序在應用程序的第一個開始?

+0

您是否找到了解決方案? – berkayk

+0

FunFact:我昨天隨機發現它。我通過意圖工作了一個android服務和通信。我誤解了android應用程序背後的概念和react-native(只是ui部分)。我會在接下來的幾天測試真正的功能,但我的第一個測試很簡單。我爲'com.android.vending.INSTALL_REFERRER'的intent過濾器註冊了一個接收器,並且'intent.getStringExtra(「referrer」)'中的referrer被保存在'context.getSharedPreferences(「wit_player_shared_preferences」,Context.MODE_PRIVATE);' 。 package'react-native-shared-preferences'在內部使用這個領域。有效。 – Jonny

+0

@Jonny你真的管理好了嗎?如果是這樣,你可以解釋爲反應本土開發人員的幾個步驟 - 意味着不一定熟悉Java的Android開發。謝謝 – jeevana

回答

1

編輯:主要的問題

的詳細信息以獲得安裝參照很簡單,只有一個辦法:接受安裝後的意圖。在這個事件發生的時候,你有一個問題:如何從本地Java獲得價值來反應JavaScript?如果幸運的話,用戶界面是開放的,你可以發送一個安靜的通知或另一個已經存在的軟件包捕獲的意圖。但是,意圖通常是一個沒有用戶同時運行的孤獨的狼。

因此,您必須將此值寫入JavaScript可以讀取的存儲中。嗯,簡單的方法是在線商店;在UI的開始處發送具有該值的請求並且使用相同的標識來查詢和設備標識和查詢。但是有沒有離線方式?

是的,但是「重碼一」。 Java和JavaScript沒有共同的存儲系統,所以我將問題轉移到了唯一的Java問題。快速解決方案:找到使用本機存儲系統的react-native軟件包,並將本機代碼克隆到接收器中以寫入值。這是我對上述問題的評論的解決方案。這很簡單,只需要幾行代碼。

但它增加了不可預知的依賴關係。該應用程序增長到一個點,我需要一個Android服務和其他原生功能,所以我寫了一個自己的反原生模塊。爲了存儲服務的選項,我使用了一個非常簡單的鍵值存儲,我也用它來保存安裝引用。所以我把意向接收器中的引用者寫到了這個存儲器中,JavaScript通過原生反應的本地新娘來查詢這個值。

也許有人會爲此製作一個包裝。或者有更簡單的解決方案;畢竟我只是一個機器人初學者。


有自己的RN模塊

我後我的我的解決方案的簡單例子,因爲@jeevana提出要求的解決方案。我在這個問題上的評論是一個更類似於原生態的答案。現在,這是我在原始應用程序中使用的解決方案,但僅限於必需品。我的「FooModule」有更多的代碼,所以我試圖提取特定的代碼。

JavaScript的部分是很容易的,App.js

const FooModule = require('react-native').NativeModules.FooModule; 

import React, { 
    Component, 
} from 'react'; 

export default class FooApp extends Component { 
    componentDidMount() { 
     FooModule.getInstallReferrer().then(value => { 
      FooModule.showShortToast("INSTALL_REFERRER JS: " + String(value)); 
      if (value) { 
       FooModule.clearInstallReferrer(); 
      } 
     }); 

    } 
    render() { 
     return null; 
    } 
} 

這裏所有的Java部分。 MainApplication.java

package tld.example.fooapp; 

import android.app.Application; 
import android.util.Log; 

import com.facebook.react.ReactApplication; 
import com.facebook.react.ReactInstanceManager; 
import com.facebook.react.ReactNativeHost; 
import com.facebook.react.ReactPackage; 
import com.facebook.react.shell.MainReactPackage; 

import java.util.Arrays; 
import java.util.List; 

public class MainApplication extends Application implements ReactApplication { 

    private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { 
    @Override 
    protected boolean getUseDeveloperSupport() { 
     return BuildConfig.DEBUG; 
    } 

    @Override 
    protected List<ReactPackage> getPackages() { 
     return Arrays.<ReactPackage>asList(
      new MainReactPackage(), 
      new FooPackage() 
    ); 
    } 
    }; 

    @Override 
    public ReactNativeHost getReactNativeHost() { 
     return mReactNativeHost; 
    } 
} 

FooPackage.java

package tld.example.fooapp; 

import com.facebook.react.bridge.ReactApplicationContext; 

import java.util.*; 

import com.facebook.react.ReactPackage; 
import com.facebook.react.bridge.JavaScriptModule; 
import com.facebook.react.bridge.NativeModule; 
import com.facebook.react.uimanager.ViewManager; 

public class FooPackage implements ReactPackage { 
    @Override 
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { 
     List<NativeModule> modules = new ArrayList<>(); 
     modules.add(new FooModule(reactContext)); 
     return modules; 
    } 

    public List<Class<? extends JavaScriptModule>> createJSModules() { 
     return Collections.emptyList(); 
    } 

    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { 
     return Collections.emptyList(); 
    } 
} 

現在接收器的系統的意圖,在FooReceiver.java

package tld.example.fooapp; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

import static android.R.attr.data; 

public class FooReceiver extends BroadcastReceiver { 
    private static final String TAG = "FooReceiver"; 
    public static String REFERRER = ""; 

    public FooReceiver() { 

    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (action.equals("com.android.vending.INSTALL_REFERRER")) { 
      String referrer = intent.getStringExtra("referrer"); 
      Log.d(TAG, "INSTALL_REFERRER: " + referrer); 
      new FooTrayPreferences(context).put(FooTrayPreferences.INSTALL_REFERRER, referrer); 
     } 
    } 
} 

「存儲類」,用於寫入和讀取本地部分在接收器和反應原生新娘的同一個存儲器上,FooTrayPreferences.java

package tld.example.fooapp; 

import android.content.Context; 
import net.grandcentrix.tray.TrayPreferences; 

public class FooTrayPreferences extends TrayPreferences { 

    public static String INSTALL_REFERRER = "INSTALL_REFERRER"; 

    public FooTrayPreferences(final Context context) { 
     super(context, "FooContent", 1); 
    } 
} 

的最後一個文件是本地Java和ReactNative,FooModule.java之間的新娘:

package tld.example.fooapp; 

import com.facebook.react.bridge.Callback; 
import com.facebook.react.bridge.Promise; 
import com.facebook.react.bridge.ReactApplicationContext; 
import com.facebook.react.bridge.ReactContextBaseJavaModule; 
import com.facebook.react.bridge.ReactMethod; 
import com.facebook.react.bridge.ReadableArray; 
import com.facebook.react.bridge.ReadableMap; 
import com.facebook.react.bridge.WritableArray; 
import com.facebook.react.bridge.WritableMap; 
import com.facebook.react.bridge.WritableNativeArray; 
import com.facebook.react.bridge.WritableNativeMap; 

import android.content.Intent; 
import android.content.Context; 
import android.widget.Toast; 

import java.util.Arrays; 
import java.util.Set; 
import android.util.Log; 


public class FooModule extends ReactContextBaseJavaModule { 
    private static final String TAG = "FooModule"; 
    ReactApplicationContext reactContext; 
    private static String prefFile = "serviceSettings"; 
    private FooTrayPreferences mTrayPreferences; 

    public FooModule(ReactApplicationContext reactContext) { 
     super(reactContext); 
     this.reactContext = reactContext; 
     mTrayPreferences = new FooTrayPreferences(reactContext); 
    } 

    @Override 
    public String getName() { 
     return "FooModule"; 
    } 

    @ReactMethod 
    public void getInstallReferrer(Promise promise) { 
     String installReferrer = mTrayPreferences.getString(FooTrayPreferences.INSTALL_REFERRER, ""); 
     promise.resolve(installReferrer); 
    } 

    @ReactMethod 
    public void clearInstallReferrer() { 
     mTrayPreferences.remove(FooTrayPreferences.INSTALL_REFERRER); 

    } 

    @ReactMethod 
    public void showShortToast(String text) { 
     Toast.makeText(reactContext, text, Toast.LENGTH_SHORT).show(); 
    } 

    @ReactMethod 
    public void showLongToast(String text) { 
     Toast.makeText(reactContext, text, Toast.LENGTH_LONG).show(); 
    } 
} 

AndroidManifest.xml還需要接收器條目:

... 
     <receiver 
      android:name=".FooReceiver" 
      android:enabled="true" 
      android:process=":remotereceiver" 
      android:exported="true"> 
      <intent-filter> 
       <action android:name="com.android.vending.INSTALL_REFERRER" /> 
      </intent-filter> 
     </receiver> 
... 

所以它的工作原理,但它主要本地代碼。在非常非常慢的設備上,它發生的應用程序的用戶界面啓動速度快於引用意圖被解僱。關閉應用程序並重新打開後,安裝引用程序是可訪問的。