diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..10be197 --- /dev/null +++ b/.gitignore @@ -0,0 +1,53 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# BUCK +buck-out/ +\.buckd/ +*.keystore + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..4949f09 --- /dev/null +++ b/.npmignore @@ -0,0 +1 @@ +example/ \ No newline at end of file diff --git a/README.md b/README.md index 4a88861..e2e185e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,326 @@ -# react-native-xgpush +# react-native-xinge-push 信鸽推送React Native版 + +## install +``` +npm install --save react-native-xinge-push +``` + +## link + +``` +react-native link react-native-xinge-push +``` + +## usage +### Android +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +### iOS +AppDelegate.m: + +```oc +#import + +// ... + +// Required to register for notifications +- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings +{ + [XGPushManager didRegisterUserNotificationSettings:notificationSettings]; +} +// Required for the register event. +- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken +{ + [XGPushManager didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; +} +// Required for the notification event. You must call the completion handler after handling the remote notification. +- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo +fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler +{ + [XGPushManager didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; + // 统计收到推送的设备 + [XGPushManager handleReceiveNotification:userInfo successCallback:^{ + NSLog(@"[XGPush] Handle receive success"); + } errorCallback:^{ + NSLog(@"[XGPush] Handle receive error"); + }]; +} +// Required for the registrationError event. +- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error +{ + [XGPushManager didFailToRegisterForRemoteNotificationsWithError:error]; +} +// Required for the localNotification event. +- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification +{ + [XGPushManager didReceiveLocalNotification:notification]; +} +``` + +## Example + +```js + +import React, { Component } from 'react'; +import { + Platform, + StyleSheet, + Text, + View, + TouchableNativeFeedback, + TouchableHighlight +} from 'react-native'; +import XGPush from 'react-native-xinge-push'; + +const Touchable = Platform.OS === 'android' ? TouchableNativeFeedback : TouchableHighlight; + +class Example extends Component { + + constructor() { + super(); + this.state = { + isDebug: false + }; + this._enableDebug = this._enableDebug.bind(this); + this._isEnableDebug = this._isEnableDebug.bind(this); + + // 初始化推送 + this.initPush(); + } + + async initPush() { + let accessId; + let accessKey; + if(Platform.OS === 'ios') { + accessId = 1111111111; // 请将1111111111修改为APP的AccessId,10位数字 + accessKey = "YOUR_ACCESS_KEY"; // 请将YOUR_ACCESS_KEY修改为APP的AccessKey + } else { + accessId = 2222222222; + accessKey = "YOUR_ACCESS_KEY"; + } + // 初始化 + XGPush.init(accessId, accessKey); + + // 注册 + XGPush.register('jeepeng') + .then(result => result) + .catch(err => { + console.log(err); + }); + } + + componentDidMount() { + XGPush.addEventListener('register', this._onRegister); + XGPush.addEventListener('message', this._onMessage); + XGPush.addEventListener('notification', this._onNotification); + } + + componentWillUnmount() { + XGPush.removeEventListener('register', this._onRegister); + XGPush.removeEventListener('message', this._onMessage); + XGPush.removeEventListener('notification', this._onNotification); + } + + /** + * 注册成功 + * @param deviceToken + * @private + */ + _onRegister(deviceToken) { + alert('onRegister: ' + deviceToken); + // 在ios中,register方法是向apns注册,如果要使用信鸽推送,得到deviceToken后还要向信鸽注册 + XGPush.registerForXG(deviceToken); + } + + /** + * 透传消息到达 + * @param message + * @private + */ + _onMessage(message) { + alert('收到透传消息: ' + message.content); + } + + /** + * 通知到达 + * @param notification + * @private + */ + _onNotification(notification) { + alert(JSON.stringify(notification)); + } + + /** + * 获取初始通知(点击通知后) + * @private + */ + _getInitialNotification() { + XGPush.getInitialNotification().then((result) => { + alert(JSON.stringify(result)); + }); + } + + _enableDebug() { + XGPush.enableDebug(!this.state.isDebug); + } + + _isEnableDebug() { + XGPush.isEnableDebug().then(result => { + this.setState({ + isDebug: result + }); + alert(result); + }); + } + + _setApplicationIconBadgeNumber(number = 0) { + XGPush.setApplicationIconBadgeNumber(number); + } + + _getApplicationIconBadgeNumber() { + XGPush.getApplicationIconBadgeNumber((number) => alert(number)); + } + + render() { + return ( + + + + getInitialNotification + + + { this._enableDebug() }} underlayColor="#ddd"> + + enableDebug + + + { this._isEnableDebug() }} underlayColor="#ddd"> + + isEnableDebug + + + { this._setApplicationIconBadgeNumber(99) }} underlayColor="#ddd"> + + setApplicationIconBadgeNumber: 99 + + + { this._getApplicationIconBadgeNumber() }} underlayColor="#ddd"> + + getApplicationIconBadgeNumber + + + + ); + } +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#fff', + }, + list: { + marginTop: 15, + backgroundColor: '#fff', + }, + item: { + height: 45, + alignItems: 'center', + justifyContent: 'center', + borderBottomWidth: StyleSheet.hairlineWidth, + borderBottomColor: '#efefef' + }, +}); + +export default Example; + +``` + +see `example` folder for more details diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..d024b66 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,31 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion 25 + buildToolsVersion '25.0.2' + + defaultConfig { + minSdkVersion 16 + targetSdkVersion 25 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + sourceSets { + main { + jniLibs.srcDirs = ['libs'] + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + testCompile 'junit:junit:4.12' + compile "com.facebook.react:react-native:+" +} diff --git a/android/libs/Xg_sdk_v3.1_20170417_0946.jar b/android/libs/Xg_sdk_v3.1_20170417_0946.jar new file mode 100755 index 0000000..6c03c12 Binary files /dev/null and b/android/libs/Xg_sdk_v3.1_20170417_0946.jar differ diff --git a/android/libs/armeabi-v7a/libtpnsSecurity.so b/android/libs/armeabi-v7a/libtpnsSecurity.so new file mode 100755 index 0000000..371c942 Binary files /dev/null and b/android/libs/armeabi-v7a/libtpnsSecurity.so differ diff --git a/android/libs/armeabi-v7a/libxguardian.so b/android/libs/armeabi-v7a/libxguardian.so new file mode 100755 index 0000000..457b5e1 Binary files /dev/null and b/android/libs/armeabi-v7a/libxguardian.so differ diff --git a/android/libs/jg_filter_sdk_1.1.jar b/android/libs/jg_filter_sdk_1.1.jar new file mode 100755 index 0000000..bba19c1 Binary files /dev/null and b/android/libs/jg_filter_sdk_1.1.jar differ diff --git a/android/libs/mid-core-sdk-3.7.2.jar b/android/libs/mid-core-sdk-3.7.2.jar new file mode 100755 index 0000000..2ef6c32 Binary files /dev/null and b/android/libs/mid-core-sdk-3.7.2.jar differ diff --git a/android/libs/wup-1.0.0.E-SNAPSHOT.jar b/android/libs/wup-1.0.0.E-SNAPSHOT.jar new file mode 100755 index 0000000..edff96f Binary files /dev/null and b/android/libs/wup-1.0.0.E-SNAPSHOT.jar differ diff --git a/android/libs/x86/libtpnsSecurity.so b/android/libs/x86/libtpnsSecurity.so new file mode 100755 index 0000000..72f6807 Binary files /dev/null and b/android/libs/x86/libtpnsSecurity.so differ diff --git a/android/libs/x86/libxguardian.so b/android/libs/x86/libxguardian.so new file mode 100755 index 0000000..0b6110a Binary files /dev/null and b/android/libs/x86/libxguardian.so differ diff --git a/android/proguard-rules.pro b/android/proguard-rules.pro new file mode 100644 index 0000000..46bc2c8 --- /dev/null +++ b/android/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Library/Android/SDK/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/android/src/androidTest/java/com/jeepeng/react/xgpush/ApplicationTest.java b/android/src/androidTest/java/com/jeepeng/react/xgpush/ApplicationTest.java new file mode 100644 index 0000000..eefe808 --- /dev/null +++ b/android/src/androidTest/java/com/jeepeng/react/xgpush/ApplicationTest.java @@ -0,0 +1,13 @@ +package com.jeepeng.react.xgpush; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..692133f --- /dev/null +++ b/android/src/main/AndroidManifest.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/android/src/main/java/com/jeepeng/react/xgpush/Constants.java b/android/src/main/java/com/jeepeng/react/xgpush/Constants.java new file mode 100644 index 0000000..a7dab88 --- /dev/null +++ b/android/src/main/java/com/jeepeng/react/xgpush/Constants.java @@ -0,0 +1,17 @@ +package com.jeepeng.react.xgpush; + +/** + * 常量 + * Created by Jeepeng on 16/8/15. + */ +public class Constants { + public static final String ACTION_ON_REGISTERED = "XGPushNotificationOnRegisterResult"; + public static final String ACTION_ON_TEXT_MESSAGE = "XGPushNotificationOnTextMessage"; + public static final String ACTION_ON_NOTIFICATION_SHOWED = "XGPushNotificationOnShowed"; + public static final String ACTION_ON_NOTIFICATION_CLICKED = "XGPushNotificationOnClicked"; + + public static final String EVENT_REGISTERED = "remoteNotificationsRegistered"; + public static final String EVENT_REMOTE_NOTIFICATION_RECEIVED = "remoteNotificationReceived"; + public static final String EVENT_LOCAL_NOTIFICATION_RECEIVED = "localNotificationReceived"; + public static final String EVENT_MESSAGE_RECEIVED = "messageReceived"; +} diff --git a/android/src/main/java/com/jeepeng/react/xgpush/PushModule.java b/android/src/main/java/com/jeepeng/react/xgpush/PushModule.java new file mode 100644 index 0000000..9d8603f --- /dev/null +++ b/android/src/main/java/com/jeepeng/react/xgpush/PushModule.java @@ -0,0 +1,303 @@ +package com.jeepeng.react.xgpush; + +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.support.annotation.Nullable; +import android.util.Log; + +import com.facebook.react.bridge.ActivityEventListener; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.LifecycleEventListener; +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.WritableMap; +import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.tencent.android.tpush.XGIOperateCallback; +import com.tencent.android.tpush.XGLocalMessage; +import com.tencent.android.tpush.XGPushConfig; +import com.tencent.android.tpush.XGPushManager; +import com.tencent.android.tpush.encrypt.Rijndael; + +/** + * 信鸽推送 + * Created by Jeepeng on 16/8/3. + */ +public class PushModule extends ReactContextBaseJavaModule implements ActivityEventListener, LifecycleEventListener { + + public static final String MODULE_NAME = "XGPushManager"; + + private Context reactContext; + + public PushModule(ReactApplicationContext reactContext) { + super(reactContext); + reactContext.addActivityEventListener(this); + reactContext.addLifecycleEventListener(this); + this.reactContext = reactContext; + registerReceivers(); + } + + @Override + public String getName() { + return MODULE_NAME; + } + + private void sendEvent(String eventName, @Nullable WritableMap params) { + getReactApplicationContext() + .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) + .emit(eventName, params); + } + + private void registerReceivers() { + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(Constants.ACTION_ON_REGISTERED); + intentFilter.addAction(Constants.ACTION_ON_TEXT_MESSAGE); + intentFilter.addAction(Constants.ACTION_ON_NOTIFICATION_CLICKED); + intentFilter.addAction(Constants.ACTION_ON_NOTIFICATION_SHOWED); + + reactContext.registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + WritableMap params = Arguments.createMap(); + switch (intent.getAction()){ + case Constants.ACTION_ON_REGISTERED: + intent.getBundleExtra("notification"); + String token = intent.getStringExtra("token"); + params.putString("deviceToken", token); + + sendEvent(Constants.EVENT_REGISTERED, params); + break; + case Constants.ACTION_ON_TEXT_MESSAGE: + String title = intent.getStringExtra("title"); + String content = intent.getStringExtra("content"); + String customContent = intent.getStringExtra("customContent"); + params.putString("title", title); + params.putString("content", content); + params.putString("custom_content", customContent); + + sendEvent(Constants.EVENT_MESSAGE_RECEIVED, params); + break; + case Constants.ACTION_ON_NOTIFICATION_SHOWED: + params.putString("title", intent.getStringExtra("title")); + params.putString("content", intent.getStringExtra("content")); + params.putString("custom_content", intent.getStringExtra("customContent")); + + sendEvent(Constants.EVENT_REMOTE_NOTIFICATION_RECEIVED, params); + break; + case Constants.ACTION_ON_NOTIFICATION_CLICKED: + params.putString("title", intent.getStringExtra("title")); + params.putString("content", intent.getStringExtra("content")); + params.putString("custom_content", intent.getStringExtra("customContent")); + + sendEvent(Constants.ACTION_ON_NOTIFICATION_CLICKED, params); + break; + default: + break; + } + + + } + }, intentFilter); + } + + /** + * 开启logcat输出,方便debug,发布时请关闭 + */ + @ReactMethod + public void enableDebug(boolean isDebug) { + XGPushConfig.enableDebug(this.reactContext, isDebug); + } + + /** + * 开启logcat输出,方便debug,发布时请关闭 + */ + @ReactMethod + public void isEnableDebug(Promise promise) { + promise.resolve(XGPushConfig.isEnableDebug(this.reactContext)); + } + + /** + * 初始化 + * @param accessId + * @param accessKey + */ + @ReactMethod + public void startApp(int accessId, String accessKey) { + XGPushConfig.setAccessId(this.reactContext, accessId); + XGPushConfig.setAccessKey(this.reactContext, accessKey); + } + + /** + * 注册并绑定帐号 + * @param account 帐号,当为'*'表示解绑 + */ + @ReactMethod + public void registerPush(String account, final Promise promise) { + if(account != null && !"".equals(account)) { + XGPushManager.registerPush(this.reactContext, account, new XGIOperateCallback() { + @Override + public void onSuccess(Object date, int flag) { + promise.resolve(date); + } + + @Override + public void onFail(Object data, int errCode, String msg) { + promise.reject(String.valueOf(errCode), msg); + } + }); + } else { + XGPushManager.registerPush(this.reactContext, new XGIOperateCallback() { + @Override + public void onSuccess(Object date, int flag) { + promise.resolve(date); + } + + @Override + public void onFail(Object data, int errCode, String msg) { + promise.reject(String.valueOf(errCode), msg); + } + }); + } + } + + /** + * 反注册 + * @param promise + */ + @ReactMethod + public void unregisterPush(final Promise promise) { + XGPushManager.unregisterPush(this.reactContext, new XGIOperateCallback() { + @Override + public void onSuccess(Object data, int flag) { + WritableMap map = Arguments.createMap(); + map.putString("data", (String) data); + map.putInt("flag", flag); + promise.resolve(map); + } + + @Override + public void onFail(Object data, int errCode, String msg) { + promise.reject(String.valueOf(errCode), msg); + } + }); + } + + /** + * 设置tag + * @param tagName + */ + @ReactMethod + public void setTag(String tagName) { + XGPushManager.setTag(this.reactContext, tagName); + } + + /** + * 删除tag + * @param tagName + */ + @ReactMethod + public void deleteTag(String tagName) { + XGPushManager.deleteTag(this.reactContext, tagName); + } + + @ReactMethod + public void addLocalNotification(String title, String content) { + XGLocalMessage message = new XGLocalMessage(); + message.setTitle(title); + message.setContent(content); + Log.i(MODULE_NAME, title); + Log.i(MODULE_NAME, content); + XGPushManager.addLocalNotification(this.reactContext, message); + } + + /** + * 获取token + * @return 成功时返回正常的token;失败时返回null或”0” + */ + @ReactMethod + public String getToken() { + return XGPushConfig.getToken(this.reactContext); + } + + @ReactMethod + public void setAccessId(String accessId) { + try{ + XGPushConfig.setAccessId(this.reactContext, Long.parseLong(accessId)); + } catch (NumberFormatException exception) { + exception.printStackTrace(); + } + } + + @ReactMethod + public long getAccessId() { + return XGPushConfig.getAccessId(this.reactContext); + } + + @ReactMethod + public void setAccessKey(String accessKey) { + XGPushConfig.setAccessKey(this.reactContext, accessKey); + } + + /** + * 获取accessKey + * @return accessKey + */ + @ReactMethod + public String getAccessKey() { + return XGPushConfig.getAccessKey(this.reactContext); + } + + @ReactMethod + public void getInitialNotification(Promise promise) { + WritableMap params = Arguments.createMap(); + Activity activity = getCurrentActivity(); + if (activity != null) { + Intent intent = activity.getIntent(); + try { + if(intent != null && intent.hasExtra("protect")) { + String title = Rijndael.decrypt(intent.getStringExtra("title")); + String content = Rijndael.decrypt(intent.getStringExtra("content")); + String customContent = Rijndael.decrypt(intent.getStringExtra("custom_content")); + params.putString("title", title); + params.putString("content", content); + params.putString("custom_content", customContent); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + promise.resolve(params); + } + + @Override + public void onHostResume() { + XGPushManager.onActivityStarted(getCurrentActivity()); + } + + @Override + public void onHostPause() { + XGPushManager.onActivityStoped(getCurrentActivity()); + } + + @Override + public void onHostDestroy() { + + } + + @Override + public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { + + } + + @Override + public void onNewIntent(Intent intent) { + Activity activity = getCurrentActivity(); + if (activity != null) { + activity.setIntent(intent); // 必须要调用这句 + } + } +} diff --git a/android/src/main/java/com/jeepeng/react/xgpush/PushPackage.java b/android/src/main/java/com/jeepeng/react/xgpush/PushPackage.java new file mode 100644 index 0000000..dc98a19 --- /dev/null +++ b/android/src/main/java/com/jeepeng/react/xgpush/PushPackage.java @@ -0,0 +1,34 @@ +package com.jeepeng.react.xgpush; + +import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.JavaScriptModule; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.uimanager.ViewManager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * 信鸽推送 + * Created by Jeepeng on 16/8/3. + */ +public class PushPackage implements ReactPackage { + @Override + public List createNativeModules(ReactApplicationContext reactContext) { + List modules = new ArrayList<>(); + modules.add(new PushModule(reactContext)); + return modules; + } + + @Override + public List> createJSModules() { + return Collections.emptyList(); + } + + @Override + public List createViewManagers(ReactApplicationContext reactContext) { + return Collections.emptyList(); + } +} diff --git a/android/src/main/java/com/jeepeng/react/xgpush/receiver/MessageReceiver.java b/android/src/main/java/com/jeepeng/react/xgpush/receiver/MessageReceiver.java new file mode 100644 index 0000000..669fd9e --- /dev/null +++ b/android/src/main/java/com/jeepeng/react/xgpush/receiver/MessageReceiver.java @@ -0,0 +1,131 @@ +package com.jeepeng.react.xgpush.receiver; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; + +import com.jeepeng.react.xgpush.Constants; +import com.tencent.android.tpush.XGPushBaseReceiver; +import com.tencent.android.tpush.XGPushClickedResult; +import com.tencent.android.tpush.XGPushRegisterResult; +import com.tencent.android.tpush.XGPushShowedResult; +import com.tencent.android.tpush.XGPushTextMessage; + +/** + * 消息接收器 + * Created by Jeepeng on 16/8/4. + */ +public class MessageReceiver extends XGPushBaseReceiver { + + /** + * 注册结果 + * @param context + * @param errorCode + * @param xgPushRegisterResult + */ + @Override + public void onRegisterResult(Context context, int errorCode, XGPushRegisterResult xgPushRegisterResult) { + + if(errorCode == 0) { + Intent intent = new Intent(Constants.ACTION_ON_REGISTERED); + intent.putExtra("token", xgPushRegisterResult.getToken()); + context.sendBroadcast(intent); + } + + } + + /** + * 反注册结果 + * @param context + * @param errorCode + */ + @Override + public void onUnregisterResult(Context context, int errorCode) { + + } + + + /** + * 设置标签结果 + * @param context + * @param errorCode + * @param tagName + */ + @Override + public void onSetTagResult(Context context, int errorCode, String tagName) { + + } + + /** + * 删除标签结果 + * @param context + * @param errorCode + * @param tagName + */ + @Override + public void onDeleteTagResult(Context context, int errorCode, String tagName) { + + } + + /** + * 收到消息 + * @param context + * @param xgPushTextMessage + */ + @Override + public void onTextMessage(Context context, XGPushTextMessage xgPushTextMessage) { + Intent intent = new Intent(Constants.ACTION_ON_TEXT_MESSAGE); + intent.putExtra("title", xgPushTextMessage.getTitle()); + intent.putExtra("content", xgPushTextMessage.getContent()); + intent.putExtra("customContent", xgPushTextMessage.getCustomContent()); + context.sendBroadcast(intent); + } + + /** + * 通知被打开触发的结果 + * @param context + * @param message + */ + @Override + public void onNotifactionClickedResult(Context context, XGPushClickedResult message) { + if (context == null || message == null) { + return; + } + if (message.getActionType() == XGPushClickedResult.NOTIFACTION_CLICKED_TYPE) { + // 通知在通知栏被点击啦。。。。。 + Intent intent = new Intent(Constants.ACTION_ON_NOTIFICATION_CLICKED); + Bundle bundle = new Bundle(); + bundle.putString("content", message.getContent()); + bundle.putString("title", message.getTitle()); + intent.putExtra("notification", bundle); + context.sendBroadcast(intent); + } else if (message.getActionType() == XGPushClickedResult.NOTIFACTION_DELETED_TYPE) { + // 通知被清除啦。。。。 + // APP自己处理通知被清除后的相关动作 + } + } + + /** + * 通知被展示触发的结果,可以在此保存APP收到的通知 + * @param context + * @param xgPushShowedResult + */ + @Override + public void onNotifactionShowedResult(Context context, XGPushShowedResult xgPushShowedResult) { + Intent intent = new Intent(Constants.ACTION_ON_NOTIFICATION_SHOWED); + Bundle bundle = new Bundle(); + bundle.putString("content", xgPushShowedResult.getContent()); + bundle.putString("title", xgPushShowedResult.getTitle()); + bundle.putString("customContent", xgPushShowedResult.getCustomContent()); + intent.putExtra("notification", bundle); + + intent.putExtra("title", xgPushShowedResult.getTitle()); + intent.putExtra("content", xgPushShowedResult.getContent()); + intent.putExtra("customContent", xgPushShowedResult.getCustomContent()); + intent.putExtra("activity", xgPushShowedResult.getActivity()); + intent.putExtra("msgId", xgPushShowedResult.getMsgId()); + intent.putExtra("notificationId", xgPushShowedResult.getNotifactionId()); + intent.putExtra("notificationActionType", xgPushShowedResult.getNotificationActionType()); + context.sendBroadcast(intent); + } +} diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml new file mode 100644 index 0000000..c13b22f --- /dev/null +++ b/android/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + react-native-xinge-push + diff --git a/android/src/test/java/com/jeepeng/react/xgpush/ExampleUnitTest.java b/android/src/test/java/com/jeepeng/react/xgpush/ExampleUnitTest.java new file mode 100644 index 0000000..1ad4543 --- /dev/null +++ b/android/src/test/java/com/jeepeng/react/xgpush/ExampleUnitTest.java @@ -0,0 +1,15 @@ +package com.jeepeng.react.xgpush; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * To work on unit tests, switch the Test Artifact in the Build Variants view. + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/example/.babelrc b/example/.babelrc new file mode 100644 index 0000000..a9ce136 --- /dev/null +++ b/example/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["react-native"] +} diff --git a/example/.buckconfig b/example/.buckconfig new file mode 100644 index 0000000..934256c --- /dev/null +++ b/example/.buckconfig @@ -0,0 +1,6 @@ + +[android] + target = Google Inc.:Google APIs:23 + +[maven_repositories] + central = https://repo1.maven.org/maven2 diff --git a/example/.flowconfig b/example/.flowconfig new file mode 100644 index 0000000..a76425e --- /dev/null +++ b/example/.flowconfig @@ -0,0 +1,47 @@ +[ignore] +; We fork some components by platform +.*/*[.]android.js + +; Ignore "BUCK" generated dirs +/\.buckd/ + +; Ignore unexpected extra "@providesModule" +.*/node_modules/.*/node_modules/fbjs/.* + +; Ignore duplicate module providers +; For RN Apps installed via npm, "Libraries" folder is inside +; "node_modules/react-native" but in the source repo it is in the root +.*/Libraries/react-native/React.js +.*/Libraries/react-native/ReactNative.js + +[include] + +[libs] +node_modules/react-native/Libraries/react-native/react-native-interface.js +node_modules/react-native/flow +flow/ + +[options] +emoji=true + +module.system=haste + +experimental.strict_type_args=true + +munge_underscores=true + +module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' + +suppress_type=$FlowIssue +suppress_type=$FlowFixMe +suppress_type=$FixMe + +suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(4[0-2]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) +suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(4[0-2]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ +suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy +suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError + +unsafe.enable_getters_and_setters=true + +[version] +^0.42.0 diff --git a/example/.gitattributes b/example/.gitattributes new file mode 100644 index 0000000..d42ff18 --- /dev/null +++ b/example/.gitattributes @@ -0,0 +1 @@ +*.pbxproj -text diff --git a/example/.gitignore b/example/.gitignore new file mode 100644 index 0000000..10be197 --- /dev/null +++ b/example/.gitignore @@ -0,0 +1,53 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# BUCK +buck-out/ +\.buckd/ +*.keystore + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots diff --git a/example/.watchmanconfig b/example/.watchmanconfig new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/example/.watchmanconfig @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/example/__tests__/index.android.js b/example/__tests__/index.android.js new file mode 100644 index 0000000..b49b908 --- /dev/null +++ b/example/__tests__/index.android.js @@ -0,0 +1,12 @@ +import 'react-native'; +import React from 'react'; +import Index from '../index.android.js'; + +// Note: test renderer must be required after react-native. +import renderer from 'react-test-renderer'; + +it('renders correctly', () => { + const tree = renderer.create( + + ); +}); diff --git a/example/__tests__/index.ios.js b/example/__tests__/index.ios.js new file mode 100644 index 0000000..ba7c5b5 --- /dev/null +++ b/example/__tests__/index.ios.js @@ -0,0 +1,12 @@ +import 'react-native'; +import React from 'react'; +import Index from '../index.ios.js'; + +// Note: test renderer must be required after react-native. +import renderer from 'react-test-renderer'; + +it('renders correctly', () => { + const tree = renderer.create( + + ); +}); diff --git a/example/android/app/BUCK b/example/android/app/BUCK new file mode 100644 index 0000000..c8f5603 --- /dev/null +++ b/example/android/app/BUCK @@ -0,0 +1,65 @@ +# To learn about Buck see [Docs](https://buckbuild.com/). +# To run your application with Buck: +# - install Buck +# - `npm start` - to start the packager +# - `cd android` +# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` +# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck +# - `buck install -r android/app` - compile, install and run application +# + +lib_deps = [] + +for jarfile in glob(['libs/*.jar']): + name = 'jars__' + jarfile[jarfile.rindex('/') + 1: jarfile.rindex('.jar')] + lib_deps.append(':' + name) + prebuilt_jar( + name = name, + binary_jar = jarfile, + ) + +for aarfile in glob(['libs/*.aar']): + name = 'aars__' + aarfile[aarfile.rindex('/') + 1: aarfile.rindex('.aar')] + lib_deps.append(':' + name) + android_prebuilt_aar( + name = name, + aar = aarfile, + ) + +android_library( + name = "all-libs", + exported_deps = lib_deps, +) + +android_library( + name = "app-code", + srcs = glob([ + "src/main/java/**/*.java", + ]), + deps = [ + ":all-libs", + ":build_config", + ":res", + ], +) + +android_build_config( + name = "build_config", + package = "com.example", +) + +android_resource( + name = "res", + package = "com.example", + res = "src/main/res", +) + +android_binary( + name = "app", + keystore = "//android/keystores:debug", + manifest = "src/main/AndroidManifest.xml", + package_type = "debug", + deps = [ + ":app-code", + ], +) diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle new file mode 100644 index 0000000..920cc36 --- /dev/null +++ b/example/android/app/build.gradle @@ -0,0 +1,140 @@ +apply plugin: "com.android.application" + +import com.android.build.OutputFile + +/** + * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets + * and bundleReleaseJsAndAssets). + * These basically call `react-native bundle` with the correct arguments during the Android build + * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the + * bundle directly from the development server. Below you can see all the possible configurations + * and their defaults. If you decide to add a configuration block, make sure to add it before the + * `apply from: "../../node_modules/react-native/react.gradle"` line. + * + * project.ext.react = [ + * // the name of the generated asset file containing your JS bundle + * bundleAssetName: "index.android.bundle", + * + * // the entry file for bundle generation + * entryFile: "index.android.js", + * + * // whether to bundle JS and assets in debug mode + * bundleInDebug: false, + * + * // whether to bundle JS and assets in release mode + * bundleInRelease: true, + * + * // whether to bundle JS and assets in another build variant (if configured). + * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants + * // The configuration property can be in the following formats + * // 'bundleIn${productFlavor}${buildType}' + * // 'bundleIn${buildType}' + * // bundleInFreeDebug: true, + * // bundleInPaidRelease: true, + * // bundleInBeta: true, + * + * // the root of your project, i.e. where "package.json" lives + * root: "../../", + * + * // where to put the JS bundle asset in debug mode + * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", + * + * // where to put the JS bundle asset in release mode + * jsBundleDirRelease: "$buildDir/intermediates/assets/release", + * + * // where to put drawable resources / React Native assets, e.g. the ones you use via + * // require('./image.png')), in debug mode + * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", + * + * // where to put drawable resources / React Native assets, e.g. the ones you use via + * // require('./image.png')), in release mode + * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", + * + * // by default the gradle tasks are skipped if none of the JS files or assets change; this means + * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to + * // date; if you have any other folders that you want to ignore for performance reasons (gradle + * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ + * // for example, you might want to remove it from here. + * inputExcludes: ["android/**", "ios/**"], + * + * // override which node gets called and with what additional arguments + * nodeExecutableAndArgs: ["node"], + * + * // supply additional arguments to the packager + * extraPackagerArgs: [] + * ] + */ + +apply from: "../../node_modules/react-native/react.gradle" + +/** + * Set this to true to create two separate APKs instead of one: + * - An APK that only works on ARM devices + * - An APK that only works on x86 devices + * The advantage is the size of the APK is reduced by about 4MB. + * Upload all the APKs to the Play Store and people will download + * the correct one based on the CPU architecture of their device. + */ +def enableSeparateBuildPerCPUArchitecture = false + +/** + * Run Proguard to shrink the Java bytecode in release builds. + */ +def enableProguardInReleaseBuilds = false + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.1" + + defaultConfig { + applicationId "com.jeepeng.push" + minSdkVersion 16 + targetSdkVersion 22 + versionCode 1 + versionName "1.0" + ndk { + abiFilters "armeabi-v7a", "x86" + } + } + splits { + abi { + reset() + enable enableSeparateBuildPerCPUArchitecture + universalApk false // If true, also generate a universal APK + include "armeabi-v7a", "x86" + } + } + buildTypes { + release { + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + } + } + // applicationVariants are e.g. debug, release + applicationVariants.all { variant -> + variant.outputs.each { output -> + // For each separate APK per architecture, set a unique version code as described here: + // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits + def versionCodes = ["armeabi-v7a":1, "x86":2] + def abi = output.getFilter(OutputFile.ABI) + if (abi != null) { // null for the universal-debug, universal-release variants + output.versionCodeOverride = + versionCodes.get(abi) * 1048576 + defaultConfig.versionCode + } + } + } +} + +dependencies { + compile project(':react-native-xinge-push') + compile fileTree(dir: "libs", include: ["*.jar"]) + compile "com.android.support:appcompat-v7:23.0.1" + compile "com.facebook.react:react-native:+" // From node_modules +} + +// Run this once to be able to run the application with BUCK +// puts all compile dependencies into folder libs for BUCK to use +task copyDownloadableDepsToLibs(type: Copy) { + from configurations.compile + into 'libs' +} diff --git a/example/android/app/proguard-rules.pro b/example/android/app/proguard-rules.pro new file mode 100644 index 0000000..6e8516c --- /dev/null +++ b/example/android/app/proguard-rules.pro @@ -0,0 +1,70 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Disabling obfuscation is useful if you collect stack traces from production crashes +# (unless you are using a system that supports de-obfuscate the stack traces). +-dontobfuscate + +# React Native + +# Keep our interfaces so they can be used by other ProGuard rules. +# See http://sourceforge.net/p/proguard/bugs/466/ +-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip +-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters +-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip + +# Do not strip any method/class that is annotated with @DoNotStrip +-keep @com.facebook.proguard.annotations.DoNotStrip class * +-keep @com.facebook.common.internal.DoNotStrip class * +-keepclassmembers class * { + @com.facebook.proguard.annotations.DoNotStrip *; + @com.facebook.common.internal.DoNotStrip *; +} + +-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * { + void set*(***); + *** get*(); +} + +-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } +-keep class * extends com.facebook.react.bridge.NativeModule { *; } +-keepclassmembers,includedescriptorclasses class * { native ; } +-keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; } +-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; } +-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; } + +-dontwarn com.facebook.react.** + +# TextLayoutBuilder uses a non-public Android constructor within StaticLayout. +# See libs/proxy/src/main/java/com/facebook/fbui/textlayoutbuilder/proxy for details. +-dontwarn android.text.StaticLayout + +# okhttp + +-keepattributes Signature +-keepattributes *Annotation* +-keep class okhttp3.** { *; } +-keep interface okhttp3.** { *; } +-dontwarn okhttp3.** + +# okio + +-keep class sun.misc.Unsafe { *; } +-dontwarn java.nio.file.* +-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement +-dontwarn okio.** diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..0fcc9ad --- /dev/null +++ b/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/android/app/src/main/java/com/example/MainActivity.java b/example/android/app/src/main/java/com/example/MainActivity.java new file mode 100644 index 0000000..e84b725 --- /dev/null +++ b/example/android/app/src/main/java/com/example/MainActivity.java @@ -0,0 +1,15 @@ +package com.example; + +import com.facebook.react.ReactActivity; + +public class MainActivity extends ReactActivity { + + /** + * Returns the name of the main component registered from JavaScript. + * This is used to schedule rendering of the component. + */ + @Override + protected String getMainComponentName() { + return "example"; + } +} diff --git a/example/android/app/src/main/java/com/example/MainApplication.java b/example/android/app/src/main/java/com/example/MainApplication.java new file mode 100644 index 0000000..24cc564 --- /dev/null +++ b/example/android/app/src/main/java/com/example/MainApplication.java @@ -0,0 +1,42 @@ +package com.example; + +import android.app.Application; + +import com.facebook.react.ReactApplication; +import com.jeepeng.react.xgpush.PushPackage; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.shell.MainReactPackage; +import com.facebook.soloader.SoLoader; + +import java.util.Arrays; +import java.util.List; + +public class MainApplication extends Application implements ReactApplication { + + private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { + @Override + public boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } + + @Override + protected List getPackages() { + return Arrays.asList( + new MainReactPackage(), + new PushPackage() + ); + } + }; + + @Override + public ReactNativeHost getReactNativeHost() { + return mReactNativeHost; + } + + @Override + public void onCreate() { + super.onCreate(); + SoLoader.init(this, /* native exopackage */ false); + } +} diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..cde69bc Binary files /dev/null and b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..c133a0c Binary files /dev/null and b/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..bfa42f0 Binary files /dev/null and b/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..324e72c Binary files /dev/null and b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/example/android/app/src/main/res/values/strings.xml b/example/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..41fcb0c --- /dev/null +++ b/example/android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + RN-XGPush + diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..319eb0c --- /dev/null +++ b/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/example/android/build.gradle b/example/android/build.gradle new file mode 100644 index 0000000..eed9972 --- /dev/null +++ b/example/android/build.gradle @@ -0,0 +1,24 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.2.3' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + mavenLocal() + jcenter() + maven { + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm + url "$rootDir/../node_modules/react-native/android" + } + } +} diff --git a/example/android/gradle.properties b/example/android/gradle.properties new file mode 100644 index 0000000..1fd964e --- /dev/null +++ b/example/android/gradle.properties @@ -0,0 +1,20 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +android.useDeprecatedNdk=true diff --git a/example/android/gradle/wrapper/gradle-wrapper.jar b/example/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..b5166da Binary files /dev/null and b/example/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..dbdc05d --- /dev/null +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/example/android/gradlew b/example/android/gradlew new file mode 100755 index 0000000..91a7e26 --- /dev/null +++ b/example/android/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/example/android/gradlew.bat b/example/android/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/example/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/example/android/keystores/BUCK b/example/android/keystores/BUCK new file mode 100644 index 0000000..88e4c31 --- /dev/null +++ b/example/android/keystores/BUCK @@ -0,0 +1,8 @@ +keystore( + name = "debug", + properties = "debug.keystore.properties", + store = "debug.keystore", + visibility = [ + "PUBLIC", + ], +) diff --git a/example/android/keystores/debug.keystore.properties b/example/android/keystores/debug.keystore.properties new file mode 100644 index 0000000..121bfb4 --- /dev/null +++ b/example/android/keystores/debug.keystore.properties @@ -0,0 +1,4 @@ +key.store=debug.keystore +key.alias=androiddebugkey +key.store.password=android +key.alias.password=android diff --git a/example/android/settings.gradle b/example/android/settings.gradle new file mode 100644 index 0000000..4dcca88 --- /dev/null +++ b/example/android/settings.gradle @@ -0,0 +1,5 @@ +rootProject.name = 'example' +include ':react-native-xinge-push' +project(':react-native-xinge-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-xinge-push/android') + +include ':app' diff --git a/example/app.json b/example/app.json new file mode 100644 index 0000000..486d55b --- /dev/null +++ b/example/app.json @@ -0,0 +1,4 @@ +{ + "name": "example", + "displayName": "example" +} \ No newline at end of file diff --git a/example/app/List.js b/example/app/List.js new file mode 100644 index 0000000..c9336b4 --- /dev/null +++ b/example/app/List.js @@ -0,0 +1,122 @@ +/** + * Created by Jeepeng on 2017/1/29. + */ + +import React, { Component } from 'react'; +import { + StyleSheet, + View, + Text, + TouchableNativeFeedback, + TouchableHighlight +} from 'react-native'; + +const Touchable = Platform.OS === 'android' ? TouchableNativeFeedback : TouchableHighlight; + +class Item extends Component { + + render() { + const { style, thumb, extra, arrow, onPress, children, _rightStyle } = this.props; + return ( + + + { thumb } + + { typeof children === 'string' ? + {children} + : {children} + } + { extra ? + + { typeof extra === 'string' ? + {extra} + : {extra} + } + : null + } + { arrow } + + + + ); + } +} + +class List extends Component { + + static Item = Item; + + render() { + const { renderHeader, renderFooter, children, style } = this.props; + return ( + + {renderHeader && renderHeader()} + + { + React.Children.map(children, (child, index) => { + const extraRightStyle = (React.isValidElement(children) || children.length - 1 === index) + ? styles.itemRightWithoutBorder : {}; + return React.cloneElement(child, { + _rightStyle: extraRightStyle, + }); + }) + } + + {renderFooter && renderFooter()} + + ); + } +} + +const styles = StyleSheet.create({ + list: { + + }, + listWrapper: { + borderWidth: StyleSheet.hairlineWidth, + borderColor: '#e4ecf0', + borderLeftWidth: 0, + borderRightWidth: 0, + }, + item: { + flexDirection: 'row', + alignItems: 'center', + }, + itemRight: { + flexGrow: 1, + minHeight: 45, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + alignSelf: 'stretch', + borderBottomWidth: StyleSheet.hairlineWidth, + borderBottomColor: '#e4ecf0', + }, + itemRightWithoutBorder: { + borderBottomWidth: 0, + }, + rightContentText: { + flex: 1, + fontSize: 15, + color: '#2b3d54' + }, + rightContent: { + flex: 1, + alignSelf: 'stretch', + }, + rightRight: { + flex: 1, + flexDirection: 'row', + justifyContent: 'flex-end', + alignItems: 'center', + alignSelf: 'stretch', + }, + rightExtraText: { + color: '#888', + fontSize: 16, + }, + rightExtra: {}, + +}); + +export default List; diff --git a/example/app/Touchable.js b/example/app/Touchable.js new file mode 100644 index 0000000..468f25c --- /dev/null +++ b/example/app/Touchable.js @@ -0,0 +1,28 @@ +/** + * Created by Jeepeng on 2017/3/3. + */ + +import React from 'react'; +import { + Platform, + TouchableNativeFeedback, + TouchableHighlight, +} from 'react-native'; + +const Touchable = ({ onPress, children, style }) => { + const child = React.Children.only(children); + if (Platform.OS === 'android') { + return ( + + {child} + + ); + } + return ( + + {child} + + ); +}; + +export default Touchable; diff --git a/example/app/index.js b/example/app/index.js new file mode 100644 index 0000000..9e98a78 --- /dev/null +++ b/example/app/index.js @@ -0,0 +1,181 @@ +/** + * Sample React Native App + * https://github.com/facebook/react-native + * @flow + */ + +import React, { Component } from 'react'; +import { + Platform, + StyleSheet, + Text, + View, + TouchableNativeFeedback, + TouchableHighlight +} from 'react-native'; +import XGPush from 'react-native-xinge-push'; + +const Touchable = Platform.OS === 'android' ? TouchableNativeFeedback : TouchableHighlight; + +class Example extends Component { + + constructor() { + super(); + this.state = { + isDebug: false + }; + this._enableDebug = this._enableDebug.bind(this); + this._isEnableDebug = this._isEnableDebug.bind(this); + + // 初始化推送 + this.initPush(); + } + + async initPush() { + let accessId; + let accessKey; + if(Platform.OS === 'ios') { + accessId = 1111111111; // 请将1111111111修改为APP的AccessId,10位数字 + accessKey = "YOUR_ACCESS_KEY"; // 请将YOUR_ACCESS_KEY修改为APP的AccessKey + } else { + accessId = 2222222222; + accessKey = "YOUR_ACCESS_KEY"; + } + // 初始化 + XGPush.init(accessId, accessKey); + + // 注册 + XGPush.register('jeepeng') + .then(result => { + // do something + // 或者在 onRegister 里处理,效果一样 + }) + .catch(err => { + console.log(err); + }); + } + + componentDidMount() { + XGPush.addEventListener('register', this._onRegister); + XGPush.addEventListener('message', this._onMessage); + XGPush.addEventListener('notification', this._onNotification); + } + + componentWillUnmount() { + XGPush.removeEventListener('register', this._onRegister); + XGPush.removeEventListener('message', this._onMessage); + XGPush.removeEventListener('notification', this._onNotification); + } + + /** + * 注册成功 + * @param deviceToken + * @private + */ + _onRegister(deviceToken) { + alert('onRegister: ' + deviceToken); + // 在ios中,register方法是向apns注册,如果要使用信鸽推送,得到deviceToken后还要向信鸽注册 + XGPush.registerForXG(deviceToken); + } + + /** + * 透传消息到达 + * @param message + * @private + */ + _onMessage(message) { + alert('收到透传消息: ' + message.content); + } + + /** + * 通知到达 + * @param notification + * @private + */ + _onNotification(notification) { + alert(JSON.stringify(notification)); + } + + /** + * 获取初始通知(点击通知后) + * @private + */ + _getInitialNotification() { + XGPush.getInitialNotification().then((result) => { + alert(JSON.stringify(result)); + }); + } + + _enableDebug() { + XGPush.enableDebug(!this.state.isDebug); + } + + _isEnableDebug() { + XGPush.isEnableDebug().then(result => { + this.setState({ + isDebug: result + }); + alert(result); + }); + } + + _setApplicationIconBadgeNumber(number = 0) { + XGPush.setApplicationIconBadgeNumber(number); + } + + _getApplicationIconBadgeNumber() { + XGPush.getApplicationIconBadgeNumber((number) => alert(number)); + } + + render() { + return ( + + + + getInitialNotification + + + { this._enableDebug() }} underlayColor="#ddd"> + + enableDebug + + + { this._isEnableDebug() }} underlayColor="#ddd"> + + isEnableDebug + + + { this._setApplicationIconBadgeNumber(99) }} underlayColor="#ddd"> + + setApplicationIconBadgeNumber: 99 + + + { this._getApplicationIconBadgeNumber() }} underlayColor="#ddd"> + + getApplicationIconBadgeNumber + + + + ); + } +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#fff', + }, + list: { + marginTop: 15, + backgroundColor: '#fff', + }, + item: { + height: 45, + alignItems: 'center', + justifyContent: 'center', + borderBottomWidth: StyleSheet.hairlineWidth, + borderBottomColor: '#efefef' + }, +}); + +export default Example; diff --git a/example/index.android.js b/example/index.android.js new file mode 100644 index 0000000..b4fb496 --- /dev/null +++ b/example/index.android.js @@ -0,0 +1,12 @@ +/** + * Sample React Native App + * https://github.com/facebook/react-native + * @flow + */ + +import React from 'react'; +import { AppRegistry } from 'react-native'; + +import App from './app/index.js'; + +AppRegistry.registerComponent('example', () => App); diff --git a/example/index.ios.js b/example/index.ios.js new file mode 100644 index 0000000..b4fb496 --- /dev/null +++ b/example/index.ios.js @@ -0,0 +1,12 @@ +/** + * Sample React Native App + * https://github.com/facebook/react-native + * @flow + */ + +import React from 'react'; +import { AppRegistry } from 'react-native'; + +import App from './app/index.js'; + +AppRegistry.registerComponent('example', () => App); diff --git a/example/ios/example-tvOS/Info.plist b/example/ios/example-tvOS/Info.plist new file mode 100644 index 0000000..2fb6a11 --- /dev/null +++ b/example/ios/example-tvOS/Info.plist @@ -0,0 +1,54 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + NSLocationWhenInUseUsageDescription + + NSAppTransportSecurity + + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + + diff --git a/example/ios/example-tvOSTests/Info.plist b/example/ios/example-tvOSTests/Info.plist new file mode 100644 index 0000000..886825c --- /dev/null +++ b/example/ios/example-tvOSTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/example/ios/example.xcodeproj/project.pbxproj b/example/ios/example.xcodeproj/project.pbxproj new file mode 100644 index 0000000..077ba1e --- /dev/null +++ b/example/ios/example.xcodeproj/project.pbxproj @@ -0,0 +1,1385 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; + 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; + 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; + 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; + 00E356F31AD99517003FC87E /* exampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* exampleTests.m */; }; + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; + 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; + 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; + 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; + 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; + 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; }; + 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; }; + 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; }; + 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; }; + 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; }; + 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; }; + 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; }; + 2DCD954D1E0B4F2C00145EB5 /* exampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* exampleTests.m */; }; + 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; + 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; + B45375BCB77A4645939B1E37 /* libXGPush.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 48BC8179268446D086625A27 /* libXGPush.a */; }; + C5A799E81EBC708F003E0295 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5A799E71EBC708F003E0295 /* UserNotifications.framework */; }; + C5A799FD1EBC7C41003E0295 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5A799FC1EBC7C41003E0295 /* CoreTelephony.framework */; }; + C5A799FF1EBC7C55003E0295 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5A799FE1EBC7C55003E0295 /* SystemConfiguration.framework */; }; + C5A79A011EBC7C9E003E0295 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = C5A79A001EBC7C9E003E0295 /* libz.tbd */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTActionSheet; + }; + 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTGeolocation; + }; + 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B5115D1A9E6B3D00147676; + remoteInfo = RCTImage; + }; + 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B511DB1A9E6C8500147676; + remoteInfo = RCTNetwork; + }; + 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; + remoteInfo = RCTVibration; + }; + 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 13B07F861A680F5B00A75B9A; + remoteInfo = example; + }; + 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTSettings; + }; + 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3C86DF461ADF2C930047B81A; + remoteInfo = RCTWebSocket; + }; + 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; + remoteInfo = React; + }; + 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7; + remoteInfo = "example-tvOS"; + }; + 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; + remoteInfo = "RCTImage-tvOS"; + }; + 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28471D9B043800D4039D; + remoteInfo = "RCTLinking-tvOS"; + }; + 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28541D9B044C00D4039D; + remoteInfo = "RCTNetwork-tvOS"; + }; + 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28611D9B046600D4039D; + remoteInfo = "RCTSettings-tvOS"; + }; + 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A287B1D9B048500D4039D; + remoteInfo = "RCTText-tvOS"; + }; + 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28881D9B049200D4039D; + remoteInfo = "RCTWebSocket-tvOS"; + }; + 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28131D9B038B00D4039D; + remoteInfo = "React-tvOS"; + }; + 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3C059A1DE3340900C268FA; + remoteInfo = yoga; + }; + 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3C06751DE3340C00C268FA; + remoteInfo = "yoga-tvOS"; + }; + 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4; + remoteInfo = cxxreact; + }; + 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; + remoteInfo = "cxxreact-tvOS"; + }; + 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4; + remoteInfo = jschelpers; + }; + 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4; + remoteInfo = "jschelpers-tvOS"; + }; + 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTAnimation; + }; + 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28201D9B03D100D4039D; + remoteInfo = "RCTAnimation-tvOS"; + }; + 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTLinking; + }; + 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B5119B1A9E6C1200147676; + remoteInfo = RCTText; + }; + C5A799C11EBACFF8003E0295 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4BB8548E84EA4996950E828B /* XGPush.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C50FF0241D54262A00CEF3D0; + remoteInfo = XGPush; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; + 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; + 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; + 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; + 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; + 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; + 00E356EE1AD99517003FC87E /* exampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = exampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 00E356F21AD99517003FC87E /* exampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = exampleTests.m; sourceTree = ""; }; + 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; + 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; + 13B07F961A680F5B00A75B9A /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = example/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = example/AppDelegate.m; sourceTree = ""; }; + 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = example/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = example/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = example/main.m; sourceTree = ""; }; + 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; + 2D02E47B1E0B4A5D006451C7 /* example-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 2D02E4901E0B4A5D006451C7 /* example-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "example-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 48BC8179268446D086625A27 /* libXGPush.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libXGPush.a; sourceTree = ""; }; + 4BB8548E84EA4996950E828B /* XGPush.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = XGPush.xcodeproj; path = "../node_modules/react-native-xinge-push/ios/XGPush.xcodeproj"; sourceTree = ""; }; + 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; + 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; + 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; + C5A799C31EBB2CDD003E0295 /* example.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = example.entitlements; path = example/example.entitlements; sourceTree = ""; }; + C5A799E71EBC708F003E0295 /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; + C5A799FC1EBC7C41003E0295 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; + C5A799FE1EBC7C55003E0295 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + C5A79A001EBC7C9E003E0295 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 00E356EB1AD99517003FC87E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C5A79A011EBC7C9E003E0295 /* libz.tbd in Frameworks */, + C5A799FF1EBC7C55003E0295 /* SystemConfiguration.framework in Frameworks */, + C5A799FD1EBC7C41003E0295 /* CoreTelephony.framework in Frameworks */, + C5A799E81EBC708F003E0295 /* UserNotifications.framework in Frameworks */, + 146834051AC3E58100842450 /* libReact.a in Frameworks */, + 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, + 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, + 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, + 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, + 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, + 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, + B45375BCB77A4645939B1E37 /* libXGPush.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E4781E0B4A5D006451C7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */, + 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */, + 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */, + 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */, + 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */, + 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */, + 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */, + 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 00C302A81ABCB8CE00DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302B61ABCB90400DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302BC1ABCB91800DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, + 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302D41ABCB9D200DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, + 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302E01ABCB9EE00DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, + ); + name = Products; + sourceTree = ""; + }; + 00E356EF1AD99517003FC87E /* exampleTests */ = { + isa = PBXGroup; + children = ( + 00E356F21AD99517003FC87E /* exampleTests.m */, + 00E356F01AD99517003FC87E /* Supporting Files */, + ); + path = exampleTests; + sourceTree = ""; + }; + 00E356F01AD99517003FC87E /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 00E356F11AD99517003FC87E /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 139105B71AF99BAD00B5F7CC /* Products */ = { + isa = PBXGroup; + children = ( + 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, + 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 139FDEE71B06529A00C62182 /* Products */ = { + isa = PBXGroup; + children = ( + 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, + 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 13B07FAE1A68108700A75B9A /* example */ = { + isa = PBXGroup; + children = ( + C5A799C31EBB2CDD003E0295 /* example.entitlements */, + 008F07F21AC5B25A0029DE68 /* main.jsbundle */, + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.m */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, + 13B07FB71A68108700A75B9A /* main.m */, + ); + name = example; + sourceTree = ""; + }; + 146834001AC3E56700842450 /* Products */ = { + isa = PBXGroup; + children = ( + 146834041AC3E56700842450 /* libReact.a */, + 3DAD3EA31DF850E9000B6D8A /* libReact.a */, + 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, + 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, + 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, + 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */, + 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */, + 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */, + ); + name = Products; + sourceTree = ""; + }; + 5E91572E1DD0AC6500FF2AA8 /* Products */ = { + isa = PBXGroup; + children = ( + 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, + 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */, + ); + name = Products; + sourceTree = ""; + }; + 78C398B11ACF4ADC00677621 /* Products */ = { + isa = PBXGroup; + children = ( + 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, + 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, + 146833FF1AC3E56700842450 /* React.xcodeproj */, + 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, + 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, + 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, + 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, + 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, + 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, + 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, + 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, + 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, + 4BB8548E84EA4996950E828B /* XGPush.xcodeproj */, + ); + name = Libraries; + sourceTree = ""; + }; + 832341B11AAA6A8300B99B32 /* Products */ = { + isa = PBXGroup; + children = ( + 832341B51AAA6A8300B99B32 /* libRCTText.a */, + 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* example */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 00E356EF1AD99517003FC87E /* exampleTests */, + 83CBBA001A601CBA00E9B192 /* Products */, + C5A799E61EBC708F003E0295 /* Frameworks */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* example.app */, + 00E356EE1AD99517003FC87E /* exampleTests.xctest */, + 2D02E47B1E0B4A5D006451C7 /* example-tvOS.app */, + 2D02E4901E0B4A5D006451C7 /* example-tvOSTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + C5A799A51EBACFF8003E0295 /* Products */ = { + isa = PBXGroup; + children = ( + C5A799C21EBACFF8003E0295 /* libXGPush.a */, + ); + name = Products; + sourceTree = ""; + }; + C5A799E61EBC708F003E0295 /* Frameworks */ = { + isa = PBXGroup; + children = ( + C5A79A001EBC7C9E003E0295 /* libz.tbd */, + C5A799FE1EBC7C55003E0295 /* SystemConfiguration.framework */, + C5A799FC1EBC7C41003E0295 /* CoreTelephony.framework */, + C5A799E71EBC708F003E0295 /* UserNotifications.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 00E356ED1AD99517003FC87E /* exampleTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "exampleTests" */; + buildPhases = ( + 00E356EA1AD99517003FC87E /* Sources */, + 00E356EB1AD99517003FC87E /* Frameworks */, + 00E356EC1AD99517003FC87E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 00E356F51AD99517003FC87E /* PBXTargetDependency */, + ); + name = exampleTests; + productName = exampleTests; + productReference = 00E356EE1AD99517003FC87E /* exampleTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 13B07F861A680F5B00A75B9A /* example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */; + buildPhases = ( + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = example; + productName = "Hello World"; + productReference = 13B07F961A680F5B00A75B9A /* example.app */; + productType = "com.apple.product-type.application"; + }; + 2D02E47A1E0B4A5D006451C7 /* example-tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "example-tvOS" */; + buildPhases = ( + 2D02E4771E0B4A5D006451C7 /* Sources */, + 2D02E4781E0B4A5D006451C7 /* Frameworks */, + 2D02E4791E0B4A5D006451C7 /* Resources */, + 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "example-tvOS"; + productName = "example-tvOS"; + productReference = 2D02E47B1E0B4A5D006451C7 /* example-tvOS.app */; + productType = "com.apple.product-type.application"; + }; + 2D02E48F1E0B4A5D006451C7 /* example-tvOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "example-tvOSTests" */; + buildPhases = ( + 2D02E48C1E0B4A5D006451C7 /* Sources */, + 2D02E48D1E0B4A5D006451C7 /* Frameworks */, + 2D02E48E1E0B4A5D006451C7 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */, + ); + name = "example-tvOSTests"; + productName = "example-tvOSTests"; + productReference = 2D02E4901E0B4A5D006451C7 /* example-tvOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = Facebook; + TargetAttributes = { + 00E356ED1AD99517003FC87E = { + CreatedOnToolsVersion = 6.2; + DevelopmentTeam = UP3K29WXYN; + TestTargetID = 13B07F861A680F5B00A75B9A; + }; + 13B07F861A680F5B00A75B9A = { + DevelopmentTeam = UP3K29WXYN; + SystemCapabilities = { + com.apple.BackgroundModes = { + enabled = 1; + }; + com.apple.Push = { + enabled = 1; + }; + }; + }; + 2D02E47A1E0B4A5D006451C7 = { + CreatedOnToolsVersion = 8.2.1; + ProvisioningStyle = Automatic; + }; + 2D02E48F1E0B4A5D006451C7 = { + CreatedOnToolsVersion = 8.2.1; + ProvisioningStyle = Automatic; + TestTargetID = 2D02E47A1E0B4A5D006451C7; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "example" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; + ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; + }, + { + ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; + ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; + }, + { + ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; + ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; + }, + { + ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; + ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + }, + { + ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; + ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + }, + { + ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; + ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + }, + { + ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; + ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + }, + { + ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; + ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + }, + { + ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; + ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; + }, + { + ProductGroup = 139FDEE71B06529A00C62182 /* Products */; + ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + }, + { + ProductGroup = 146834001AC3E56700842450 /* Products */; + ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; + }, + { + ProductGroup = C5A799A51EBACFF8003E0295 /* Products */; + ProjectRef = 4BB8548E84EA4996950E828B /* XGPush.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* example */, + 00E356ED1AD99517003FC87E /* exampleTests */, + 2D02E47A1E0B4A5D006451C7 /* example-tvOS */, + 2D02E48F1E0B4A5D006451C7 /* example-tvOSTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTActionSheet.a; + remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTGeolocation.a; + remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTImage.a; + remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTNetwork.a; + remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTVibration.a; + remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTSettings.a; + remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTWebSocket.a; + remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 146834041AC3E56700842450 /* libReact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libReact.a; + remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTImage-tvOS.a"; + remoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTLinking-tvOS.a"; + remoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTNetwork-tvOS.a"; + remoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTSettings-tvOS.a"; + remoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTText-tvOS.a"; + remoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTWebSocket-tvOS.a"; + remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA31DF850E9000B6D8A /* libReact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libReact.a; + remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libyoga.a; + remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libyoga.a; + remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libcxxreact.a; + remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libcxxreact.a; + remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjschelpers.a; + remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjschelpers.a; + remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTAnimation.a; + remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTAnimation.a; + remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTLinking.a; + remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTText.a; + remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C5A799C21EBACFF8003E0295 /* libXGPush.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libXGPush.a; + remoteRef = C5A799C11EBACFF8003E0295 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 00E356EC1AD99517003FC87E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E4791E0B4A5D006451C7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E48E1E0B4A5D006451C7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; + }; + 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native Code And Images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 00E356EA1AD99517003FC87E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00E356F31AD99517003FC87E /* exampleTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E4771E0B4A5D006451C7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */, + 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E48C1E0B4A5D006451C7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2DCD954D1E0B4F2C00145EB5 /* exampleTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 13B07F861A680F5B00A75B9A /* example */; + targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; + }; + 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2D02E47A1E0B4A5D006451C7 /* example-tvOS */; + targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 13B07FB21A68108700A75B9A /* Base */, + ); + name = LaunchScreen.xib; + path = example; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 00E356F61AD99517003FC87E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + DEVELOPMENT_TEAM = UP3K29WXYN; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-xinge-push/ios/**", + ); + INFOPLIST_FILE = exampleTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/example"; + }; + name = Debug; + }; + 00E356F71AD99517003FC87E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COPY_PHASE_STRIP = NO; + DEVELOPMENT_TEAM = UP3K29WXYN; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-xinge-push/ios/**", + ); + INFOPLIST_FILE = exampleTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/example"; + }; + name = Release; + }; + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = example/example.entitlements; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = NO; + DEVELOPMENT_TEAM = UP3K29WXYN; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-xinge-push/ios/**", + ); + INFOPLIST_FILE = example/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.jeepeng.push; + PRODUCT_NAME = example; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = example/example.entitlements; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = UP3K29WXYN; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-xinge-push/ios/**", + ); + INFOPLIST_FILE = example/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.jeepeng.push; + PRODUCT_NAME = example; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 2D02E4971E0B4A5E006451C7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-xinge-push/ios/**", + ); + INFOPLIST_FILE = "example-tvOS/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.example-tvOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.2; + }; + name = Debug; + }; + 2D02E4981E0B4A5E006451C7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_NO_COMMON_BLOCKS = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-xinge-push/ios/**", + ); + INFOPLIST_FILE = "example-tvOS/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.example-tvOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.2; + }; + name = Release; + }; + 2D02E4991E0B4A5E006451C7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "example-tvOSTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.example-tvOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example-tvOS.app/example-tvOS"; + TVOS_DEPLOYMENT_TARGET = 10.1; + }; + name = Debug; + }; + 2D02E49A1E0B4A5E006451C7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "example-tvOSTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.example-tvOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example-tvOS.app/example-tvOS"; + TVOS_DEPLOYMENT_TARGET = 10.1; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "exampleTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 00E356F61AD99517003FC87E /* Debug */, + 00E356F71AD99517003FC87E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "example-tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2D02E4971E0B4A5E006451C7 /* Debug */, + 2D02E4981E0B4A5E006451C7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "example-tvOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2D02E4991E0B4A5E006451C7 /* Debug */, + 2D02E49A1E0B4A5E006451C7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/example/ios/example.xcodeproj/xcshareddata/xcschemes/example-tvOS.xcscheme b/example/ios/example.xcodeproj/xcshareddata/xcschemes/example-tvOS.xcscheme new file mode 100644 index 0000000..c6c843e --- /dev/null +++ b/example/ios/example.xcodeproj/xcshareddata/xcschemes/example-tvOS.xcscheme @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme b/example/ios/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme new file mode 100644 index 0000000..c13a4bf --- /dev/null +++ b/example/ios/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/example/AppDelegate.h b/example/ios/example/AppDelegate.h new file mode 100644 index 0000000..a9654d5 --- /dev/null +++ b/example/ios/example/AppDelegate.h @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@interface AppDelegate : UIResponder + +@property (nonatomic, strong) UIWindow *window; + +@end diff --git a/example/ios/example/AppDelegate.m b/example/ios/example/AppDelegate.m new file mode 100644 index 0000000..e844ebd --- /dev/null +++ b/example/ios/example/AppDelegate.m @@ -0,0 +1,88 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AppDelegate.h" + +#import +#import +#import + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 + +#import +@interface AppDelegate() +@end +#endif + +@interface AppDelegate () + +@end + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + NSURL *jsCodeLocation; + + jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; + + RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation + moduleName:@"example" + initialProperties:nil + launchOptions:launchOptions]; + rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; + + self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; + UIViewController *rootViewController = [UIViewController new]; + rootViewController.view = rootView; + self.window.rootViewController = rootViewController; + [self.window makeKeyAndVisible]; + // 统计从推送打开的设备 + [XGPushManager handleLaunching:launchOptions successCallback:^{ + NSLog(@"[XGPush] Handle launching success"); + } errorCallback:^{ + NSLog(@"[XGPush] Handle launching error"); + }]; + return YES; +} + +// Required to register for notifications +- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings +{ + [XGPushManager didRegisterUserNotificationSettings:notificationSettings]; +} +// Required for the register event. +- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken +{ + [XGPushManager didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; +} +// Required for the notification event. You must call the completion handler after handling the remote notification. +- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo +fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler +{ + [XGPushManager didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; + // 统计收到推送的设备 + [XGPushManager handleReceiveNotification:userInfo successCallback:^{ + NSLog(@"[XGPush] Handle receive success"); + } errorCallback:^{ + NSLog(@"[XGPush] Handle receive error"); + }]; +} +// Required for the registrationError event. +- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error +{ + [XGPushManager didFailToRegisterForRemoteNotificationsWithError:error]; +} +// Required for the localNotification event. +- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification +{ + [XGPushManager didReceiveLocalNotification:notification]; +} + +@end diff --git a/example/ios/example/Base.lproj/LaunchScreen.xib b/example/ios/example/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..9e04807 --- /dev/null +++ b/example/ios/example/Base.lproj/LaunchScreen.xib @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/example/Images.xcassets/AppIcon.appiconset/Contents.json b/example/ios/example/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..b8236c6 --- /dev/null +++ b/example/ios/example/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,48 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/example/ios/example/Info.plist b/example/ios/example/Info.plist new file mode 100644 index 0000000..93ca8cd --- /dev/null +++ b/example/ios/example/Info.plist @@ -0,0 +1,59 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + example + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + NSLocationWhenInUseUsageDescription + + UIBackgroundModes + + remote-notification + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/example/ios/example/example.entitlements b/example/ios/example/example.entitlements new file mode 100644 index 0000000..903def2 --- /dev/null +++ b/example/ios/example/example.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + diff --git a/example/ios/example/main.m b/example/ios/example/main.m new file mode 100644 index 0000000..3d767fc --- /dev/null +++ b/example/ios/example/main.m @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/example/ios/exampleTests/Info.plist b/example/ios/exampleTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/example/ios/exampleTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/example/ios/exampleTests/exampleTests.m b/example/ios/exampleTests/exampleTests.m new file mode 100644 index 0000000..fd24cf9 --- /dev/null +++ b/example/ios/exampleTests/exampleTests.m @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import +#import + +#import +#import + +#define TIMEOUT_SECONDS 600 +#define TEXT_TO_LOOK_FOR @"Welcome to React Native!" + +@interface exampleTests : XCTestCase + +@end + +@implementation exampleTests + +- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test +{ + if (test(view)) { + return YES; + } + for (UIView *subview in [view subviews]) { + if ([self findSubviewInView:subview matching:test]) { + return YES; + } + } + return NO; +} + +- (void)testRendersWelcomeScreen +{ + UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; + NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; + BOOL foundElement = NO; + + __block NSString *redboxError = nil; + RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { + if (level >= RCTLogLevelError) { + redboxError = message; + } + }); + + while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { + [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + + foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { + if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { + return YES; + } + return NO; + }]; + } + + RCTSetLogFunction(RCTDefaultLogFunction); + + XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); + XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); +} + + +@end diff --git a/example/package-lock.json b/example/package-lock.json new file mode 100644 index 0000000..a4a7d99 --- /dev/null +++ b/example/package-lock.json @@ -0,0 +1,2878 @@ +{ + "name": "example", + "version": "0.0.1", + "lockfileVersion": 1, + "dependencies": { + "abab": { + "version": "https://registry.cnpmjs.org/abab/download/abab-1.0.3.tgz", + "integrity": "sha1-uB3l9ydOxOdW15fNg08wNkJyTl0=", + "dev": true + }, + "absolute-path": { + "version": "https://registry.cnpmjs.org/absolute-path/download/absolute-path-0.0.0.tgz", + "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=" + }, + "accepts": { + "version": "https://registry.cnpmjs.org/accepts/download/accepts-1.2.13.tgz", + "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=" + }, + "acorn": { + "version": "https://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz", + "integrity": "sha1-7c2jvZN+dVZBDULtWGD2c5nHlMA=", + "dev": true + }, + "acorn-globals": { + "version": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "dev": true + }, + "ajv": { + "version": "https://r.cnpmjs.org/ajv/download/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=" + }, + "align-text": { + "version": "https://registry.cnpmjs.org/align-text/download/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=" + }, + "amdefine": { + "version": "https://r.cnpmjs.org/amdefine/download/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi": { + "version": "https://registry.cnpmjs.org/ansi/download/ansi-0.3.1.tgz", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" + }, + "ansi-escapes": { + "version": "https://registry.cnpmjs.org/ansi-escapes/download/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, + "ansi-regex": { + "version": "https://r.cnpmjs.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", + "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=" + }, + "append-transform": { + "version": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true + }, + "are-we-there-yet": { + "version": "https://r.cnpmjs.org/are-we-there-yet/download/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=" + }, + "argparse": { + "version": "https://registry.cnpmjs.org/argparse/download/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true + }, + "arr-diff": { + "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=" + }, + "arr-flatten": { + "version": "https://r.cnpmjs.org/arr-flatten/download/arr-flatten-1.0.3.tgz", + "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=" + }, + "array-differ": { + "version": "https://registry.cnpmjs.org/array-differ/download/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" + }, + "array-equal": { + "version": "https://registry.cnpmjs.org/array-equal/download/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-filter": { + "version": "https://r.cnpmjs.org/array-filter/download/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "array-map": { + "version": "https://r.cnpmjs.org/array-map/download/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "https://r.cnpmjs.org/array-reduce/download/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "array-uniq": { + "version": "https://registry.cnpmjs.org/array-uniq/download/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "arrify": { + "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "art": { + "version": "https://registry.cnpmjs.org/art/download/art-0.10.1.tgz", + "integrity": "sha1-OFQYg+OZIlxeGT/yRujxV897IUY=" + }, + "asap": { + "version": "https://registry.cnpmjs.org/asap/download/asap-2.0.5.tgz", + "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8=" + }, + "asn1": { + "version": "https://registry.cnpmjs.org/asn1/download/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "https://registry.cnpmjs.org/assert-plus/download/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + }, + "async": { + "version": "https://r.cnpmjs.org/async/download/async-2.4.0.tgz", + "integrity": "sha1-SZAgDxjqW4N8LMT4wDGmmFw4VhE=" + }, + "asynckit": { + "version": "https://registry.cnpmjs.org/asynckit/download/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "https://registry.cnpmjs.org/aws-sign2/download/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "aws4": { + "version": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "babel-code-frame": { + "version": "https://r.cnpmjs.org/babel-code-frame/download/babel-code-frame-6.22.0.tgz", + "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=" + }, + "babel-core": { + "version": "https://r.cnpmjs.org/babel-core/download/babel-core-6.24.1.tgz", + "integrity": "sha1-jEKFZNzh4fQfszfsNPTDsCK1rYM=", + "dependencies": { + "json5": { + "version": "https://r.cnpmjs.org/json5/download/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + } + } + }, + "babel-generator": { + "version": "https://r.cnpmjs.org/babel-generator/download/babel-generator-6.24.1.tgz", + "integrity": "sha1-5xX0hsWN7SVknYiJRNUqoHxdlJc=" + }, + "babel-helper-builder-react-jsx": { + "version": "https://r.cnpmjs.org/babel-helper-builder-react-jsx/download/babel-helper-builder-react-jsx-6.24.1.tgz", + "integrity": "sha1-CteRfjPI11HmRtrKTnfMGTd9LLw=" + }, + "babel-helper-call-delegate": { + "version": "https://r.cnpmjs.org/babel-helper-call-delegate/download/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=" + }, + "babel-helper-define-map": { + "version": "https://r.cnpmjs.org/babel-helper-define-map/download/babel-helper-define-map-6.24.1.tgz", + "integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=" + }, + "babel-helper-function-name": { + "version": "https://r.cnpmjs.org/babel-helper-function-name/download/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=" + }, + "babel-helper-get-function-arity": { + "version": "https://r.cnpmjs.org/babel-helper-get-function-arity/download/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=" + }, + "babel-helper-hoist-variables": { + "version": "https://r.cnpmjs.org/babel-helper-hoist-variables/download/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=" + }, + "babel-helper-optimise-call-expression": { + "version": "https://r.cnpmjs.org/babel-helper-optimise-call-expression/download/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=" + }, + "babel-helper-regex": { + "version": "https://r.cnpmjs.org/babel-helper-regex/download/babel-helper-regex-6.24.1.tgz", + "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=" + }, + "babel-helper-remap-async-to-generator": { + "version": "https://r.cnpmjs.org/babel-helper-remap-async-to-generator/download/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=" + }, + "babel-helper-replace-supers": { + "version": "https://r.cnpmjs.org/babel-helper-replace-supers/download/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=" + }, + "babel-helpers": { + "version": "https://r.cnpmjs.org/babel-helpers/download/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=" + }, + "babel-jest": { + "version": "https://r.cnpmjs.org/babel-jest/download/babel-jest-19.0.0.tgz", + "integrity": "sha1-WTI87ZmjqE01naIZyogQdP/Gzj8=", + "dev": true + }, + "babel-messages": { + "version": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=" + }, + "babel-plugin-check-es2015-constants": { + "version": "https://r.cnpmjs.org/babel-plugin-check-es2015-constants/download/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=" + }, + "babel-plugin-external-helpers": { + "version": "https://r.cnpmjs.org/babel-plugin-external-helpers/download/babel-plugin-external-helpers-6.22.0.tgz", + "integrity": "sha1-IoX0iwK9Xe3oUXXK+MYuhq3M76E=" + }, + "babel-plugin-istanbul": { + "version": "https://r.cnpmjs.org/babel-plugin-istanbul/download/babel-plugin-istanbul-4.1.3.tgz", + "integrity": "sha1-buYoBBDc9Zx3R1GMPf2YaAlY8QI=", + "dev": true, + "dependencies": { + "find-up": { + "version": "https://r.cnpmjs.org/find-up/download/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true + } + } + }, + "babel-plugin-jest-hoist": { + "version": "https://r.cnpmjs.org/babel-plugin-jest-hoist/download/babel-plugin-jest-hoist-19.0.0.tgz", + "integrity": "sha1-SuKgTqYSpuc2UfP95SwXiZEwS+o=", + "dev": true + }, + "babel-plugin-react-transform": { + "version": "https://registry.cnpmjs.org/babel-plugin-react-transform/download/babel-plugin-react-transform-2.0.2.tgz", + "integrity": "sha1-UVu/qZaJOYEULZCx+bFjXeKZUQk=" + }, + "babel-plugin-syntax-async-functions": { + "version": "https://registry.cnpmjs.org/babel-plugin-syntax-async-functions/download/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" + }, + "babel-plugin-syntax-class-properties": { + "version": "https://registry.cnpmjs.org/babel-plugin-syntax-class-properties/download/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" + }, + "babel-plugin-syntax-flow": { + "version": "https://registry.cnpmjs.org/babel-plugin-syntax-flow/download/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" + }, + "babel-plugin-syntax-jsx": { + "version": "https://registry.cnpmjs.org/babel-plugin-syntax-jsx/download/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "https://registry.cnpmjs.org/babel-plugin-syntax-object-rest-spread/download/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "https://r.cnpmjs.org/babel-plugin-syntax-trailing-function-commas/download/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + }, + "babel-plugin-transform-async-to-generator": { + "version": "https://registry.cnpmjs.org/babel-plugin-transform-async-to-generator/download/babel-plugin-transform-async-to-generator-6.16.0.tgz", + "integrity": "sha1-Gew2yxSGtZ+fRorfpCzhOQjKKZk=" + }, + "babel-plugin-transform-class-properties": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-class-properties/download/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=" + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-arrow-functions/download/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=" + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-block-scoped-functions/download/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=" + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-block-scoping/download/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", + "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=" + }, + "babel-plugin-transform-es2015-classes": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-classes/download/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=" + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-computed-properties/download/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=" + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=" + }, + "babel-plugin-transform-es2015-for-of": { + "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=" + }, + "babel-plugin-transform-es2015-function-name": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-function-name/download/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=" + }, + "babel-plugin-transform-es2015-literals": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-literals/download/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=" + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-modules-commonjs/download/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", + "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=" + }, + "babel-plugin-transform-es2015-object-super": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-object-super/download/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=" + }, + "babel-plugin-transform-es2015-parameters": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-parameters/download/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=" + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-shorthand-properties/download/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=" + }, + "babel-plugin-transform-es2015-spread": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-spread/download/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=" + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-sticky-regex/download/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=" + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-template-literals/download/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=" + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es2015-unicode-regex/download/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=" + }, + "babel-plugin-transform-es3-member-expression-literals": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es3-member-expression-literals/download/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz", + "integrity": "sha1-cz00RPPsxBvvjtGmpOCWV7iWnrs=" + }, + "babel-plugin-transform-es3-property-literals": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-es3-property-literals/download/babel-plugin-transform-es3-property-literals-6.22.0.tgz", + "integrity": "sha1-sgeNWELiKr9A9z6M3pzTcRq9V1g=" + }, + "babel-plugin-transform-flow-strip-types": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-flow-strip-types/download/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=" + }, + "babel-plugin-transform-object-assign": { + "version": "https://registry.npmjs.org/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz", + "integrity": "sha1-+Z0vZvGgsNSY40bFNZaEdAyqILo=" + }, + "babel-plugin-transform-object-rest-spread": { + "version": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", + "integrity": "sha1-h11ryb52HFiirj/u5dxIldjH+SE=" + }, + "babel-plugin-transform-react-display-name": { + "version": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.23.0.tgz", + "integrity": "sha1-Q5iRDDWEQdxM7xh4cmTQQS7Tazc=" + }, + "babel-plugin-transform-react-jsx": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-react-jsx/download/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=" + }, + "babel-plugin-transform-react-jsx-source": { + "version": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=" + }, + "babel-plugin-transform-regenerator": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-regenerator/download/babel-plugin-transform-regenerator-6.24.1.tgz", + "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=" + }, + "babel-plugin-transform-strict-mode": { + "version": "https://r.cnpmjs.org/babel-plugin-transform-strict-mode/download/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=" + }, + "babel-polyfill": { + "version": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", + "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", + "dependencies": { + "regenerator-runtime": { + "version": "https://r.cnpmjs.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + } + } + }, + "babel-preset-es2015-node": { + "version": "https://registry.npmjs.org/babel-preset-es2015-node/-/babel-preset-es2015-node-6.1.1.tgz", + "integrity": "sha1-YLIxVwJLDP6/OmNVTLBe4DW05V8=" + }, + "babel-preset-fbjs": { + "version": "https://r.cnpmjs.org/babel-preset-fbjs/download/babel-preset-fbjs-2.1.1.tgz", + "integrity": "sha1-OJDJ53bA/YL31QSTW5i+gFSJUoo=" + }, + "babel-preset-jest": { + "version": "https://r.cnpmjs.org/babel-preset-jest/download/babel-preset-jest-19.0.0.tgz", + "integrity": "sha1-ItZyAdAjJKGVgRKI6zgpS7PKw5Y=", + "dev": true + }, + "babel-preset-react-native": { + "version": "https://r.cnpmjs.org/babel-preset-react-native/download/babel-preset-react-native-1.9.1.tgz", + "integrity": "sha1-7I43gnRBDXj1UPqfjt1wNT87sv4=" + }, + "babel-register": { + "version": "https://r.cnpmjs.org/babel-register/download/babel-register-6.24.1.tgz", + "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=" + }, + "babel-runtime": { + "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dependencies": { + "regenerator-runtime": { + "version": "https://r.cnpmjs.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + } + } + }, + "babel-template": { + "version": "https://r.cnpmjs.org/babel-template/download/babel-template-6.24.1.tgz", + "integrity": "sha1-BK5RTx+Ts6JTfyoPYKWkX7gwgzM=" + }, + "babel-traverse": { + "version": "https://r.cnpmjs.org/babel-traverse/download/babel-traverse-6.24.1.tgz", + "integrity": "sha1-qzZnP9NW+aCUhlnnszjV/q2zFpU=" + }, + "babel-types": { + "version": "https://r.cnpmjs.org/babel-types/download/babel-types-6.24.1.tgz", + "integrity": "sha1-oTaHncFbNga9oNkMH8dDBML/CXU=" + }, + "babylon": { + "version": "https://r.cnpmjs.org/babylon/download/babylon-6.17.0.tgz", + "integrity": "sha1-N9qUiHhIi5xOPEA4iT+jMUs/yTI=" + }, + "balanced-match": { + "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + }, + "base64-js": { + "version": "https://registry.cnpmjs.org/base64-js/download/base64-js-1.2.0.tgz", + "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=" + }, + "base64-url": { + "version": "https://registry.cnpmjs.org/base64-url/download/base64-url-1.2.1.tgz", + "integrity": "sha1-GZ/WYXAqDnt9yubgaYuwicUvbXg=" + }, + "basic-auth": { + "version": "https://registry.cnpmjs.org/basic-auth/download/basic-auth-1.0.4.tgz", + "integrity": "sha1-Awk1sB3nyblKgksp8/zLdQ06UpA=" + }, + "basic-auth-connect": { + "version": "https://registry.cnpmjs.org/basic-auth-connect/download/basic-auth-connect-1.0.0.tgz", + "integrity": "sha1-/bC0OWLKe0BFanwrtI/hc9otISI=" + }, + "batch": { + "version": "https://registry.cnpmjs.org/batch/download/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=" + }, + "bcrypt-pbkdf": { + "version": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true + }, + "beeper": { + "version": "https://r.cnpmjs.org/beeper/download/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=" + }, + "big-integer": { + "version": "https://r.cnpmjs.org/big-integer/download/big-integer-1.6.22.tgz", + "integrity": "sha1-SHyV/OiGAi6kj/XxnjiJMt9G3S4=" + }, + "body-parser": { + "version": "https://registry.cnpmjs.org/body-parser/download/body-parser-1.13.3.tgz", + "integrity": "sha1-wIzzMMM1jhUQFqBXRvE/ApyX+pc=", + "dependencies": { + "debug": { + "version": "https://r.cnpmjs.org/debug/download/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=" + }, + "ms": { + "version": "https://r.cnpmjs.org/ms/download/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "boom": { + "version": "https://registry.cnpmjs.org/boom/download/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=" + }, + "bplist-creator": { + "version": "https://r.cnpmjs.org/bplist-creator/download/bplist-creator-0.0.7.tgz", + "integrity": "sha1-N98VNgkoJLh8QvlXsBNEEXNyrkU=" + }, + "bplist-parser": { + "version": "https://registry.cnpmjs.org/bplist-parser/download/bplist-parser-0.1.1.tgz", + "integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=" + }, + "brace-expansion": { + "version": "https://r.cnpmjs.org/brace-expansion/download/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=" + }, + "braces": { + "version": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=" + }, + "browser-resolve": { + "version": "https://registry.cnpmjs.org/browser-resolve/download/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "dependencies": { + "resolve": { + "version": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "bser": { + "version": "https://registry.npmjs.org/bser/-/bser-1.0.3.tgz", + "integrity": "sha1-1j2hnuFzMKDiYNKjRCKyGolSAxc=" + }, + "buffer-shims": { + "version": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "builtin-modules": { + "version": "https://registry.cnpmjs.org/builtin-modules/download/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "bytes": { + "version": "https://registry.cnpmjs.org/bytes/download/bytes-2.1.0.tgz", + "integrity": "sha1-rJPEEOL/ycx89LRks4KJBn9eR7Q=" + }, + "callsites": { + "version": "https://registry.cnpmjs.org/callsites/download/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "https://registry.cnpmjs.org/camelcase/download/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "caseless": { + "version": "https://r.cnpmjs.org/caseless/download/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "https://registry.cnpmjs.org/center-align/download/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=" + }, + "chalk": { + "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=" + }, + "ci-info": { + "version": "https://registry.cnpmjs.org/ci-info/download/ci-info-1.0.0.tgz", + "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=", + "dev": true + }, + "cli-cursor": { + "version": "https://registry.cnpmjs.org/cli-cursor/download/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=" + }, + "cli-width": { + "version": "https://registry.cnpmjs.org/cli-width/download/cli-width-2.1.0.tgz", + "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=" + }, + "cliui": { + "version": "https://registry.cnpmjs.org/cliui/download/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dependencies": { + "wordwrap": { + "version": "https://r.cnpmjs.org/wordwrap/download/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + } + } + }, + "clone": { + "version": "https://registry.cnpmjs.org/clone/download/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" + }, + "clone-stats": { + "version": "https://registry.cnpmjs.org/clone-stats/download/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" + }, + "co": { + "version": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "https://r.cnpmjs.org/code-point-at/download/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "https://r.cnpmjs.org/color-convert/download/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true + }, + "color-name": { + "version": "https://r.cnpmjs.org/color-name/download/color-name-1.1.2.tgz", + "integrity": "sha1-XIq3K2S9IhXWF66VWeuxSEdc+Y0=", + "dev": true + }, + "combined-stream": { + "version": "https://registry.cnpmjs.org/combined-stream/download/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=" + }, + "commander": { + "version": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=" + }, + "compressible": { + "version": "https://r.cnpmjs.org/compressible/download/compressible-2.0.10.tgz", + "integrity": "sha1-/tocf3YXkScyspv4zyYlKiC57s0=" + }, + "compression": { + "version": "https://registry.cnpmjs.org/compression/download/compression-1.5.2.tgz", + "integrity": "sha1-sDuNhub4rSloPLqN+R3cb/x3s5U=", + "dependencies": { + "debug": { + "version": "https://r.cnpmjs.org/debug/download/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=" + }, + "ms": { + "version": "https://r.cnpmjs.org/ms/download/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "concat-map": { + "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "https://r.cnpmjs.org/concat-stream/download/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=" + }, + "connect": { + "version": "https://registry.cnpmjs.org/connect/download/connect-2.30.2.tgz", + "integrity": "sha1-jam8vooFTT0xjXTf7JA7XDmhtgk=", + "dependencies": { + "debug": { + "version": "https://r.cnpmjs.org/debug/download/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=" + }, + "ms": { + "version": "https://r.cnpmjs.org/ms/download/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "connect-timeout": { + "version": "https://registry.cnpmjs.org/connect-timeout/download/connect-timeout-1.6.2.tgz", + "integrity": "sha1-3ppexh4zoStu2qt7XwYumMWZuI4=", + "dependencies": { + "debug": { + "version": "https://r.cnpmjs.org/debug/download/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=" + }, + "ms": { + "version": "https://r.cnpmjs.org/ms/download/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "content-type": { + "version": "https://registry.cnpmjs.org/content-type/download/content-type-1.0.2.tgz", + "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=" + }, + "content-type-parser": { + "version": "https://registry.cnpmjs.org/content-type-parser/download/content-type-parser-1.0.1.tgz", + "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ=", + "dev": true + }, + "convert-source-map": { + "version": "https://r.cnpmjs.org/convert-source-map/download/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" + }, + "cookie": { + "version": "https://r.cnpmjs.org/cookie/download/cookie-0.1.3.tgz", + "integrity": "sha1-5zSlwUF/zkctWu+Cw4HKu2TRpDU=" + }, + "cookie-parser": { + "version": "https://registry.cnpmjs.org/cookie-parser/download/cookie-parser-1.3.5.tgz", + "integrity": "sha1-nXVVcPtdF4kHcSJ6AjFNm+fPg1Y=" + }, + "cookie-signature": { + "version": "https://registry.cnpmjs.org/cookie-signature/download/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-js": { + "version": "https://registry.cnpmjs.org/core-js/download/core-js-2.4.1.tgz", + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" + }, + "core-util-is": { + "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "crc": { + "version": "https://registry.cnpmjs.org/crc/download/crc-3.3.0.tgz", + "integrity": "sha1-+mIuG8OIvyVzCQgta2UgDOZwkLo=" + }, + "cross-spawn": { + "version": "https://registry.cnpmjs.org/cross-spawn/download/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=" + }, + "cryptiles": { + "version": "https://registry.cnpmjs.org/cryptiles/download/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=" + }, + "csrf": { + "version": "https://r.cnpmjs.org/csrf/download/csrf-3.0.6.tgz", + "integrity": "sha1-thEg3c7q/JHnbtUxO7XAsmZ7cQo=" + }, + "cssom": { + "version": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", + "dev": true + }, + "cssstyle": { + "version": "https://registry.cnpmjs.org/cssstyle/download/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "dev": true + }, + "csurf": { + "version": "https://registry.cnpmjs.org/csurf/download/csurf-1.8.3.tgz", + "integrity": "sha1-I/KhO/HY/OHQyZZYg5RELLqGpWo=" + }, + "dashdash": { + "version": "https://r.cnpmjs.org/dashdash/download/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": { + "version": "https://registry.cnpmjs.org/assert-plus/download/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "dateformat": { + "version": "https://r.cnpmjs.org/dateformat/download/dateformat-2.0.0.tgz", + "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=" + }, + "debug": { + "version": "https://r.cnpmjs.org/debug/download/debug-2.6.6.tgz", + "integrity": "sha1-qfpvvpykPPHnn3O3XAGJy7fW21o=" + }, + "decamelize": { + "version": "https://registry.cnpmjs.org/decamelize/download/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-is": { + "version": "https://registry.cnpmjs.org/deep-is/download/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true + }, + "delayed-stream": { + "version": "https://registry.cnpmjs.org/delayed-stream/download/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "https://registry.cnpmjs.org/delegates/download/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "denodeify": { + "version": "https://registry.cnpmjs.org/denodeify/download/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=" + }, + "depd": { + "version": "https://registry.cnpmjs.org/depd/download/depd-1.0.1.tgz", + "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=" + }, + "destroy": { + "version": "https://registry.cnpmjs.org/destroy/download/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-indent": { + "version": "https://registry.cnpmjs.org/detect-indent/download/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=" + }, + "diff": { + "version": "https://r.cnpmjs.org/diff/download/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "dom-walk": { + "version": "https://registry.cnpmjs.org/dom-walk/download/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, + "duplexer2": { + "version": "https://r.cnpmjs.org/duplexer2/download/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dependencies": { + "isarray": { + "version": "https://r.cnpmjs.org/isarray/download/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "https://registry.cnpmjs.org/readable-stream/download/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=" + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "ecc-jsbn": { + "version": "https://registry.cnpmjs.org/ecc-jsbn/download/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true + }, + "ee-first": { + "version": "https://registry.cnpmjs.org/ee-first/download/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encoding": { + "version": "https://registry.cnpmjs.org/encoding/download/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dependencies": { + "iconv-lite": { + "version": "https://r.cnpmjs.org/iconv-lite/download/iconv-lite-0.4.17.tgz", + "integrity": "sha1-T9qjs4rLwsAxsEXQ7c3+HsqxjI0=" + } + } + }, + "errno": { + "version": "https://registry.cnpmjs.org/errno/download/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=" + }, + "error-ex": { + "version": "https://r.cnpmjs.org/error-ex/download/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=" + }, + "errorhandler": { + "version": "https://registry.cnpmjs.org/errorhandler/download/errorhandler-1.4.3.tgz", + "integrity": "sha1-t7cO2PNZ6duICS8tIMD4MUIK2D8=", + "dependencies": { + "accepts": { + "version": "https://registry.cnpmjs.org/accepts/download/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=" + }, + "negotiator": { + "version": "https://r.cnpmjs.org/negotiator/download/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + } + } + }, + "escape-html": { + "version": "https://registry.cnpmjs.org/escape-html/download/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "https://registry.cnpmjs.org/escodegen/download/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "dependencies": { + "esprima": { + "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "source-map": { + "version": "https://registry.cnpmjs.org/source-map/download/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true + } + } + }, + "esprima": { + "version": "https://r.cnpmjs.org/esprima/download/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "estraverse": { + "version": "https://registry.cnpmjs.org/estraverse/download/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "esutils": { + "version": "https://registry.cnpmjs.org/esutils/download/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "https://registry.cnpmjs.org/etag/download/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" + }, + "event-target-shim": { + "version": "https://registry.cnpmjs.org/event-target-shim/download/event-target-shim-1.1.1.tgz", + "integrity": "sha1-qG5e5r2qFgVEddp5fM3fDFVphJE=" + }, + "exec-sh": { + "version": "https://registry.cnpmjs.org/exec-sh/download/exec-sh-0.2.0.tgz", + "integrity": "sha1-FPdd4/INKG75MwmbLOUKkDWc7xA=" + }, + "exit-hook": { + "version": "https://registry.cnpmjs.org/exit-hook/download/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" + }, + "expand-brackets": { + "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=" + }, + "expand-range": { + "version": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=" + }, + "express-session": { + "version": "https://registry.cnpmjs.org/express-session/download/express-session-1.11.3.tgz", + "integrity": "sha1-XMmPP1/4Ttg1+Ry/CqvQxxB0AK8=", + "dependencies": { + "debug": { + "version": "https://r.cnpmjs.org/debug/download/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=" + }, + "ms": { + "version": "https://r.cnpmjs.org/ms/download/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "uid-safe": { + "version": "https://registry.cnpmjs.org/uid-safe/download/uid-safe-2.0.0.tgz", + "integrity": "sha1-p/PGymSh9qXQTsDvPkw9U2cxcTc=" + } + } + }, + "extend": { + "version": "https://r.cnpmjs.org/extend/download/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extglob": { + "version": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=" + }, + "extsprintf": { + "version": "https://registry.cnpmjs.org/extsprintf/download/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" + }, + "fancy-log": { + "version": "https://r.cnpmjs.org/fancy-log/download/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=" + }, + "fast-levenshtein": { + "version": "https://r.cnpmjs.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "https://r.cnpmjs.org/fb-watchman/download/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dependencies": { + "bser": { + "version": "https://r.cnpmjs.org/bser/download/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=" + } + } + }, + "fbjs": { + "version": "https://r.cnpmjs.org/fbjs/download/fbjs-0.8.12.tgz", + "integrity": "sha1-ELXZL3bUVXX9Y6IX1OoCvqL47QQ=", + "dependencies": { + "core-js": { + "version": "https://registry.cnpmjs.org/core-js/download/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, + "fbjs-scripts": { + "version": "https://registry.cnpmjs.org/fbjs-scripts/download/fbjs-scripts-0.7.1.tgz", + "integrity": "sha1-TxFeIY4kPjrdvw7dqsHjxi9wP6w=", + "dependencies": { + "babel-preset-fbjs": { + "version": "https://registry.cnpmjs.org/babel-preset-fbjs/download/babel-preset-fbjs-1.0.0.tgz", + "integrity": "sha1-yXLlybMB1OyeeXH0rsPhSsAXqLA=" + }, + "core-js": { + "version": "https://registry.cnpmjs.org/core-js/download/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, + "figures": { + "version": "https://registry.cnpmjs.org/figures/download/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=" + }, + "filename-regex": { + "version": "https://r.cnpmjs.org/filename-regex/download/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fileset": { + "version": "https://r.cnpmjs.org/fileset/download/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true + }, + "fill-range": { + "version": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=" + }, + "finalhandler": { + "version": "https://r.cnpmjs.org/finalhandler/download/finalhandler-0.4.0.tgz", + "integrity": "sha1-llpS2ejQXSuFdUhUH7ibU6JJfZs=", + "dependencies": { + "debug": { + "version": "https://r.cnpmjs.org/debug/download/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=" + }, + "escape-html": { + "version": "https://r.cnpmjs.org/escape-html/download/escape-html-1.0.2.tgz", + "integrity": "sha1-130y+pjjjC9BroXpJ44ODmuhAiw=" + }, + "ms": { + "version": "https://r.cnpmjs.org/ms/download/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "find-up": { + "version": "https://registry.cnpmjs.org/find-up/download/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=" + }, + "for-in": { + "version": "https://r.cnpmjs.org/for-in/download/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "https://r.cnpmjs.org/for-own/download/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=" + }, + "forever-agent": { + "version": "https://registry.cnpmjs.org/forever-agent/download/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "https://r.cnpmjs.org/form-data/download/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dependencies": { + "mime-types": { + "version": "https://r.cnpmjs.org/mime-types/download/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=" + } + } + }, + "fresh": { + "version": "https://r.cnpmjs.org/fresh/download/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" + }, + "fs-extra": { + "version": "https://r.cnpmjs.org/fs-extra/download/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=" + }, + "fs.realpath": { + "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "gauge": { + "version": "https://registry.cnpmjs.org/gauge/download/gauge-1.2.7.tgz", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=" + }, + "get-caller-file": { + "version": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + }, + "getpass": { + "version": "https://r.cnpmjs.org/getpass/download/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": { + "version": "https://registry.cnpmjs.org/assert-plus/download/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "glob": { + "version": "https://registry.cnpmjs.org/glob/download/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=" + }, + "glob-base": { + "version": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=" + }, + "glob-parent": { + "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=" + }, + "global": { + "version": "https://r.cnpmjs.org/global/download/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=" + }, + "globals": { + "version": "https://r.cnpmjs.org/globals/download/globals-9.17.0.tgz", + "integrity": "sha1-DAymltm5u2lNLlRwvTd3fKrVAoY=" + }, + "glogg": { + "version": "https://registry.cnpmjs.org/glogg/download/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=" + }, + "graceful-fs": { + "version": "https://r.cnpmjs.org/graceful-fs/download/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graceful-readlink": { + "version": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "growly": { + "version": "https://registry.cnpmjs.org/growly/download/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "gulp-util": { + "version": "https://r.cnpmjs.org/gulp-util/download/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dependencies": { + "object-assign": { + "version": "https://registry.cnpmjs.org/object-assign/download/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + } + } + }, + "gulplog": { + "version": "https://registry.cnpmjs.org/gulplog/download/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=" + }, + "handlebars": { + "version": "https://r.cnpmjs.org/handlebars/download/handlebars-4.0.7.tgz", + "integrity": "sha1-6XMlrrjqC54SucTdc8TDEq0O3lk=", + "dev": true, + "dependencies": { + "async": { + "version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "source-map": { + "version": "https://registry.cnpmjs.org/source-map/download/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true + } + } + }, + "har-schema": { + "version": "https://r.cnpmjs.org/har-schema/download/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" + }, + "har-validator": { + "version": "https://r.cnpmjs.org/har-validator/download/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=" + }, + "has-ansi": { + "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=" + }, + "has-flag": { + "version": "https://registry.cnpmjs.org/has-flag/download/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-gulplog": { + "version": "https://registry.cnpmjs.org/has-gulplog/download/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=" + }, + "has-unicode": { + "version": "https://registry.cnpmjs.org/has-unicode/download/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "hawk": { + "version": "https://registry.cnpmjs.org/hawk/download/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=" + }, + "hoek": { + "version": "https://registry.cnpmjs.org/hoek/download/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "home-or-tmp": { + "version": "https://registry.cnpmjs.org/home-or-tmp/download/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=" + }, + "hosted-git-info": { + "version": "https://r.cnpmjs.org/hosted-git-info/download/hosted-git-info-2.4.2.tgz", + "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=" + }, + "html-encoding-sniffer": { + "version": "https://registry.cnpmjs.org/html-encoding-sniffer/download/html-encoding-sniffer-1.0.1.tgz", + "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=", + "dev": true + }, + "http-errors": { + "version": "https://registry.cnpmjs.org/http-errors/download/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=" + }, + "http-signature": { + "version": "https://registry.cnpmjs.org/http-signature/download/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=" + }, + "iconv-lite": { + "version": "https://r.cnpmjs.org/iconv-lite/download/iconv-lite-0.4.11.tgz", + "integrity": "sha1-LstC/SlHRJIiCaLnxATayHk9it4=" + }, + "image-size": { + "version": "https://registry.cnpmjs.org/image-size/download/image-size-0.3.5.tgz", + "integrity": "sha1-gyQOqy+1sAsEqrjHSwRx6cunrYw=" + }, + "immutable": { + "version": "https://registry.cnpmjs.org/immutable/download/immutable-3.7.6.tgz", + "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=" + }, + "imurmurhash": { + "version": "https://registry.cnpmjs.org/imurmurhash/download/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inflight": { + "version": "https://registry.cnpmjs.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" + }, + "inherits": { + "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "https://registry.cnpmjs.org/inquirer/download/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=" + }, + "invariant": { + "version": "https://r.cnpmjs.org/invariant/download/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=" + }, + "invert-kv": { + "version": "https://registry.cnpmjs.org/invert-kv/download/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-arrayish": { + "version": "https://registry.cnpmjs.org/is-arrayish/download/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-buffer": { + "version": "https://r.cnpmjs.org/is-buffer/download/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" + }, + "is-builtin-module": { + "version": "https://registry.cnpmjs.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=" + }, + "is-ci": { + "version": "https://registry.cnpmjs.org/is-ci/download/is-ci-1.0.10.tgz", + "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", + "dev": true + }, + "is-dotfile": { + "version": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", + "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=" + }, + "is-equal-shallow": { + "version": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=" + }, + "is-extendable": { + "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-finite": { + "version": "https://registry.cnpmjs.org/is-finite/download/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=" + }, + "is-fullwidth-code-point": { + "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" + }, + "is-glob": { + "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=" + }, + "is-number": { + "version": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=" + }, + "is-posix-bracket": { + "version": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-stream": { + "version": "https://registry.cnpmjs.org/is-stream/download/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "https://registry.cnpmjs.org/is-typedarray/download/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "https://registry.cnpmjs.org/is-utf8/download/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "isarray": { + "version": "https://r.cnpmjs.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isemail": { + "version": "https://registry.cnpmjs.org/isemail/download/isemail-1.2.0.tgz", + "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" + }, + "isexe": { + "version": "https://r.cnpmjs.org/isexe/download/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=" + }, + "isomorphic-fetch": { + "version": "https://registry.cnpmjs.org/isomorphic-fetch/download/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=" + }, + "isstream": { + "version": "https://registry.cnpmjs.org/isstream/download/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-api": { + "version": "https://r.cnpmjs.org/istanbul-api/download/istanbul-api-1.1.8.tgz", + "integrity": "sha1-qETlXG+a7uKS5/QpQhlvYLI9yT4=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "https://r.cnpmjs.org/istanbul-lib-coverage/download/istanbul-lib-coverage-1.1.0.tgz", + "integrity": "sha1-ysoZ3srvNSW11jMdcB8/O3rUhSg=", + "dev": true + }, + "istanbul-lib-hook": { + "version": "https://r.cnpmjs.org/istanbul-lib-hook/download/istanbul-lib-hook-1.0.6.tgz", + "integrity": "sha1-wIZtHoHPLVMZJJUQEx/Bbe5JIx8=", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "https://r.cnpmjs.org/istanbul-lib-instrument/download/istanbul-lib-instrument-1.7.1.tgz", + "integrity": "sha1-Fp4xvGLHeIUamUOd2Zw8wSGE02A=", + "dev": true + }, + "istanbul-lib-report": { + "version": "https://r.cnpmjs.org/istanbul-lib-report/download/istanbul-lib-report-1.1.0.tgz", + "integrity": "sha1-RExOzKmvqTz1hPVrEPGVv3aMB3A=", + "dev": true, + "dependencies": { + "supports-color": { + "version": "https://r.cnpmjs.org/supports-color/download/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true + } + } + }, + "istanbul-lib-source-maps": { + "version": "https://r.cnpmjs.org/istanbul-lib-source-maps/download/istanbul-lib-source-maps-1.2.0.tgz", + "integrity": "sha1-jHcG1Jfib+62rz4MKP1bBmlZjQ4=", + "dev": true + }, + "istanbul-reports": { + "version": "https://r.cnpmjs.org/istanbul-reports/download/istanbul-reports-1.1.0.tgz", + "integrity": "sha1-HvO3lYiSGc+1+tFjZfbOEI1fjGY=", + "dev": true + }, + "jest": { + "version": "https://r.cnpmjs.org/jest/download/jest-19.0.2.tgz", + "integrity": "sha1-t5T6r4/0Yec4jyi+71WaVPILLBA=", + "dev": true, + "dependencies": { + "jest-cli": { + "version": "https://r.cnpmjs.org/jest-cli/download/jest-cli-19.0.2.tgz", + "integrity": "sha1-zDYgtirKxfLZOlSMtu9pfU7IVEM=", + "dev": true + } + } + }, + "jest-changed-files": { + "version": "https://r.cnpmjs.org/jest-changed-files/download/jest-changed-files-19.0.2.tgz", + "integrity": "sha1-FsVMhMMnC+QI4G0uivPz43qIWCQ=", + "dev": true + }, + "jest-config": { + "version": "https://r.cnpmjs.org/jest-config/download/jest-config-19.0.4.tgz", + "integrity": "sha1-QpgCEdRkF+kcp6v/0IbCcCNPc/0=", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "https://r.cnpmjs.org/ansi-styles/download/ansi-styles-3.0.0.tgz", + "integrity": "sha1-VATpOlRMT+x/BIJil3vr/jFV4ME=", + "dev": true + }, + "pretty-format": { + "version": "https://r.cnpmjs.org/pretty-format/download/pretty-format-19.0.0.tgz", + "integrity": "sha1-VlMNMqy5ij+khRxOK503tCBoTIQ=", + "dev": true + } + } + }, + "jest-diff": { + "version": "https://r.cnpmjs.org/jest-diff/download/jest-diff-19.0.0.tgz", + "integrity": "sha1-0VY8/FbItgIymI+8BdTRbtkPBjw=", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "https://r.cnpmjs.org/ansi-styles/download/ansi-styles-3.0.0.tgz", + "integrity": "sha1-VATpOlRMT+x/BIJil3vr/jFV4ME=", + "dev": true + }, + "pretty-format": { + "version": "https://r.cnpmjs.org/pretty-format/download/pretty-format-19.0.0.tgz", + "integrity": "sha1-VlMNMqy5ij+khRxOK503tCBoTIQ=", + "dev": true + } + } + }, + "jest-environment-jsdom": { + "version": "https://r.cnpmjs.org/jest-environment-jsdom/download/jest-environment-jsdom-19.0.2.tgz", + "integrity": "sha1-ztqFnEpLlKs15N59q1S5JvKT5KM=", + "dev": true + }, + "jest-environment-node": { + "version": "https://r.cnpmjs.org/jest-environment-node/download/jest-environment-node-19.0.2.tgz", + "integrity": "sha1-boQHnbh+0h0MBeH5Zp8gexFv6Zs=", + "dev": true + }, + "jest-file-exists": { + "version": "https://r.cnpmjs.org/jest-file-exists/download/jest-file-exists-19.0.0.tgz", + "integrity": "sha1-zKLlh6EeyS4kz+qz+KlNZX8/zrg=", + "dev": true + }, + "jest-haste-map": { + "version": "https://r.cnpmjs.org/jest-haste-map/download/jest-haste-map-19.0.0.tgz", + "integrity": "sha1-rd4Atisf4EQyoQSzJU/FAEUUtV4=", + "dependencies": { + "bser": { + "version": "https://r.cnpmjs.org/bser/download/bser-1.0.2.tgz", + "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=" + }, + "sane": { + "version": "https://r.cnpmjs.org/sane/download/sane-1.5.0.tgz", + "integrity": "sha1-pK3q52TQSGIeyyfV+ez1ExAZOfM=", + "dependencies": { + "fb-watchman": { + "version": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", + "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=" + } + } + } + } + }, + "jest-jasmine2": { + "version": "https://r.cnpmjs.org/jest-jasmine2/download/jest-jasmine2-19.0.2.tgz", + "integrity": "sha1-FnmRrIJZgfsagArxJug6/MqDLHM=", + "dev": true + }, + "jest-matcher-utils": { + "version": "https://r.cnpmjs.org/jest-matcher-utils/download/jest-matcher-utils-19.0.0.tgz", + "integrity": "sha1-Xs2bY1ZdKwAfYfv37Ex/U3lkVk0=", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "https://r.cnpmjs.org/ansi-styles/download/ansi-styles-3.0.0.tgz", + "integrity": "sha1-VATpOlRMT+x/BIJil3vr/jFV4ME=", + "dev": true + }, + "pretty-format": { + "version": "https://r.cnpmjs.org/pretty-format/download/pretty-format-19.0.0.tgz", + "integrity": "sha1-VlMNMqy5ij+khRxOK503tCBoTIQ=", + "dev": true + } + } + }, + "jest-matchers": { + "version": "https://r.cnpmjs.org/jest-matchers/download/jest-matchers-19.0.0.tgz", + "integrity": "sha1-x07Mbr/sBvOEdnuk1vpKQtZ1V1Q=", + "dev": true + }, + "jest-message-util": { + "version": "https://r.cnpmjs.org/jest-message-util/download/jest-message-util-19.0.0.tgz", + "integrity": "sha1-cheWuJwOTXYWBvm6jLgoo7YkZBY=", + "dev": true + }, + "jest-mock": { + "version": "https://r.cnpmjs.org/jest-mock/download/jest-mock-19.0.0.tgz", + "integrity": "sha1-ZwOGQelgerLOCOxKjLg6q7yJnQE=", + "dev": true + }, + "jest-regex-util": { + "version": "https://r.cnpmjs.org/jest-regex-util/download/jest-regex-util-19.0.0.tgz", + "integrity": "sha1-t3VFhxEq7eFFZRC7H2r+dO9ZhpE=", + "dev": true + }, + "jest-resolve": { + "version": "https://r.cnpmjs.org/jest-resolve/download/jest-resolve-19.0.2.tgz", + "integrity": "sha1-V5NXXeTweuwy99f/DGwYGWPu+zw=", + "dev": true + }, + "jest-resolve-dependencies": { + "version": "https://r.cnpmjs.org/jest-resolve-dependencies/download/jest-resolve-dependencies-19.0.0.tgz", + "integrity": "sha1-p0GtH6CUFA5k7PJkKlBPg07OIu4=", + "dev": true + }, + "jest-runtime": { + "version": "https://r.cnpmjs.org/jest-runtime/download/jest-runtime-19.0.3.tgz", + "integrity": "sha1-oWM1Ss5GkQ7jPwKCtr/2sLh9QzA=", + "dev": true, + "dependencies": { + "strip-bom": { + "version": "https://r.cnpmjs.org/strip-bom/download/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "jest-snapshot": { + "version": "https://r.cnpmjs.org/jest-snapshot/download/jest-snapshot-19.0.2.tgz", + "integrity": "sha1-nBshYhT3GHw4v9XHCx76sWsP9Qs=", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "https://r.cnpmjs.org/ansi-styles/download/ansi-styles-3.0.0.tgz", + "integrity": "sha1-VATpOlRMT+x/BIJil3vr/jFV4ME=", + "dev": true + }, + "pretty-format": { + "version": "https://r.cnpmjs.org/pretty-format/download/pretty-format-19.0.0.tgz", + "integrity": "sha1-VlMNMqy5ij+khRxOK503tCBoTIQ=", + "dev": true + } + } + }, + "jest-util": { + "version": "https://r.cnpmjs.org/jest-util/download/jest-util-19.0.2.tgz", + "integrity": "sha1-4KAjKiq55rK1Nmi9s1NMK1l37UE=", + "dev": true + }, + "jest-validate": { + "version": "https://r.cnpmjs.org/jest-validate/download/jest-validate-19.0.2.tgz", + "integrity": "sha1-3FNN9fEnjVtj3zKxQkHU2/ckTAw=", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "https://r.cnpmjs.org/ansi-styles/download/ansi-styles-3.0.0.tgz", + "integrity": "sha1-VATpOlRMT+x/BIJil3vr/jFV4ME=", + "dev": true + }, + "pretty-format": { + "version": "https://r.cnpmjs.org/pretty-format/download/pretty-format-19.0.0.tgz", + "integrity": "sha1-VlMNMqy5ij+khRxOK503tCBoTIQ=", + "dev": true + } + } + }, + "jodid25519": { + "version": "https://registry.cnpmjs.org/jodid25519/download/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "optional": true + }, + "joi": { + "version": "https://registry.cnpmjs.org/joi/download/joi-6.10.1.tgz", + "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=" + }, + "js-tokens": { + "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", + "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=" + }, + "js-yaml": { + "version": "https://r.cnpmjs.org/js-yaml/download/js-yaml-3.8.3.tgz", + "integrity": "sha1-M6BexIHIUMiHWSkWb+G+thxyh2Y=", + "dev": true + }, + "jsbn": { + "version": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jsdom": { + "version": "https://r.cnpmjs.org/jsdom/download/jsdom-9.12.0.tgz", + "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", + "dev": true, + "dependencies": { + "sax": { + "version": "https://registry.npmjs.org/sax/-/sax-1.2.2.tgz", + "integrity": "sha1-/YYxojvHgmvvXYcb24c3jJVkeCg=", + "dev": true + } + } + }, + "jsesc": { + "version": "https://registry.cnpmjs.org/jsesc/download/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, + "json-schema": { + "version": "https://registry.cnpmjs.org/json-schema/download/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-stable-stringify": { + "version": "https://registry.cnpmjs.org/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=" + }, + "json-stringify-safe": { + "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "https://registry.cnpmjs.org/json5/download/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=" + }, + "jsonfile": { + "version": "https://registry.cnpmjs.org/jsonfile/download/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=" + }, + "jsonify": { + "version": "https://registry.cnpmjs.org/jsonify/download/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsprim": { + "version": "https://r.cnpmjs.org/jsprim/download/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dependencies": { + "assert-plus": { + "version": "https://registry.cnpmjs.org/assert-plus/download/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "kind-of": { + "version": "https://r.cnpmjs.org/kind-of/download/kind-of-3.2.0.tgz", + "integrity": "sha1-tYq+TVwEStM3JqjBUltIz4kb/wc=" + }, + "klaw": { + "version": "https://registry.cnpmjs.org/klaw/download/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=" + }, + "lazy-cache": { + "version": "https://registry.cnpmjs.org/lazy-cache/download/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "https://registry.cnpmjs.org/lcid/download/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=" + }, + "left-pad": { + "version": "https://r.cnpmjs.org/left-pad/download/left-pad-1.1.3.tgz", + "integrity": "sha1-YS9hwDPzqeCOk58crr7qQbbzGZo=" + }, + "leven": { + "version": "https://r.cnpmjs.org/leven/download/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "https://registry.cnpmjs.org/levn/download/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true + }, + "load-json-file": { + "version": "https://registry.cnpmjs.org/load-json-file/download/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=" + }, + "locate-path": { + "version": "https://r.cnpmjs.org/locate-path/download/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "path-exists": { + "version": "https://r.cnpmjs.org/path-exists/download/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "https://r.cnpmjs.org/lodash/download/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash._basecopy": { + "version": "https://registry.cnpmjs.org/lodash._basecopy/download/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + }, + "lodash._basetostring": { + "version": "https://registry.cnpmjs.org/lodash._basetostring/download/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" + }, + "lodash._basevalues": { + "version": "https://registry.cnpmjs.org/lodash._basevalues/download/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" + }, + "lodash._getnative": { + "version": "https://registry.cnpmjs.org/lodash._getnative/download/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._isiterateecall": { + "version": "https://registry.cnpmjs.org/lodash._isiterateecall/download/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "lodash._reescape": { + "version": "https://registry.cnpmjs.org/lodash._reescape/download/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" + }, + "lodash._reevaluate": { + "version": "https://registry.cnpmjs.org/lodash._reevaluate/download/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" + }, + "lodash._reinterpolate": { + "version": "https://registry.cnpmjs.org/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash._root": { + "version": "https://registry.cnpmjs.org/lodash._root/download/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" + }, + "lodash.escape": { + "version": "https://registry.cnpmjs.org/lodash.escape/download/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=" + }, + "lodash.isarguments": { + "version": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "https://registry.cnpmjs.org/lodash.isarray/download/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.keys": { + "version": "https://registry.cnpmjs.org/lodash.keys/download/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=" + }, + "lodash.pad": { + "version": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=" + }, + "lodash.padend": { + "version": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" + }, + "lodash.padstart": { + "version": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" + }, + "lodash.restparam": { + "version": "https://registry.cnpmjs.org/lodash.restparam/download/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + }, + "lodash.template": { + "version": "https://registry.cnpmjs.org/lodash.template/download/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=" + }, + "lodash.templatesettings": { + "version": "https://registry.cnpmjs.org/lodash.templatesettings/download/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=" + }, + "longest": { + "version": "https://registry.cnpmjs.org/longest/download/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "https://r.cnpmjs.org/loose-envify/download/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=" + }, + "lru-cache": { + "version": "https://r.cnpmjs.org/lru-cache/download/lru-cache-4.0.2.tgz", + "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=" + }, + "makeerror": { + "version": "https://registry.cnpmjs.org/makeerror/download/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=" + }, + "media-typer": { + "version": "https://registry.cnpmjs.org/media-typer/download/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge": { + "version": "https://registry.cnpmjs.org/merge/download/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" + }, + "method-override": { + "version": "https://r.cnpmjs.org/method-override/download/method-override-2.3.8.tgz", + "integrity": "sha1-F4I0v0urhp+J35REsG/GFHtEgow=", + "dependencies": { + "debug": { + "version": "https://r.cnpmjs.org/debug/download/debug-2.6.3.tgz", + "integrity": "sha1-D364wwll7AjHKsz6ATDIt5mEFB0=" + }, + "ms": { + "version": "https://r.cnpmjs.org/ms/download/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + }, + "vary": { + "version": "https://r.cnpmjs.org/vary/download/vary-1.1.1.tgz", + "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" + } + } + }, + "methods": { + "version": "https://registry.cnpmjs.org/methods/download/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=" + }, + "mime": { + "version": "https://registry.cnpmjs.org/mime/download/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "mime-db": { + "version": "https://r.cnpmjs.org/mime-db/download/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" + }, + "mime-types": { + "version": "https://r.cnpmjs.org/mime-types/download/mime-types-2.1.11.tgz", + "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", + "dependencies": { + "mime-db": { + "version": "https://registry.cnpmjs.org/mime-db/download/mime-db-1.23.0.tgz", + "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=" + } + } + }, + "min-document": { + "version": "https://registry.cnpmjs.org/min-document/download/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=" + }, + "minimatch": { + "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=" + }, + "minimist": { + "version": "https://registry.cnpmjs.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dependencies": { + "minimist": { + "version": "https://r.cnpmjs.org/minimist/download/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "moment": { + "version": "https://r.cnpmjs.org/moment/download/moment-2.18.1.tgz", + "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=" + }, + "morgan": { + "version": "https://registry.cnpmjs.org/morgan/download/morgan-1.6.1.tgz", + "integrity": "sha1-X9gYOYxoGcuiinzWZk8pL+HAu/I=", + "dependencies": { + "debug": { + "version": "https://r.cnpmjs.org/debug/download/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=" + }, + "ms": { + "version": "https://r.cnpmjs.org/ms/download/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "ms": { + "version": "https://r.cnpmjs.org/ms/download/ms-0.7.3.tgz", + "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=" + }, + "multiparty": { + "version": "https://registry.cnpmjs.org/multiparty/download/multiparty-3.3.2.tgz", + "integrity": "sha1-Nd5oBNwZZD5SSfPT473GyM4wHT8=", + "dependencies": { + "isarray": { + "version": "https://r.cnpmjs.org/isarray/download/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "https://registry.cnpmjs.org/readable-stream/download/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=" + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "multipipe": { + "version": "https://registry.cnpmjs.org/multipipe/download/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=" + }, + "mute-stream": { + "version": "https://registry.cnpmjs.org/mute-stream/download/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" + }, + "natural-compare": { + "version": "https://registry.cnpmjs.org/natural-compare/download/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "https://r.cnpmjs.org/negotiator/download/negotiator-0.5.3.tgz", + "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=" + }, + "node-fetch": { + "version": "https://registry.cnpmjs.org/node-fetch/download/node-fetch-1.6.3.tgz", + "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=" + }, + "node-int64": { + "version": "https://registry.cnpmjs.org/node-int64/download/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-notifier": { + "version": "https://r.cnpmjs.org/node-notifier/download/node-notifier-5.1.2.tgz", + "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=", + "dev": true + }, + "normalize-package-data": { + "version": "https://r.cnpmjs.org/normalize-package-data/download/normalize-package-data-2.3.8.tgz", + "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=" + }, + "normalize-path": { + "version": "https://r.cnpmjs.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=" + }, + "npmlog": { + "version": "https://registry.cnpmjs.org/npmlog/download/npmlog-2.0.4.tgz", + "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=" + }, + "number-is-nan": { + "version": "https://registry.cnpmjs.org/number-is-nan/download/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nwmatcher": { + "version": "https://r.cnpmjs.org/nwmatcher/download/nwmatcher-1.3.9.tgz", + "integrity": "sha1-i6tIb/f6Pf0IZla76LFxFtNpLSo=", + "dev": true + }, + "oauth-sign": { + "version": "https://registry.cnpmjs.org/oauth-sign/download/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "https://r.cnpmjs.org/object-assign/download/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object.omit": { + "version": "https://registry.cnpmjs.org/object.omit/download/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=" + }, + "on-finished": { + "version": "https://registry.cnpmjs.org/on-finished/download/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=" + }, + "on-headers": { + "version": "https://registry.cnpmjs.org/on-headers/download/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "once": { + "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" + }, + "onetime": { + "version": "https://registry.cnpmjs.org/onetime/download/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" + }, + "opn": { + "version": "https://registry.cnpmjs.org/opn/download/opn-3.0.3.tgz", + "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=" + }, + "optimist": { + "version": "https://registry.cnpmjs.org/optimist/download/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dependencies": { + "minimist": { + "version": "https://registry.cnpmjs.org/minimist/download/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "wordwrap": { + "version": "https://registry.cnpmjs.org/wordwrap/download/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + }, + "optionator": { + "version": "https://registry.cnpmjs.org/optionator/download/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true + }, + "options": { + "version": "https://registry.cnpmjs.org/options/download/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" + }, + "os-homedir": { + "version": "https://registry.cnpmjs.org/os-homedir/download/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "https://registry.cnpmjs.org/os-locale/download/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=" + }, + "os-tmpdir": { + "version": "https://registry.cnpmjs.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "p-limit": { + "version": "https://r.cnpmjs.org/p-limit/download/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "https://r.cnpmjs.org/p-locate/download/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true + }, + "parse-glob": { + "version": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=" + }, + "parse-json": { + "version": "https://registry.cnpmjs.org/parse-json/download/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" + }, + "parse5": { + "version": "https://registry.cnpmjs.org/parse5/download/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "dev": true + }, + "parseurl": { + "version": "https://registry.cnpmjs.org/parseurl/download/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "path-exists": { + "version": "https://registry.cnpmjs.org/path-exists/download/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=" + }, + "path-is-absolute": { + "version": "https://registry.cnpmjs.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "https://registry.cnpmjs.org/path-parse/download/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-type": { + "version": "https://registry.cnpmjs.org/path-type/download/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=" + }, + "pause": { + "version": "https://registry.cnpmjs.org/pause/download/pause-0.1.0.tgz", + "integrity": "sha1-68ikqGGf8LioGsFRPDQ0/0af23Q=" + }, + "pegjs": { + "version": "https://r.cnpmjs.org/pegjs/download/pegjs-0.10.0.tgz", + "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=" + }, + "performance-now": { + "version": "https://r.cnpmjs.org/performance-now/download/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + }, + "pify": { + "version": "https://registry.cnpmjs.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "https://registry.cnpmjs.org/pinkie/download/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "https://registry.cnpmjs.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=" + }, + "plist": { + "version": "https://registry.cnpmjs.org/plist/download/plist-1.2.0.tgz", + "integrity": "sha1-CEtQk93JJQbiWfh0uNmxr7jHlZM=", + "dependencies": { + "base64-js": { + "version": "https://r.cnpmjs.org/base64-js/download/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" + } + } + }, + "prelude-ls": { + "version": "https://registry.cnpmjs.org/prelude-ls/download/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "pretty-format": { + "version": "https://r.cnpmjs.org/pretty-format/download/pretty-format-4.3.1.tgz", + "integrity": "sha1-UwvlxCs8BbNkFKeipDN6qArNDo0=" + }, + "private": { + "version": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=" + }, + "process": { + "version": "https://registry.cnpmjs.org/process/download/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + }, + "process-nextick-args": { + "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "promise": { + "version": "https://registry.cnpmjs.org/promise/download/promise-7.1.1.tgz", + "integrity": "sha1-SJZUxpJha4qlWwck+oCbt9tJxb8=" + }, + "prr": { + "version": "https://registry.cnpmjs.org/prr/download/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" + }, + "pseudomap": { + "version": "https://registry.cnpmjs.org/pseudomap/download/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "punycode": { + "version": "https://registry.cnpmjs.org/punycode/download/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "https://r.cnpmjs.org/qs/download/qs-4.0.0.tgz", + "integrity": "sha1-wx2bdOwn33XlQ6hseHKO2NRiNgc=" + }, + "random-bytes": { + "version": "https://registry.cnpmjs.org/random-bytes/download/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, + "randomatic": { + "version": "https://r.cnpmjs.org/randomatic/download/randomatic-1.1.6.tgz", + "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=" + }, + "range-parser": { + "version": "https://registry.cnpmjs.org/range-parser/download/range-parser-1.0.3.tgz", + "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=" + }, + "raw-body": { + "version": "https://registry.cnpmjs.org/raw-body/download/raw-body-2.1.7.tgz", + "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", + "dependencies": { + "bytes": { + "version": "https://r.cnpmjs.org/bytes/download/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" + }, + "iconv-lite": { + "version": "https://r.cnpmjs.org/iconv-lite/download/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=" + } + } + }, + "react": { + "version": "https://r.cnpmjs.org/react/download/react-16.0.0-alpha.6.tgz", + "integrity": "sha1-LMsa+0QlzMEveKEjpmby5MFBrbk=" + }, + "react-clone-referenced-element": { + "version": "https://registry.cnpmjs.org/react-clone-referenced-element/download/react-clone-referenced-element-1.0.1.tgz", + "integrity": "sha1-K7qMaUBMXkqUQ5hgC8xMlB+GBoI=" + }, + "react-deep-force-update": { + "version": "https://registry.cnpmjs.org/react-deep-force-update/download/react-deep-force-update-1.0.1.tgz", + "integrity": "sha1-+RG1vh0qb+OHUH3W6adnqikktMc=" + }, + "react-devtools-core": { + "version": "https://r.cnpmjs.org/react-devtools-core/download/react-devtools-core-2.1.3.tgz", + "integrity": "sha1-1ciR1A2XP6TW+Vu/NR+dB5KuzEw=", + "dependencies": { + "ws": { + "version": "https://r.cnpmjs.org/ws/download/ws-2.3.1.tgz", + "integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=" + } + } + }, + "react-native": { + "version": "https://r.cnpmjs.org/react-native/download/react-native-0.44.0.tgz", + "integrity": "sha1-BkJ6MAU/LVVcYP4LmvzGx3jbCd4=" + }, + "react-native-xinge-push": { + "version": "file:.." + }, + "react-proxy": { + "version": "https://registry.cnpmjs.org/react-proxy/download/react-proxy-1.1.8.tgz", + "integrity": "sha1-nb/Z2SdSjDqp9ETkVYw3gwq4wmo=" + }, + "react-test-renderer": { + "version": "https://r.cnpmjs.org/react-test-renderer/download/react-test-renderer-16.0.0-alpha.6.tgz", + "integrity": "sha1-wDLe8NyDGc7jnKpOQ3OmABnLN4Y=", + "dev": true + }, + "react-timer-mixin": { + "version": "https://registry.cnpmjs.org/react-timer-mixin/download/react-timer-mixin-0.13.3.tgz", + "integrity": "sha1-Dai5+AfsB9w+hU0ILHN8ZWBbPSI=" + }, + "react-transform-hmr": { + "version": "https://registry.cnpmjs.org/react-transform-hmr/download/react-transform-hmr-1.0.4.tgz", + "integrity": "sha1-4aQL0Krvxy6N/Xp82gmvhQZjl7s=" + }, + "read-pkg": { + "version": "https://registry.cnpmjs.org/read-pkg/download/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=" + }, + "read-pkg-up": { + "version": "https://registry.cnpmjs.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=" + }, + "readable-stream": { + "version": "https://r.cnpmjs.org/readable-stream/download/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=" + }, + "readline2": { + "version": "https://registry.cnpmjs.org/readline2/download/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=" + }, + "rebound": { + "version": "https://registry.cnpmjs.org/rebound/download/rebound-0.0.13.tgz", + "integrity": "sha1-SiJSVMr32nVnl7GcWBe/enlB+sE=" + }, + "regenerate": { + "version": "https://r.cnpmjs.org/regenerate/download/regenerate-1.3.2.tgz", + "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=" + }, + "regenerator-runtime": { + "version": "https://r.cnpmjs.org/regenerator-runtime/download/regenerator-runtime-0.9.6.tgz", + "integrity": "sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck=" + }, + "regenerator-transform": { + "version": "https://r.cnpmjs.org/regenerator-transform/download/regenerator-transform-0.9.11.tgz", + "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=" + }, + "regex-cache": { + "version": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=" + }, + "regexpu-core": { + "version": "https://registry.cnpmjs.org/regexpu-core/download/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=" + }, + "regjsgen": { + "version": "https://registry.cnpmjs.org/regjsgen/download/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "https://registry.cnpmjs.org/regjsparser/download/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dependencies": { + "jsesc": { + "version": "https://registry.cnpmjs.org/jsesc/download/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "remove-trailing-separator": { + "version": "https://r.cnpmjs.org/remove-trailing-separator/download/remove-trailing-separator-1.0.1.tgz", + "integrity": "sha1-YV67lq9VlVLUv0BXyENtSGq2PMQ=" + }, + "repeat-element": { + "version": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "https://registry.cnpmjs.org/repeat-string/download/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "https://registry.cnpmjs.org/repeating/download/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=" + }, + "replace-ext": { + "version": "https://registry.cnpmjs.org/replace-ext/download/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + }, + "request": { + "version": "https://r.cnpmjs.org/request/download/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dependencies": { + "qs": { + "version": "https://r.cnpmjs.org/qs/download/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + } + } + }, + "require-directory": { + "version": "https://registry.cnpmjs.org/require-directory/download/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "https://registry.cnpmjs.org/require-main-filename/download/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "https://r.cnpmjs.org/resolve/download/resolve-1.3.3.tgz", + "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", + "dev": true + }, + "response-time": { + "version": "https://r.cnpmjs.org/response-time/download/response-time-2.3.2.tgz", + "integrity": "sha1-/6cbq5UtYvfB1Jt0NDVfvGjf/Fo=", + "dependencies": { + "depd": { + "version": "https://registry.cnpmjs.org/depd/download/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" + } + } + }, + "restore-cursor": { + "version": "https://registry.cnpmjs.org/restore-cursor/download/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=" + }, + "right-align": { + "version": "https://registry.cnpmjs.org/right-align/download/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=" + }, + "rimraf": { + "version": "https://r.cnpmjs.org/rimraf/download/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=" + }, + "rndm": { + "version": "https://registry.cnpmjs.org/rndm/download/rndm-1.2.0.tgz", + "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" + }, + "run-async": { + "version": "https://registry.cnpmjs.org/run-async/download/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=" + }, + "rx-lite": { + "version": "https://registry.cnpmjs.org/rx-lite/download/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=" + }, + "safe-buffer": { + "version": "https://r.cnpmjs.org/safe-buffer/download/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" + }, + "sane": { + "version": "https://registry.npmjs.org/sane/-/sane-1.4.1.tgz", + "integrity": "sha1-iPdj10BA9fDCVrYWPbOZvxEKxxU=", + "dependencies": { + "bser": { + "version": "https://r.cnpmjs.org/bser/download/bser-1.0.2.tgz", + "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=" + }, + "fb-watchman": { + "version": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", + "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=" + } + } + }, + "sax": { + "version": "https://registry.cnpmjs.org/sax/download/sax-1.1.6.tgz", + "integrity": "sha1-XWFr6KXmB9VOEUr65Vt+ry/MMkA=" + }, + "semver": { + "version": "https://r.cnpmjs.org/semver/download/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + }, + "send": { + "version": "https://r.cnpmjs.org/send/download/send-0.13.2.tgz", + "integrity": "sha1-dl52B8gFVFK7pvCwUllTUJhgNt4=", + "dependencies": { + "debug": { + "version": "https://r.cnpmjs.org/debug/download/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=" + }, + "depd": { + "version": "https://registry.cnpmjs.org/depd/download/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" + }, + "ms": { + "version": "https://r.cnpmjs.org/ms/download/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "statuses": { + "version": "https://registry.cnpmjs.org/statuses/download/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=" + } + } + }, + "serve-favicon": { + "version": "https://r.cnpmjs.org/serve-favicon/download/serve-favicon-2.3.2.tgz", + "integrity": "sha1-3UGeJo3gEqtysxnTN/IQUBP5OB8=", + "dependencies": { + "ms": { + "version": "https://r.cnpmjs.org/ms/download/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + } + } + }, + "serve-index": { + "version": "https://registry.cnpmjs.org/serve-index/download/serve-index-1.7.3.tgz", + "integrity": "sha1-egV/xu4o3GP2RWbl+lexEahq7NI=", + "dependencies": { + "debug": { + "version": "https://r.cnpmjs.org/debug/download/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=" + }, + "ms": { + "version": "https://r.cnpmjs.org/ms/download/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "serve-static": { + "version": "https://registry.cnpmjs.org/serve-static/download/serve-static-1.10.3.tgz", + "integrity": "sha1-zlpuzTEB/tXsCYJ9rCKpwpv7BTU=" + }, + "set-blocking": { + "version": "https://registry.cnpmjs.org/set-blocking/download/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "setimmediate": { + "version": "https://r.cnpmjs.org/setimmediate/download/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "shell-quote": { + "version": "https://r.cnpmjs.org/shell-quote/download/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=" + }, + "shellwords": { + "version": "https://registry.cnpmjs.org/shellwords/download/shellwords-0.1.0.tgz", + "integrity": "sha1-Zq/Ue2oSky2Qccv9mKUueFzQuhQ=", + "dev": true + }, + "simple-plist": { + "version": "https://r.cnpmjs.org/simple-plist/download/simple-plist-0.2.1.tgz", + "integrity": "sha1-cXZts1IyaSjPOoByQrp2IyJjZyM=", + "dependencies": { + "base64-js": { + "version": "https://r.cnpmjs.org/base64-js/download/base64-js-1.1.2.tgz", + "integrity": "sha1-1kAMrBxMZgl22Q0HoENR2JOV9eg=" + }, + "plist": { + "version": "https://r.cnpmjs.org/plist/download/plist-2.0.1.tgz", + "integrity": "sha1-CjLKlIGxw2TpLhjcVch23p0B2os=" + }, + "xmlbuilder": { + "version": "https://r.cnpmjs.org/xmlbuilder/download/xmlbuilder-8.2.2.tgz", + "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=" + } + } + }, + "slash": { + "version": "https://registry.cnpmjs.org/slash/download/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slide": { + "version": "https://registry.cnpmjs.org/slide/download/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + }, + "sntp": { + "version": "https://registry.cnpmjs.org/sntp/download/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=" + }, + "source-map": { + "version": "https://registry.cnpmjs.org/source-map/download/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" + }, + "source-map-support": { + "version": "https://r.cnpmjs.org/source-map-support/download/source-map-support-0.4.15.tgz", + "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=" + }, + "sparkles": { + "version": "https://registry.cnpmjs.org/sparkles/download/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=" + }, + "spdx-correct": { + "version": "https://registry.cnpmjs.org/spdx-correct/download/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=" + }, + "spdx-expression-parse": { + "version": "https://registry.cnpmjs.org/spdx-expression-parse/download/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + }, + "spdx-license-ids": { + "version": "https://registry.cnpmjs.org/spdx-license-ids/download/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + }, + "sprintf-js": { + "version": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "https://r.cnpmjs.org/sshpk/download/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "dependencies": { + "assert-plus": { + "version": "https://registry.cnpmjs.org/assert-plus/download/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "stacktrace-parser": { + "version": "https://registry.cnpmjs.org/stacktrace-parser/download/stacktrace-parser-0.1.4.tgz", + "integrity": "sha1-ATl5IuX2Ls8whFUiyVxP4dJefU4=" + }, + "statuses": { + "version": "https://r.cnpmjs.org/statuses/download/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + }, + "stream-buffers": { + "version": "https://r.cnpmjs.org/stream-buffers/download/stream-buffers-2.2.0.tgz", + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=" + }, + "stream-counter": { + "version": "https://registry.cnpmjs.org/stream-counter/download/stream-counter-0.2.0.tgz", + "integrity": "sha1-3tJmVWMZyLDiIoErnPOyb6fZR94=", + "dependencies": { + "isarray": { + "version": "https://r.cnpmjs.org/isarray/download/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "https://registry.cnpmjs.org/readable-stream/download/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=" + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "string_decoder": { + "version": "https://r.cnpmjs.org/string_decoder/download/string_decoder-1.0.0.tgz", + "integrity": "sha1-8G9BFXtmTYYGn4S9vcmw2KsoFmc=" + }, + "string-length": { + "version": "https://registry.cnpmjs.org/string-length/download/string-length-1.0.1.tgz", + "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "dev": true + }, + "string-width": { + "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" + }, + "stringstream": { + "version": "https://registry.cnpmjs.org/stringstream/download/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "strip-ansi": { + "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" + }, + "strip-bom": { + "version": "https://registry.cnpmjs.org/strip-bom/download/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=" + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "symbol-tree": { + "version": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "temp": { + "version": "https://registry.cnpmjs.org/temp/download/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "dependencies": { + "rimraf": { + "version": "https://registry.cnpmjs.org/rimraf/download/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" + } + } + }, + "test-exclude": { + "version": "https://r.cnpmjs.org/test-exclude/download/test-exclude-4.1.0.tgz", + "integrity": "sha1-BMpwtzkN04yY1KADoXOAbKeZHJE=", + "dev": true + }, + "throat": { + "version": "https://registry.cnpmjs.org/throat/download/throat-3.0.0.tgz", + "integrity": "sha1-58ZMhny7OEXxCHdkL3tgBVuOwNY=" + }, + "through": { + "version": "https://registry.cnpmjs.org/through/download/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "https://r.cnpmjs.org/through2/download/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=" + }, + "time-stamp": { + "version": "https://registry.cnpmjs.org/time-stamp/download/time-stamp-1.0.1.tgz", + "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=" + }, + "tmpl": { + "version": "https://registry.cnpmjs.org/tmpl/download/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "to-fast-properties": { + "version": "https://r.cnpmjs.org/to-fast-properties/download/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "topo": { + "version": "https://registry.cnpmjs.org/topo/download/topo-1.1.0.tgz", + "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=" + }, + "tough-cookie": { + "version": "https://registry.cnpmjs.org/tough-cookie/download/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=" + }, + "tr46": { + "version": "https://registry.cnpmjs.org/tr46/download/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "trim-right": { + "version": "https://r.cnpmjs.org/trim-right/download/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tsscmp": { + "version": "https://registry.cnpmjs.org/tsscmp/download/tsscmp-1.0.5.tgz", + "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc=" + }, + "tunnel-agent": { + "version": "https://r.cnpmjs.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" + }, + "tweetnacl": { + "version": "https://r.cnpmjs.org/tweetnacl/download/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-check": { + "version": "https://registry.cnpmjs.org/type-check/download/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true + }, + "type-is": { + "version": "https://r.cnpmjs.org/type-is/download/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dependencies": { + "mime-types": { + "version": "https://r.cnpmjs.org/mime-types/download/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=" + } + } + }, + "typedarray": { + "version": "https://registry.cnpmjs.org/typedarray/download/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "ua-parser-js": { + "version": "https://r.cnpmjs.org/ua-parser-js/download/ua-parser-js-0.7.12.tgz", + "integrity": "sha1-BMgamb3V3FImPqKdJMa/jUgYpLs=" + }, + "uglify-js": { + "version": "https://r.cnpmjs.org/uglify-js/download/uglify-js-2.7.5.tgz", + "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", + "dependencies": { + "async": { + "version": "https://registry.cnpmjs.org/async/download/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + }, + "yargs": { + "version": "https://registry.cnpmjs.org/yargs/download/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=" + } + } + }, + "uglify-to-browserify": { + "version": "https://registry.cnpmjs.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" + }, + "uid-safe": { + "version": "https://r.cnpmjs.org/uid-safe/download/uid-safe-2.1.4.tgz", + "integrity": "sha1-Otbzg2jG1MjHXsF2I/t5qh0HHYE=" + }, + "ultron": { + "version": "https://r.cnpmjs.org/ultron/download/ultron-1.1.0.tgz", + "integrity": "sha1-sHoualQagV/Go0zNRTO67DB8qGQ=" + }, + "unpipe": { + "version": "https://registry.cnpmjs.org/unpipe/download/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "util-deprecate": { + "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "https://registry.cnpmjs.org/utils-merge/download/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "uuid": { + "version": "https://r.cnpmjs.org/uuid/download/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" + }, + "validate-npm-package-license": { + "version": "https://registry.cnpmjs.org/validate-npm-package-license/download/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=" + }, + "vary": { + "version": "https://registry.cnpmjs.org/vary/download/vary-1.0.1.tgz", + "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=" + }, + "verror": { + "version": "https://registry.cnpmjs.org/verror/download/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=" + }, + "vhost": { + "version": "https://registry.cnpmjs.org/vhost/download/vhost-3.0.2.tgz", + "integrity": "sha1-L7HezUxGaqiLD5NBrzPcGv8keNU=" + }, + "vinyl": { + "version": "https://registry.cnpmjs.org/vinyl/download/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=" + }, + "walker": { + "version": "https://registry.cnpmjs.org/walker/download/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=" + }, + "watch": { + "version": "https://registry.cnpmjs.org/watch/download/watch-0.10.0.tgz", + "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" + }, + "webidl-conversions": { + "version": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.1.tgz", + "integrity": "sha1-gBWherg+fhsxFjhIas6B2mziBqA=", + "dev": true + }, + "whatwg-encoding": { + "version": "https://registry.cnpmjs.org/whatwg-encoding/download/whatwg-encoding-1.0.1.tgz", + "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=", + "dev": true, + "dependencies": { + "iconv-lite": { + "version": "https://r.cnpmjs.org/iconv-lite/download/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", + "dev": true + } + } + }, + "whatwg-fetch": { + "version": "https://r.cnpmjs.org/whatwg-fetch/download/whatwg-fetch-1.1.1.tgz", + "integrity": "sha1-rDydOfMgxtzlM5lp0FTvQ90zMxk=" + }, + "whatwg-url": { + "version": "https://r.cnpmjs.org/whatwg-url/download/whatwg-url-4.7.1.tgz", + "integrity": "sha1-303C4/JaY7H6WzLtbWwTlXfWkN4=", + "dev": true, + "dependencies": { + "webidl-conversions": { + "version": "https://registry.cnpmjs.org/webidl-conversions/download/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + } + } + }, + "which": { + "version": "https://r.cnpmjs.org/which/download/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=" + }, + "which-module": { + "version": "https://registry.cnpmjs.org/which-module/download/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "window-size": { + "version": "https://r.cnpmjs.org/window-size/download/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "wordwrap": { + "version": "https://registry.cnpmjs.org/wordwrap/download/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "worker-farm": { + "version": "https://registry.cnpmjs.org/worker-farm/download/worker-farm-1.3.1.tgz", + "integrity": "sha1-QzMRK7SbF6oFC4eJXKayys9A5f8=" + }, + "wrap-ansi": { + "version": "https://r.cnpmjs.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=" + }, + "wrappy": { + "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "https://r.cnpmjs.org/write-file-atomic/download/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=" + }, + "ws": { + "version": "https://r.cnpmjs.org/ws/download/ws-1.1.4.tgz", + "integrity": "sha1-V/QNA2gy5fUFVmKjl8Tedu1mv2E=", + "dependencies": { + "ultron": { + "version": "https://registry.cnpmjs.org/ultron/download/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + } + } + }, + "xcode": { + "version": "https://r.cnpmjs.org/xcode/download/xcode-0.9.3.tgz", + "integrity": "sha1-kQqJwWrubMC0LKgFptC0z4chHPM=" + }, + "xml-name-validator": { + "version": "https://registry.cnpmjs.org/xml-name-validator/download/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "dev": true + }, + "xmlbuilder": { + "version": "https://registry.cnpmjs.org/xmlbuilder/download/xmlbuilder-4.0.0.tgz", + "integrity": "sha1-mLj2UcowqmJANvEn0RzGbce5B6M=", + "dependencies": { + "lodash": { + "version": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + } + } + }, + "xmldoc": { + "version": "https://registry.cnpmjs.org/xmldoc/download/xmldoc-0.4.0.tgz", + "integrity": "sha1-0lciS+g5PqrL+DfvIn/Y7CWzaIg=" + }, + "xmldom": { + "version": "https://r.cnpmjs.org/xmldom/download/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" + }, + "xpipe": { + "version": "https://r.cnpmjs.org/xpipe/download/xpipe-1.0.5.tgz", + "integrity": "sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98=" + }, + "xtend": { + "version": "https://registry.cnpmjs.org/xtend/download/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "https://registry.cnpmjs.org/y18n/download/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "https://r.cnpmjs.org/yallist/download/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "https://r.cnpmjs.org/yargs/download/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dependencies": { + "camelcase": { + "version": "https://registry.cnpmjs.org/camelcase/download/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "https://registry.cnpmjs.org/cliui/download/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=" + } + } + }, + "yargs-parser": { + "version": "https://r.cnpmjs.org/yargs-parser/download/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dependencies": { + "camelcase": { + "version": "https://registry.cnpmjs.org/camelcase/download/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + } + } +} diff --git a/example/package.json b/example/package.json new file mode 100644 index 0000000..09ba497 --- /dev/null +++ b/example/package.json @@ -0,0 +1,23 @@ +{ + "name": "example", + "version": "0.0.1", + "private": true, + "scripts": { + "start": "node node_modules/react-native/local-cli/cli.js start", + "test": "jest" + }, + "dependencies": { + "react": "16.0.0-alpha.6", + "react-native": "0.44.0", + "react-native-xinge-push": "file:.." + }, + "devDependencies": { + "babel-jest": "19.0.0", + "babel-preset-react-native": "1.9.1", + "jest": "19.0.2", + "react-test-renderer": "16.0.0-alpha.6" + }, + "jest": { + "preset": "react-native" + } +} diff --git a/index.js b/index.js new file mode 100644 index 0000000..8684831 --- /dev/null +++ b/index.js @@ -0,0 +1,163 @@ +/** + * 信鸽推送 + * Created by Jeepeng on 16/8/3. + */ + +import { + Platform, + NativeModules, + NativeEventEmitter, +} from 'react-native'; + +let { XGPushManager } = NativeModules; +let XGNativeEventEmitter = new NativeEventEmitter(XGPushManager); + +let _handlers = new Map(); + +const EventMapping = Platform.select({ + android: { + register: 'remoteNotificationsRegistered', + notification: 'remoteNotificationReceived', + localNotification: 'localNotificationReceived', + message: 'messageReceived' + }, + ios: { + register: 'remoteNotificationsRegistered', + notification: 'remoteNotificationReceived', + localNotification: 'localNotificationReceived', + }, +}); + +class XGPush { + + static init(accessId, accessKey) { + let accessIdNum = Number(accessId); + if (isNaN(accessIdNum)) { + console.error(`[XGPush init] accessId is not a number!`); + } else { + XGPushManager.startApp(accessIdNum, accessKey); + } + } + + static register(account) { + if (Platform.OS === 'ios') { + XGPushManager.setAccount(account); + return XGPushManager.requestPermissions({ + alert: true, + badge: true, + sound: true + }); + } else { + return XGPushManager.registerPush(account); + } + } + + /** + * ios only + * @param deviceToken + * @returns {*} + */ + static registerForXG(deviceToken) { + if (Platform.OS === 'ios') { + return XGPushManager.registerDevice(deviceToken, null); + } else { + return new Promise((resolve, reject) => { + //reject('ios only'); + }); + } + } + + static setTag(tagName) { + return XGPushManager.setTag(tagName); + } + + static deleteTag(tagName) { + if (Platform.OS === 'ios') { + return XGPushManager.delTag(tagName); + } else { + return XGPushManager.deleteTag(tagName); + } + } + + static unRegister() { + if (Platform.OS === 'ios') { + return XGPushManager.unRegisterDevice(); + } else { + return XGPushManager.unregisterPush(); + } + + } + + static setApplicationIconBadgeNumber(number) { + if (Platform.OS === 'ios') { + XGPushManager.setApplicationIconBadgeNumber(number); + } + } + + static getApplicationIconBadgeNumber(callback) { + if (Platform.OS === 'ios') { + XGPushManager.getApplicationIconBadgeNumber(callback); + } + } + + static checkPermissions(callback) { + if (Platform.OS === 'ios') { + return XGPushManager.checkPermissions(callback); + } + } + + static getInitialNotification() { + return XGPushManager.getInitialNotification(); + } + + static onLocalNotification(callback) { + this.addEventListener('localNotification', callback) + } + + /** + * 透传消息 Android only + */ + static onMessage(callback) { + if (Platform.OS === 'android') { + this.addEventListener('message', callback) + } + } + + static addEventListener(eventType, callback) { + let event = EventMapping[eventType]; + if (!event) { + console.warn('XGPush only supports `notification`, `register` and `localNotification` events'); + return; + } + let listener = XGNativeEventEmitter.addListener(event, (data) => { + let result = data; + if (eventType === 'register') { + result = data['deviceToken']; + } + callback(result); + }); + _handlers.set(callback, listener); + } + + static removeEventListener(eventType, callback) { + if (!EventMapping[eventType]) { + console.warn('XGPush only supports `notification`, `register` and `localNotification` events'); + return; + } + let listener = _handlers.get(callback); + if (listener) { + listener.remove(); + _handlers.delete(callback); + } + } + + static enableDebug(isDebug = true) { + XGPushManager.enableDebug(isDebug); + } + + static isEnableDebug() { + return XGPushManager.isEnableDebug(); + } +} + +export default XGPush; diff --git a/ios/SDK/XGPush.h b/ios/SDK/XGPush.h new file mode 100644 index 0000000..91738ee --- /dev/null +++ b/ios/SDK/XGPush.h @@ -0,0 +1,170 @@ +// +// XGPush.h +// XG-SDK +// +// Created by xiangchen on 13-10-18. +// Copyright (c) 2013年 mta. All rights reserved. +// + +#import +#import + +@interface XGPush : NSObject + +/** + 初始化信鸽 + + @param appId 通过前台申请的应用ID + @param appKey 通过前台申请的appKey + */ ++(void)startApp:(uint32_t)appId appKey:(nonnull NSString *)appKey; + +/** + 判断当前是否是已注销状态 + + @return 是否已经注销推送 + */ ++(BOOL)isUnRegisterStatus; + + +/** + 查询推送是否打开(以弹窗为准) + + @param result 查询回调.若推送打开,回调参数为 YES, 否则为 NO + */ ++(void)isPushOn:(nullable void(^)(BOOL isOn)) result; + +/** + 注册设备 + + @param deviceToken 通过app delegate的didRegisterForRemoteNotificationsWithDeviceToken回调的获取 + @param successCallback 成功回调 + @param errorCallback 失败回调 + @return 获取的 deviceToken 字符串 + */ ++(nullable NSString *)registerDevice:(nonnull NSData *)deviceToken successCallback:(nullable void (^)(void)) successCallback errorCallback:(nullable void (^)(void)) errorCallback; + +/** + 注册设备并且设置账号 + + @param deviceToken 通过app delegate的didRegisterForRemoteNotificationsWithDeviceToken回调的获取 + @param account 需要设置的账号,长度为2个字节以上,不要使用"test","123456"这种过于简单的字符串, + 若不想设置账号,请传入nil + @param successCallback 成功回调 + @param errorCallback 失败回调 + @return 获取的 deviceToken 字符串 + */ ++(nullable NSString *)registerDevice:(nonnull NSData *)deviceToken account:(nullable NSString *)account successCallback:(nullable void (^)(void)) successCallback errorCallback:(nullable void (^)(void)) errorCallback; + + +/** + 注册设备并且设置账号, 字符串 token 版本 + + @param deviceToken NSString *类型的 token + @param account 需要设置的账号,若不想设置账号,请传入 nil + @param successCallback 成功回调 + @param errorCallback 失败回调 + @return 获取的 deviceToken 字符串 + */ ++(nullable NSString *)registerDeviceStr:(nonnull NSString *)deviceToken account:(nullable NSString *) account successCallback:(nullable void(^)(void)) successCallback errorCallback:(nullable void(^)(void))errorCallback; + +/** + 注销设备,设备不再进行推送 + + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ ++(void)unRegisterDevice:(nullable void (^)(void)) successCallback errorCallback:(nullable void (^)(void)) errorCallback; + +/** + 设置设备的帐号. 设置账号前需要调用一次registerDevice + + @param account 需要设置的账号,长度为2个字节以上,不要使用"test","123456"这种过于简单的字符串, + 若不想设置账号,请传入nil + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ ++(void)setAccount:(nonnull NSString *)account successCallback:(nullable void(^)(void)) successCallback errorCallback:(nullable void(^)(void)) errorCallback; + + +/** + 删除已经设置的账号 + + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ ++(void)delAccount:(nullable void(^)(void)) successCallback errorCallback:(nullable void(^)(void)) errorCallback; + +/** + 设置 tag + + @param tag 需要设置的 tag + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ ++(void)setTag:(nonnull NSString *)tag successCallback:(nullable void (^)(void)) successCallback errorCallback:(nullable void (^)(void)) errorCallback; + + +/** + 删除tag + + @param tag 需要删除的 tag + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ ++(void)delTag:(nonnull NSString *)tag successCallback:(nullable void (^)(void)) successCallback errorCallback:(nullable void (^)(void)) errorCallback; + +/** + 在didFinishLaunchingWithOptions中调用,用于推送反馈.(app没有运行时,点击推送启动时) + + @param launchOptions didFinishLaunchingWithOptions中的userinfo参数 + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ ++(void)handleLaunching:(nonnull NSDictionary *)launchOptions successCallback:(nullable void (^)(void)) successCallback errorCallback:(nullable void (^)(void)) errorCallback; + +/** + 在didReceiveRemoteNotification中调用,用于推送反馈。(app在运行时) + + @param userInfo 苹果 apns 的推送信息 + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ ++(void)handleReceiveNotification:(nonnull NSDictionary *)userInfo successCallback:(nullable void (^)(void)) successCallback errorCallback:(nullable void (^)(void)) errorCallback; + + +/** + * 获取userInfo里的bid信息(bid:信鸽的推送消息id) + * @param userInfo 苹果apns的推送信息 + * @return none + */ ++(nullable NSString *)getBid:(nonnull NSDictionary *)userInfo; + +/** + * deviceToken类型转换 + * @param deviceToken NSData格式的deviceToken + * @return none + */ ++(nullable NSString *)getDeviceToken:(nonnull NSData *)deviceToken; + + +// 以下接口已经不在维护,请尽快替换 ++(void)localNotification:(nonnull NSDate *)fireDate alertBody:(nonnull NSString *)alertBody badge:(int)badge alertAction:(nonnull NSString *)alertAction userInfo:(nonnull NSDictionary *)userInfo DEPRECATED_MSG_ATTRIBUTE("此方法已经废弃,请使用苹果提供的 API 删除本地推送"); ++(void)localNotificationAtFrontEnd:(nonnull UILocalNotification *)notification userInfoKey:(nonnull NSString *)userInfoKey userInfoValue:(nonnull NSString *)userInfoValue DEPRECATED_MSG_ATTRIBUTE("此方法已经废弃,若需要弹窗,请用 AlertViewController 手动弹出"); ++(void)delLocalNotification:(nonnull NSString *)userInfoKey userInfoValue:(nonnull NSString *)userInfoValue DEPRECATED_MSG_ATTRIBUTE("此方法已经废弃,请使用苹果提供的 API 删除本地推送"); ++(void)delLocalNotification:(nonnull UILocalNotification *)myUILocalNotification DEPRECATED_MSG_ATTRIBUTE("此方法已经废弃,请使用苹果提供的 API 删除本地推送"); ++(void)clearLocalNotifications DEPRECATED_MSG_ATTRIBUTE("此方法已经废弃,请使用苹果提供的 API 删除本地推送"); ++(uint32_t)getAccessID DEPRECATED_MSG_ATTRIBUTE("此方法已经废弃,请使用带回调的方法替代"); ++(void)initForReregister:(nullable void (^)(void)) successCallback DEPRECATED_MSG_ATTRIBUTE("方法已经废弃,请不要使用此方法"); ++(void)setAccount:(nonnull NSString *)account DEPRECATED_MSG_ATTRIBUTE("方法已经废弃,请使用带回调的方法替代"); ++(nullable NSString *)registerDevice:(nonnull NSData *)deviceToken DEPRECATED_MSG_ATTRIBUTE("方法已经废弃,请使用带回调的方法替代"); ++(nullable NSString *)registerDeviceStr:(nonnull NSString *)deviceToken DEPRECATED_MSG_ATTRIBUTE("方法已经废弃,请使用带回调的方法替代"); ++(void)unRegisterDevice DEPRECATED_MSG_ATTRIBUTE("此方法已经废弃,请使用带回调的方法替代"); ++(void)setTag:(nonnull NSString *)tag DEPRECATED_MSG_ATTRIBUTE("此方法已经废弃,请使用带回调的方法替代"); ++(void)delTag:(nonnull NSString *)tag DEPRECATED_MSG_ATTRIBUTE("此方法已经废弃,请使用带回调的方法替代"); ++(void)handleReceiveNotification:(nonnull NSDictionary *)userInfo DEPRECATED_MSG_ATTRIBUTE("此方法已经废弃"); ++(void)handleReceiveNotification:(nonnull NSDictionary *)userInfo completion:(nullable void (^)(void)) completion DEPRECATED_MSG_ATTRIBUTE("此方法已经废弃"); ++(void)handleReceiveNotification:(nonnull NSDictionary *)userInfo successCallback:(nullable void (^)(void)) successCallback errorCallback:(nullable void (^)(void)) errorCallback completion:(nullable void (^)(void)) completion DEPRECATED_MSG_ATTRIBUTE("此方法已经废弃"); ++(void)handleLaunching:(nonnull NSDictionary *)launchOptions DEPRECATED_MSG_ATTRIBUTE("此方法已经废弃,请使用带回调的方法替代"); + +@end diff --git a/ios/SDK/XGSetting.h b/ios/SDK/XGSetting.h new file mode 100644 index 0000000..d80e916 --- /dev/null +++ b/ios/SDK/XGSetting.h @@ -0,0 +1,23 @@ +// +// XGSetting.h +// XG-SDK +// +// Created by xiangchen on 29/08/14. +// Copyright (c) 2014 mta. All rights reserved. +// + +#import + +#define XG_SDK_VERSION @"2.5.0" + +@interface XGSetting : NSObject + +@property (nonatomic,retain) NSString* Channel DEPRECATED_MSG_ATTRIBUTE("此属性已经废弃"); +@property (nonatomic,retain) NSString* GameServer DEPRECATED_MSG_ATTRIBUTE("此属性已经废弃"); + ++(id)getInstance; + +-(void) enableDebug:(BOOL) enbaleDebug; +-(BOOL) isEnableDebug; + +@end diff --git a/ios/SDK/libXG-SDK.a b/ios/SDK/libXG-SDK.a new file mode 100644 index 0000000..7f378ea Binary files /dev/null and b/ios/SDK/libXG-SDK.a differ diff --git a/ios/XGPush.xcodeproj/project.pbxproj b/ios/XGPush.xcodeproj/project.pbxproj new file mode 100644 index 0000000..dc56e92 --- /dev/null +++ b/ios/XGPush.xcodeproj/project.pbxproj @@ -0,0 +1,299 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + C50FF02A1D54262A00CEF3D0 /* XGPushManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C50FF0291D54262A00CEF3D0 /* XGPushManager.m */; }; + C5D48E341D5428F4004BD09A /* libXG-SDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C5D48E331D5428F4004BD09A /* libXG-SDK.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + C50FF0221D54262A00CEF3D0 /* Copy Files */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + name = "Copy Files"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + C50FF0241D54262A00CEF3D0 /* libXGPush.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libXGPush.a; sourceTree = BUILT_PRODUCTS_DIR; }; + C50FF0271D54262A00CEF3D0 /* XGPushManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XGPushManager.h; sourceTree = ""; }; + C50FF0291D54262A00CEF3D0 /* XGPushManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XGPushManager.m; sourceTree = ""; }; + C5D48E301D5428D2004BD09A /* XGSetting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XGSetting.h; path = SDK/XGSetting.h; sourceTree = ""; }; + C5D48E311D5428D2004BD09A /* XGPush.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XGPush.h; path = SDK/XGPush.h; sourceTree = ""; }; + C5D48E331D5428F4004BD09A /* libXG-SDK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libXG-SDK.a"; path = "SDK/libXG-SDK.a"; sourceTree = ""; }; + C5D48E761D54731F004BD09A /* libReact.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libReact.a; path = "../../react-native/React/build/Debug-iphoneos/libReact.a"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + C50FF0211D54262A00CEF3D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C5D48E341D5428F4004BD09A /* libXG-SDK.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + C50FF01B1D54262A00CEF3D0 = { + isa = PBXGroup; + children = ( + C5D48E321D5428DE004BD09A /* Frameworks */, + C5D48E2F1D5428C1004BD09A /* SDK */, + C50FF0261D54262A00CEF3D0 /* XGPush */, + C50FF0251D54262A00CEF3D0 /* Products */, + ); + sourceTree = ""; + }; + C50FF0251D54262A00CEF3D0 /* Products */ = { + isa = PBXGroup; + children = ( + C50FF0241D54262A00CEF3D0 /* libXGPush.a */, + ); + name = Products; + sourceTree = ""; + }; + C50FF0261D54262A00CEF3D0 /* XGPush */ = { + isa = PBXGroup; + children = ( + C50FF0271D54262A00CEF3D0 /* XGPushManager.h */, + C50FF0291D54262A00CEF3D0 /* XGPushManager.m */, + ); + path = XGPush; + sourceTree = ""; + }; + C5D48E2F1D5428C1004BD09A /* SDK */ = { + isa = PBXGroup; + children = ( + C5D48E301D5428D2004BD09A /* XGSetting.h */, + C5D48E311D5428D2004BD09A /* XGPush.h */, + ); + name = SDK; + sourceTree = ""; + }; + C5D48E321D5428DE004BD09A /* Frameworks */ = { + isa = PBXGroup; + children = ( + C5D48E761D54731F004BD09A /* libReact.a */, + C5D48E331D5428F4004BD09A /* libXG-SDK.a */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + C50FF0231D54262A00CEF3D0 /* XGPush */ = { + isa = PBXNativeTarget; + buildConfigurationList = C50FF02D1D54262A00CEF3D0 /* Build configuration list for PBXNativeTarget "XGPush" */; + buildPhases = ( + C50FF0201D54262A00CEF3D0 /* Sources */, + C50FF0211D54262A00CEF3D0 /* Frameworks */, + C50FF0221D54262A00CEF3D0 /* Copy Files */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = XGPush; + productName = RCTXGPush; + productReference = C50FF0241D54262A00CEF3D0 /* libXGPush.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + C50FF01C1D54262A00CEF3D0 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0730; + ORGANIZATIONNAME = Jeepeng; + TargetAttributes = { + C50FF0231D54262A00CEF3D0 = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = C50FF01F1D54262A00CEF3D0 /* Build configuration list for PBXProject "XGPush" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = C50FF01B1D54262A00CEF3D0; + productRefGroup = C50FF0251D54262A00CEF3D0 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + C50FF0231D54262A00CEF3D0 /* XGPush */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + C50FF0201D54262A00CEF3D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C50FF02A1D54262A00CEF3D0 /* XGPushManager.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + C50FF02B1D54262A00CEF3D0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + C50FF02C1D54262A00CEF3D0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + C50FF02E1D54262A00CEF3D0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../../react-native/React/**", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/SDK/**", + ); + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = XGPush; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + C50FF02F1D54262A00CEF3D0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../../react-native/React/**", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/SDK/**", + ); + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = XGPush; + SKIP_INSTALL = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C50FF01F1D54262A00CEF3D0 /* Build configuration list for PBXProject "XGPush" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C50FF02B1D54262A00CEF3D0 /* Debug */, + C50FF02C1D54262A00CEF3D0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C50FF02D1D54262A00CEF3D0 /* Build configuration list for PBXNativeTarget "XGPush" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C50FF02E1D54262A00CEF3D0 /* Debug */, + C50FF02F1D54262A00CEF3D0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = C50FF01C1D54262A00CEF3D0 /* Project object */; +} diff --git a/ios/XGPush.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/XGPush.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..fb1667b --- /dev/null +++ b/ios/XGPush.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/XGPush.xcodeproj/project.xcworkspace/xcuserdata/Jeepeng.xcuserdatad/UserInterfaceState.xcuserstate b/ios/XGPush.xcodeproj/project.xcworkspace/xcuserdata/Jeepeng.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..f3e65a6 Binary files /dev/null and b/ios/XGPush.xcodeproj/project.xcworkspace/xcuserdata/Jeepeng.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/ios/XGPush.xcodeproj/xcuserdata/Jeepeng.xcuserdatad/xcschemes/XGPush.xcscheme b/ios/XGPush.xcodeproj/xcuserdata/Jeepeng.xcuserdatad/xcschemes/XGPush.xcscheme new file mode 100644 index 0000000..6ccb7f3 --- /dev/null +++ b/ios/XGPush.xcodeproj/xcuserdata/Jeepeng.xcuserdatad/xcschemes/XGPush.xcscheme @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/XGPush.xcodeproj/xcuserdata/Jeepeng.xcuserdatad/xcschemes/xcschememanagement.plist b/ios/XGPush.xcodeproj/xcuserdata/Jeepeng.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..2ddceaa --- /dev/null +++ b/ios/XGPush.xcodeproj/xcuserdata/Jeepeng.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + XGPush.xcscheme + + orderHint + 1 + + + SuppressBuildableAutocreation + + C50FF0231D54262A00CEF3D0 + + primary + + + + + diff --git a/ios/XGPush/XGPushManager.h b/ios/XGPush/XGPushManager.h new file mode 100644 index 0000000..ffd5cdc --- /dev/null +++ b/ios/XGPush/XGPushManager.h @@ -0,0 +1,45 @@ +// +// XGPushManager.h +// XGPushManager +// +// Created by Jeepeng on 16/8/5. +// Copyright © 2016年 Jeepeng. All rights reserved. +// + +#import + +extern NSString *const RCTRemoteNotificationReceived; + +@interface XGPushManager : RCTEventEmitter + +typedef void (^RCTRemoteNotificationCallback)(UIBackgroundFetchResult result); + +#if !TARGET_OS_TV ++ (void)didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings; ++ (void)didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken; ++ (void)didReceiveRemoteNotification:(NSDictionary *)notification; ++ (void)didReceiveRemoteNotification:(NSDictionary *)notification fetchCompletionHandler:(RCTRemoteNotificationCallback)completionHandler; ++ (void)didReceiveLocalNotification:(UILocalNotification *)notification; ++ (void)didFailToRegisterForRemoteNotificationsWithError:(NSError *)error; +#endif + +/** + 在didFinishLaunchingWithOptions中调用,用于推送反馈.(app没有运行时,点击推送启动时) + + @param launchOptions didFinishLaunchingWithOptions中的userinfo参数 + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ ++(void)handleLaunching:(nonnull NSDictionary *)launchOptions successCallback:(nullable void (^)(void)) successCallback errorCallback:(nullable void (^)(void)) errorCallback; + +/** + 在didReceiveRemoteNotification中调用,用于推送反馈。(app在运行时) + + @param userInfo 苹果 apns 的推送信息 + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ ++(void)handleReceiveNotification:(nonnull NSDictionary *)userInfo successCallback:(nullable void (^)(void)) successCallback errorCallback:(nullable void (^)(void)) errorCallback; + + +@end diff --git a/ios/XGPush/XGPushManager.m b/ios/XGPush/XGPushManager.m new file mode 100644 index 0000000..dbbc4ff --- /dev/null +++ b/ios/XGPush/XGPushManager.m @@ -0,0 +1,668 @@ +// +// XGPushManager.m +// 参考了 react-native 官方 PushNotificationIOS 的代码 +// Created by Jeepeng on 16/8/5. +// Copyright © 2016年 Jeepeng. All rights reserved. +// + +#import "XGPushManager.h" +#import "XGPush.h" +#import "XGSetting.h" + +#import + +#import +#import +#import +#import + +NSString *const RCTLocalNotificationReceived = @"LocalNotificationReceived"; +NSString *const RCTRemoteNotificationReceived = @"RemoteNotificationReceived"; +NSString *const RCTRemoteNotificationsRegistered = @"RemoteNotificationsRegistered"; +NSString *const RCTRegisterUserNotificationSettings = @"RegisterUserNotificationSettings"; + +NSString *const RCTErrorUnableToRequestPermissions = @"E_UNABLE_TO_REQUEST_PERMISSIONS"; +NSString *const RCTErrorRemoteNotificationRegistrationFailed = @"E_FAILED_TO_REGISTER_FOR_REMOTE_NOTIFICATIONS"; + +#if !TARGET_OS_TV +@implementation RCTConvert (NSCalendarUnit) + +RCT_ENUM_CONVERTER(NSCalendarUnit, + (@{ + @"year": @(NSCalendarUnitYear), + @"month": @(NSCalendarUnitMonth), + @"week": @(NSCalendarUnitWeekOfYear), + @"day": @(NSCalendarUnitDay), + @"hour": @(NSCalendarUnitHour), + @"minute": @(NSCalendarUnitMinute) + }), + 0, + integerValue) + +@end + +@interface XGPushManager () +@property (nonatomic, strong) NSMutableDictionary *remoteNotificationCallbacks; +@end + +@implementation RCTConvert (UILocalNotification) + ++ (UILocalNotification *)UILocalNotification:(id)json +{ + NSDictionary *details = [self NSDictionary:json]; + UILocalNotification *notification = [UILocalNotification new]; + notification.fireDate = [RCTConvert NSDate:details[@"fireDate"]] ?: [NSDate date]; + notification.alertBody = [RCTConvert NSString:details[@"alertBody"]]; + notification.alertAction = [RCTConvert NSString:details[@"alertAction"]]; + notification.soundName = [RCTConvert NSString:details[@"soundName"]] ?: UILocalNotificationDefaultSoundName; + notification.userInfo = [RCTConvert NSDictionary:details[@"userInfo"]]; + notification.category = [RCTConvert NSString:details[@"category"]]; + notification.repeatInterval = [RCTConvert NSCalendarUnit:details[@"repeatInterval"]]; + if (details[@"applicationIconBadgeNumber"]) { + notification.applicationIconBadgeNumber = [RCTConvert NSInteger:details[@"applicationIconBadgeNumber"]]; + } + return notification; +} + +RCT_ENUM_CONVERTER(UIBackgroundFetchResult, (@{ + @"UIBackgroundFetchResultNewData": @(UIBackgroundFetchResultNewData), + @"UIBackgroundFetchResultNoData": @(UIBackgroundFetchResultNoData), + @"UIBackgroundFetchResultFailed": @(UIBackgroundFetchResultFailed), +}), UIBackgroundFetchResultNoData, integerValue) + +@end +#endif //TARGET_OS_TV + +@implementation XGPushManager +{ + RCTPromiseResolveBlock _requestPermissionsResolveBlock; +} + +#if !TARGET_OS_TV + +static NSDictionary *RCTFormatLocalNotification(UILocalNotification *notification) +{ + NSMutableDictionary *formattedLocalNotification = [NSMutableDictionary dictionary]; + if (notification.fireDate) { + NSDateFormatter *formatter = [NSDateFormatter new]; + [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"]; + NSString *fireDateString = [formatter stringFromDate:notification.fireDate]; + formattedLocalNotification[@"fireDate"] = fireDateString; + } + formattedLocalNotification[@"alertAction"] = RCTNullIfNil(notification.alertAction); + formattedLocalNotification[@"alertBody"] = RCTNullIfNil(notification.alertBody); + formattedLocalNotification[@"applicationIconBadgeNumber"] = @(notification.applicationIconBadgeNumber); + formattedLocalNotification[@"category"] = RCTNullIfNil(notification.category); + formattedLocalNotification[@"soundName"] = RCTNullIfNil(notification.soundName); + formattedLocalNotification[@"userInfo"] = RCTNullIfNil(RCTJSONClean(notification.userInfo)); + formattedLocalNotification[@"remote"] = @NO; + return formattedLocalNotification; +} + +static NSDictionary *RCTFormatUNNotification(UNNotification *notification) +{ + NSMutableDictionary *formattedNotification = [NSMutableDictionary dictionary]; + UNNotificationContent *content = notification.request.content; + + formattedNotification[@"identifier"] = notification.request.identifier; + + if (notification.date) { + NSDateFormatter *formatter = [NSDateFormatter new]; + [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"]; + NSString *dateString = [formatter stringFromDate:notification.date]; + formattedNotification[@"date"] = dateString; + } + + formattedNotification[@"title"] = RCTNullIfNil(content.title); + formattedNotification[@"body"] = RCTNullIfNil(content.body); + formattedNotification[@"category"] = RCTNullIfNil(content.categoryIdentifier); + formattedNotification[@"thread-id"] = RCTNullIfNil(content.threadIdentifier); + formattedNotification[@"userInfo"] = RCTNullIfNil(RCTJSONClean(content.userInfo)); + + return formattedNotification; +} + +#endif //TARGET_OS_TV + +RCT_EXPORT_MODULE() + +- (dispatch_queue_t)methodQueue +{ + return dispatch_get_main_queue(); +} + +#if !TARGET_OS_TV +- (void)startObserving +{ + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleLocalNotificationReceived:) + name:RCTLocalNotificationReceived + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleRemoteNotificationReceived:) + name:RCTRemoteNotificationReceived + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleRemoteNotificationsRegistered:) + name:RCTRemoteNotificationsRegistered + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleRemoteNotificationRegistrationError:) + name:RCTErrorRemoteNotificationRegistrationFailed + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleRegisterUserNotificationSettings:) + name:RCTRegisterUserNotificationSettings + object:nil]; +} + +- (void)stopObserving +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (NSArray *)supportedEvents +{ + return @[@"localNotificationReceived", + @"remoteNotificationReceived", + @"remoteNotificationsRegistered", + @"remoteNotificationRegistrationError"]; +} + ++ (void)didRegisterUserNotificationSettings:(__unused UIUserNotificationSettings *)notificationSettings +{ + if ([UIApplication instancesRespondToSelector:@selector(registerForRemoteNotifications)]) { + [RCTSharedApplication() registerForRemoteNotifications]; + [[NSNotificationCenter defaultCenter] postNotificationName:RCTRegisterUserNotificationSettings + object:self + userInfo:@{@"notificationSettings": notificationSettings}]; + } +} + ++ (void)didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken +{ + NSMutableString *hexString = [NSMutableString string]; + NSUInteger deviceTokenLength = deviceToken.length; + const unsigned char *bytes = deviceToken.bytes; + for (NSUInteger i = 0; i < deviceTokenLength; i++) { + [hexString appendFormat:@"%02x", bytes[i]]; + } + [[NSNotificationCenter defaultCenter] postNotificationName:RCTRemoteNotificationsRegistered + object:self + userInfo:@{@"deviceToken" : [hexString copy]}]; +} + ++ (void)didFailToRegisterForRemoteNotificationsWithError:(NSError *)error +{ + [[NSNotificationCenter defaultCenter] postNotificationName:RCTErrorRemoteNotificationRegistrationFailed + object:self + userInfo:@{@"error": error}]; +} + ++ (void)didReceiveRemoteNotification:(NSDictionary *)notification +{ + NSDictionary *userInfo = @{@"notification": notification}; + [[NSNotificationCenter defaultCenter] postNotificationName:RCTRemoteNotificationReceived + object:self + userInfo:userInfo]; +} + ++ (void)didReceiveRemoteNotification:(NSDictionary *)notification + fetchCompletionHandler:(RCTRemoteNotificationCallback)completionHandler +{ + NSDictionary *userInfo = @{@"notification": notification, @"completionHandler": completionHandler}; + [[NSNotificationCenter defaultCenter] postNotificationName:RCTRemoteNotificationReceived + object:self + userInfo:userInfo]; +} + ++ (void)didReceiveLocalNotification:(UILocalNotification *)notification +{ + [[NSNotificationCenter defaultCenter] postNotificationName:RCTLocalNotificationReceived + object:self + userInfo:RCTFormatLocalNotification(notification)]; +} + +- (void)handleLocalNotificationReceived:(NSNotification *)notification +{ + [self sendEventWithName:@"localNotificationReceived" body:notification.userInfo]; +} + +- (void)handleRemoteNotificationReceived:(NSNotification *)notification +{ + NSMutableDictionary *remoteNotification = [NSMutableDictionary dictionaryWithDictionary:notification.userInfo[@"notification"]]; + RCTRemoteNotificationCallback completionHandler = notification.userInfo[@"completionHandler"]; + NSString *notificationId = [[NSUUID UUID] UUIDString]; + remoteNotification[@"notificationId"] = notificationId; + remoteNotification[@"remote"] = @YES; + if (completionHandler) { + if (!self.remoteNotificationCallbacks) { + // Lazy initialization + self.remoteNotificationCallbacks = [NSMutableDictionary dictionary]; + } + self.remoteNotificationCallbacks[notificationId] = completionHandler; + } + + [self sendEventWithName:@"remoteNotificationReceived" body:remoteNotification]; +} + +- (void)handleRemoteNotificationsRegistered:(NSNotification *)notification +{ + [self sendEventWithName:@"remoteNotificationsRegistered" body:notification.userInfo]; +} + +- (void)handleRemoteNotificationRegistrationError:(NSNotification *)notification +{ + NSError *error = notification.userInfo[@"error"]; + NSDictionary *errorDetails = @{ + @"message": error.localizedDescription, + @"code": @(error.code), + @"details": error.userInfo, + }; + [self sendEventWithName:@"remoteNotificationRegistrationError" body:errorDetails]; +} + +- (void)handleRegisterUserNotificationSettings:(NSNotification *)notification +{ + if (_requestPermissionsResolveBlock == nil) { + return; + } + + UIUserNotificationSettings *notificationSettings = notification.userInfo[@"notificationSettings"]; + NSDictionary *notificationTypes = @{ + @"alert": @((notificationSettings.types & UIUserNotificationTypeAlert) > 0), + @"sound": @((notificationSettings.types & UIUserNotificationTypeSound) > 0), + @"badge": @((notificationSettings.types & UIUserNotificationTypeBadge) > 0), + }; + + _requestPermissionsResolveBlock(notificationTypes); + _requestPermissionsResolveBlock = nil; +} + +RCT_EXPORT_METHOD(onFinishRemoteNotification:(NSString *)notificationId fetchResult:(UIBackgroundFetchResult)result) { + RCTRemoteNotificationCallback completionHandler = self.remoteNotificationCallbacks[notificationId]; + if (!completionHandler) { + RCTLogError(@"There is no completion handler with notification id: %@", notificationId); + return; + } + completionHandler(result); + [self.remoteNotificationCallbacks removeObjectForKey:notificationId]; +} + +/** + * Update the application icon badge number on the home screen + */ +RCT_EXPORT_METHOD(setApplicationIconBadgeNumber:(NSInteger)number) +{ + RCTSharedApplication().applicationIconBadgeNumber = number; +} + +/** + * Get the current application icon badge number on the home screen + */ +RCT_EXPORT_METHOD(getApplicationIconBadgeNumber:(RCTResponseSenderBlock)callback) +{ + callback(@[@(RCTSharedApplication().applicationIconBadgeNumber)]); +} + +RCT_EXPORT_METHOD(requestPermissions:(NSDictionary *)permissions + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + if (RCTRunningInAppExtension()) { + reject(RCTErrorUnableToRequestPermissions, nil, RCTErrorWithMessage(@"Requesting push notifications is currently unavailable in an app extension")); + return; + } + + if (_requestPermissionsResolveBlock != nil) { + RCTLogError(@"Cannot call requestPermissions twice before the first has returned."); + return; + } + + _requestPermissionsResolveBlock = resolve; + + UIUserNotificationType types = UIUserNotificationTypeNone; + if (permissions) { + if ([RCTConvert BOOL:permissions[@"alert"]]) { + types |= UIUserNotificationTypeAlert; + } + if ([RCTConvert BOOL:permissions[@"badge"]]) { + types |= UIUserNotificationTypeBadge; + } + if ([RCTConvert BOOL:permissions[@"sound"]]) { + types |= UIUserNotificationTypeSound; + } + } else { + types = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound; + } + + UIUserNotificationSettings *notificationSettings = + [UIUserNotificationSettings settingsForTypes:types categories:nil]; + [RCTSharedApplication() registerUserNotificationSettings:notificationSettings]; +} + +RCT_EXPORT_METHOD(abandonPermissions) +{ + [RCTSharedApplication() unregisterForRemoteNotifications]; +} + +RCT_EXPORT_METHOD(checkPermissions:(RCTResponseSenderBlock)callback) +{ + if (RCTRunningInAppExtension()) { + callback(@[@{@"alert": @NO, @"badge": @NO, @"sound": @NO}]); + return; + } + + NSUInteger types = [RCTSharedApplication() currentUserNotificationSettings].types; + callback(@[@{ + @"alert": @((types & UIUserNotificationTypeAlert) > 0), + @"badge": @((types & UIUserNotificationTypeBadge) > 0), + @"sound": @((types & UIUserNotificationTypeSound) > 0), + }]); +} + +RCT_EXPORT_METHOD(presentLocalNotification:(UILocalNotification *)notification) +{ + [RCTSharedApplication() presentLocalNotificationNow:notification]; +} + +RCT_EXPORT_METHOD(scheduleLocalNotification:(UILocalNotification *)notification) +{ + [RCTSharedApplication() scheduleLocalNotification:notification]; +} + +RCT_EXPORT_METHOD(cancelAllLocalNotifications) +{ + [RCTSharedApplication() cancelAllLocalNotifications]; +} + +RCT_EXPORT_METHOD(cancelLocalNotifications:(NSDictionary *)userInfo) +{ + for (UILocalNotification *notification in RCTSharedApplication().scheduledLocalNotifications) { + __block BOOL matchesAll = YES; + NSDictionary *notificationInfo = notification.userInfo; + // Note: we do this with a loop instead of just `isEqualToDictionary:` + // because we only require that all specified userInfo values match the + // notificationInfo values - notificationInfo may contain additional values + // which we don't care about. + [userInfo enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) { + if (![notificationInfo[key] isEqual:obj]) { + matchesAll = NO; + *stop = YES; + } + }]; + if (matchesAll) { + [RCTSharedApplication() cancelLocalNotification:notification]; + } + } +} + +RCT_EXPORT_METHOD(getInitialNotification:(RCTPromiseResolveBlock)resolve + reject:(__unused RCTPromiseRejectBlock)reject) +{ + NSMutableDictionary *initialNotification = + [self.bridge.launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] mutableCopy]; + + UILocalNotification *initialLocalNotification = + self.bridge.launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]; + + if (initialNotification) { + initialNotification[@"remote"] = @YES; + resolve(initialNotification); + } else if (initialLocalNotification) { + resolve(RCTFormatLocalNotification(initialLocalNotification)); + } else { + resolve((id)kCFNull); + } +} + +RCT_EXPORT_METHOD(getScheduledLocalNotifications:(RCTResponseSenderBlock)callback) +{ + NSArray *scheduledLocalNotifications = RCTSharedApplication().scheduledLocalNotifications; + NSMutableArray *formattedScheduledLocalNotifications = [NSMutableArray new]; + for (UILocalNotification *notification in scheduledLocalNotifications) { + [formattedScheduledLocalNotifications addObject:RCTFormatLocalNotification(notification)]; + } + callback(@[formattedScheduledLocalNotifications]); +} + +RCT_EXPORT_METHOD(removeAllDeliveredNotifications) +{ + if ([UNUserNotificationCenter class]) { + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + [center removeAllDeliveredNotifications]; + } +} + +RCT_EXPORT_METHOD(removeDeliveredNotifications:(NSArray *)identifiers) +{ + if ([UNUserNotificationCenter class]) { + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + [center removeDeliveredNotificationsWithIdentifiers:identifiers]; + } +} + +RCT_EXPORT_METHOD(getDeliveredNotifications:(RCTResponseSenderBlock)callback) +{ + if ([UNUserNotificationCenter class]) { + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + [center getDeliveredNotificationsWithCompletionHandler:^(NSArray *_Nonnull notifications) { + NSMutableArray *formattedNotifications = [NSMutableArray new]; + + for (UNNotification *notification in notifications) { + [formattedNotifications addObject:RCTFormatUNNotification(notification)]; + } + callback(@[formattedNotifications]); + }]; + } +} + +/********************* 信鸽 *********************/ + +/** + 在didFinishLaunchingWithOptions中调用,用于推送反馈.(app没有运行时,点击推送启动时) + + @param launchOptions didFinishLaunchingWithOptions中的userinfo参数 + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ ++(void)handleLaunching:(nonnull NSDictionary *)launchOptions successCallback:(nullable void (^)(void)) successCallback errorCallback:(nullable void (^)(void)) errorCallback +{ + [XGPush handleLaunching:launchOptions successCallback:successCallback errorCallback:errorCallback]; +} + +/** + * 在didReceiveRemoteNotification中调用,用于推送反馈。(app在运行时) + */ ++(void)handleReceiveNotification:(nonnull NSDictionary *)userInfo successCallback:(nullable void (^)(void)) successCallback errorCallback:(nullable void (^)(void)) errorCallback +{ + [XGPush handleReceiveNotification:userInfo successCallback:successCallback errorCallback:errorCallback]; +} + +/** + * 打开 Debug 模式以后可以在终端看到详细的信鸽 Debug 信息.方便定位问题 + */ +RCT_EXPORT_METHOD(enableDebug:(BOOL)isDebug) +{ + XGSetting *setting = [XGSetting getInstance]; + [setting enableDebug:isDebug]; +} + +/** + * 查看debug开关是否打开 + */ +RCT_EXPORT_METHOD(isEnableDebug:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) +{ + XGSetting *setting = [XGSetting getInstance]; + BOOL isDebug = [setting isEnableDebug]; + resolve(@(isDebug)); +} + +/** + * 初始化信鸽 + * @param appId - 通过前台申请的accessId + * @param appKey - 通过前台申请的accessKey + * @return none + */ +RCT_EXPORT_METHOD(startApp:(uint64_t)accessId accessKey:(nonnull NSString *)accessKey) +{ + [XGPush startApp:accessId appKey:accessKey]; +} + +/** + 判断当前是否是已注销状态 + + @return 是否已经注销推送 + */ +RCT_EXPORT_METHOD(isUnRegisterStatus:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) +{ + BOOL isUnRegister = [XGPush isUnRegisterStatus]; + resolve(@(isUnRegister)); +} + +/** + 查询推送是否打开(以弹窗为准) + + @param result 查询回调.若推送打开,回调参数为 YES, 否则为 NO + */ +RCT_EXPORT_METHOD(isPushOn:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) +{ + [XGPush isPushOn:^(BOOL isOn) { + NSLog(@"[XGPush] Push Is %@", isOn ? @"ON" : @"OFF"); + resolve(@(isOn)); + }]; +} + +/** + 注册设备并且设置账号 + + @param deviceToken 通过app delegate的didRegisterForRemoteNotificationsWithDeviceToken回调的获取 + @param account 需要设置的账号,长度为2个字节以上,不要使用"test","123456"这种过于简单的字符串, + 若不想设置账号,请传入nil + @param successCallback 成功回调 + @param errorCallback 失败回调 + @return 获取的 deviceToken 字符串 + */ +RCT_EXPORT_METHOD(registerDevice:(nonnull NSString *) deviceToken account:(nullable NSString *)account resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) +{ + void (^successBlock)(void) = ^(void){ + resolve(@"信鸽推送注册成功!"); + }; + + void (^errorBlock)(void) = ^(void){ + reject(@"XGPUSH_REGISTER_ERROR", @"信鸽推送注册失败.", nil); + }; + + //注册设备 + [XGPush registerDeviceStr:deviceToken account:account successCallback:successBlock errorCallback:errorBlock]; +} + +/** + 注销设备,设备不再进行推送 + + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ +RCT_EXPORT_METHOD(unRegisterDevice:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) +{ + void (^successBlock)(void) = ^(void){ + resolve(@"注销设备成功!"); + }; + + void (^errorBlock)(void) = ^(void){ + reject(@"XGPUSH_UNREGISTER_DEVICE_FAIL",@"注销设备失败!",nil); + }; + + [XGPush unRegisterDevice:successBlock errorCallback:errorBlock]; +} + +/** + 设置设备的帐号. 设置账号前需要调用一次registerDevice + + @param account 需要设置的账号,长度为2个字节以上,不要使用"test","123456"这种过于简单的字符串, + 若不想设置账号,请传入nil + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ +RCT_EXPORT_METHOD(setAccount:(nonnull NSString *)account resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) +{ + void (^successBlock)(void) = ^(void){ + resolve(@"设置设备的帐号成功!"); + }; + + void (^errorBlock)(void) = ^(void){ + reject(@"XGPUSH_SET_ACCOUNT_FAIL", @"设置设备的帐号失败.", nil); + }; + + [XGPush setAccount:account successCallback:successBlock errorCallback:errorBlock]; +} + + +/** + 删除已经设置的账号 + + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ +RCT_EXPORT_METHOD(delAccount:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) +{ + void (^successBlock)(void) = ^(void){ + resolve(@"删除已经设置的账号成功!"); + }; + + void (^errorBlock)(void) = ^(void){ + reject(@"XGPUSH_DELETE_ACCOUNT_FAIL", @"删除已经设置的账号失败.", nil); + }; + // 设置账号,要在注册设备之前完成 + [XGPush delAccount:successBlock errorCallback:errorBlock]; +} + +/** + 设置 tag + + @param tag 需要设置的 tag + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ +RCT_EXPORT_METHOD(setTag:(NSString *)tagName resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) +{ + void (^successBlock)(void) = ^(void){ + resolve(@"设置Tag成功!"); + }; + + void (^errorBlock)(void) = ^(void){ + reject(@"XGPUSH_SET_TAG_FAIL",@"设置Tag失败!",nil); + }; + [XGPush setTag:tagName successCallback:successBlock errorCallback:errorBlock]; +} + +/** + 删除tag + + @param tag 需要删除的 tag + @param successCallback 成功回调 + @param errorCallback 失败回调 + */ +RCT_EXPORT_METHOD(delTag:(NSString *)tagName resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) +{ + void (^successBlock)(void) = ^(void){ + resolve(@"删除Tag成功!"); + }; + + void (^errorBlock)(void) = ^(void){ + reject(@"XGPUSH_DELETE_TAG_FAIL",@"删除Tag失败!",nil); + }; + + [XGPush delTag:tagName successCallback:successBlock errorCallback:errorBlock]; +} + +#else //TARGET_OS_TV + +- (NSArray *)supportedEvents +{ + return @[]; +} + +#endif //TARGET_OS_TV + +@end diff --git a/package.json b/package.json new file mode 100644 index 0000000..3992c5a --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "react-native-xinge-push", + "version": "0.1.3", + "description": "Xinge push for react-native", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Jeepeng/react-native-xinge-push.git" + }, + "keywords": [ + "xinge", + "xinge-push", + "xgpush", + "react-native" + ], + "author": "Jeepeng", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/Jeepeng/react-native-xinge-push/issues" + }, + "homepage": "https://github.com/Jeepeng/react-native-xinge-push#readme" +}