2017-02-09 17 views
2

プレイストアリンクにリファラーを追加できます。私はアプリの初回起動時に反応し、ネイティブアプリでこのリファラを受けるにはどうすればよい反応ネイティブとインストール時の参照者

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

+0

解決策を見つけましたか? – berkayk

+0

FunFact:私はそれを昨日無作為に見つけました。私はアンドロイド・サービスとインテントによるコミュニケーションに取り組んだ。私はアンドロイドアプリケーションの背後にあるコンセプトを誤解し、反応ネイティブ(UIのみ)です。私は次の日に実際の機能をテストしますが、最初のテストは簡単でした。私は 'com.android.vending.INSTALL_REFERRER'のインテントフィルターを持つレシーバーを登録し、' intent.getStringExtra( "referrer")の参照元は 'context.getSharedPreferences(" wit_player_shared_preferences "、Context.MODE_PRIVATE);に保存されました。 。パッケージ 'react-native-shared-preferences'はこのレルムを内部的に使用します。出来た。 – Jonny

+0

@ジョニーあなたは実際にその仕事を管理しましたか?可能であれば、反応のネイティブ開発者のためのいくつかのステップでそれを説明することができます - Java Android開発に精通していないことを意味します。ありがとう – jeevana

答えて

1

編集:主な問題の詳細

インストールリファラを取得するには非常に簡単で、唯一の方法があります:インストールした後、意図を受信するには。このイベントが発生した時点では、ネイティブJavaからJavaScriptに対応するための価値を得るには問題がありますか?あなたが運が良ければ、私は開いています。あなたは、既存のパッケージによって捕捉された静かな通知や別の意図を送ることができます。しかし、その意図は通常、同時に実行されていない孤独なオオカミです。

この値は、JavaScriptが読み取ることができるストレージに書き込む必要があります。うーん、簡単な方法はオンラインストアです。 uiの開始時に同じ識別情報を持つ値とデバイスの識別と照会を要求を送信します。しかし、オフラインの方法はありますか?

はい、「重大なコード」です。 JavaとJavaScriptにはストレージシステムが共通していないので、私はこの問題を唯一のJava問題に移しました。高速なソリューション:ネイティブストレージシステムを使用し、ネイティブコードを受信者に複製して値を書き込むためのネイティブコードを生成する反応ネイティブパッケージを探します。これは私のコメントの解決策です。簡単で、数行のコードしか必要ありません。

しかし、予測不可能な依存関係が追加されました。アプリケーションは、アンドロイドサービスや他のネイティブ関数が必要なところまで成長しています。そこで、私は独自の反応ネイティブモジュールを作成しました。サービスのオプションを格納するために、私は非常に単純なキー値ストアを使用しました。これもインストール参照を保存するために使用しました。そこで、インテントレシーバーのリファラーをこのストレージに書き、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> 
... 

が、それはほとんどですネイティブコード。非常に遅いデバイスでは、アプリのUIがリファラーインテントが起動するよりも早く開始されます。アプリケーションを閉じてから再度開くと、インストール参照元にアクセスできます。

関連する問題