您可以向播放商店链接添加一个引用者。
https://play.google.com/store/apps/details?id=com.myapp&referrer=foobar
如何在应用程序首次启动时在react原生应用程序中接收此推荐人?
编辑:主要问题的详细信息
获取安装参考非常简单,只有一种方法:在安装后接收意向。在这个事件发生时,您遇到了一个问题:如何从原生Java中获取值来响应JavaScript?如果你幸运的话,ui是打开的,你可以发送一个无声通知或其他由现有包捕获的意图。但意图是正常的,一只孤独的狼,没有ui在同一时间运行。
因此,您必须将这个值写入JavaScript也可以读取的存储中。嗯,最简单的方法是网上商店;在ui的开头发送一个带有值和设备标识的请求,并使用相同的标识进行查询。但是有离线的方式吗?
是的,但是"重代码一"。Java和JavaScript没有共同的存储系统,所以我将问题转移到了唯一的Java问题上。快速解决方案:找到一个使用本机存储系统的react本机包,并将本机代码克隆到接收器中以写入值。这是我对上述问题的评论的解决方案。它很简单,只需要几行代码。
但它增加了一种不可预测的依赖性。这个应用程序发展到我需要安卓服务和其他本地功能的地步,所以我自己写了一个react本地模块。为了存储服务的选项,我使用了一个非常简单的键值存储,我还用它来保存安装引用。因此,我在intent接收器中编写了这个存储的referrer,JavaScript在react native的native新娘上查询这个值。
也许有人会把它做成一个包裹。或者还有一个更简单的解决方案;毕竟我只是一个机器人初学者。
自带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启动速度会比引用者的意图启动得更快。关闭应用程序并重新打开后,可以访问安装引用程序。
这不是React Native无法直接获得的东西,您必须编写一些本地代码。
所以交易是这样的:
- 或者你可以在线程中实现你自己版本的Jonny的优秀方法,不幸的是,该方法已被弃用(但在我发言时仍在工作)
- 要么你应该创建一个react原生插件,将名为
Install Referrer Library
的新android库的方法公开给javascript
现在,NPM react native referrer模块正在以安全的方式实现第一个版本(用于生产),并将很快在最新的实现中迁移