| @@ -0,0 +1,6 @@ | |||||
| [android] | |||||
| target = Google Inc.:Google APIs:23 | |||||
| [maven_repositories] | |||||
| central = https://repo1.maven.org/maven2 | |||||
| @@ -0,0 +1,70 @@ | |||||
| [ignore] | |||||
| ; We fork some components by platform | |||||
| .*/*[.]android.js | |||||
| ; Ignore "BUCK" generated dirs | |||||
| <PROJECT_ROOT>/\.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 | |||||
| ; Ignore polyfills | |||||
| .*/Libraries/polyfills/.* | |||||
| ; Ignore metro | |||||
| .*/node_modules/metro/.* | |||||
| [include] | |||||
| [libs] | |||||
| node_modules/react-native/Libraries/react-native/react-native-interface.js | |||||
| node_modules/react-native/flow/ | |||||
| node_modules/react-native/flow-github/ | |||||
| [options] | |||||
| emoji=true | |||||
| esproposal.optional_chaining=enable | |||||
| esproposal.nullish_coalescing=enable | |||||
| module.system=haste | |||||
| module.system.haste.use_name_reducers=true | |||||
| # get basename | |||||
| module.system.haste.name_reducers='^.*/\([a-zA-Z0-9$_.-]+\.js\(\.flow\)?\)$' -> '\1' | |||||
| # strip .js or .js.flow suffix | |||||
| module.system.haste.name_reducers='^\(.*\)\.js\(\.flow\)?$' -> '\1' | |||||
| # strip .ios suffix | |||||
| module.system.haste.name_reducers='^\(.*\)\.ios$' -> '\1' | |||||
| module.system.haste.name_reducers='^\(.*\)\.android$' -> '\1' | |||||
| module.system.haste.name_reducers='^\(.*\)\.native$' -> '\1' | |||||
| module.system.haste.paths.blacklist=.*/__tests__/.* | |||||
| module.system.haste.paths.blacklist=.*/__mocks__/.* | |||||
| module.system.haste.paths.blacklist=<PROJECT_ROOT>/node_modules/react-native/Libraries/Animated/src/polyfills/.* | |||||
| module.system.haste.paths.whitelist=<PROJECT_ROOT>/node_modules/react-native/Libraries/.* | |||||
| 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' | |||||
| module.file_ext=.js | |||||
| module.file_ext=.jsx | |||||
| module.file_ext=.json | |||||
| module.file_ext=.native.js | |||||
| suppress_type=$FlowIssue | |||||
| suppress_type=$FlowFixMe | |||||
| suppress_type=$FlowFixMeProps | |||||
| suppress_type=$FlowFixMeState | |||||
| suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) | |||||
| suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ | |||||
| suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy | |||||
| suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError | |||||
| [version] | |||||
| ^0.86.0 | |||||
| @@ -0,0 +1 @@ | |||||
| *.pbxproj -text | |||||
| @@ -0,0 +1,56 @@ | |||||
| # 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://docs.fastlane.tools/best-practices/source-control/ | |||||
| */fastlane/report.xml | |||||
| */fastlane/Preview.html | |||||
| */fastlane/screenshots | |||||
| # Bundle artifact | |||||
| *.jsbundle | |||||
| @@ -0,0 +1 @@ | |||||
| {} | |||||
| @@ -0,0 +1,256 @@ | |||||
| import React, { Component } from 'react'; | |||||
| import { | |||||
| Platform, | |||||
| StyleSheet, | |||||
| Text, | |||||
| View, | |||||
| Image, | |||||
| Dimensions, | |||||
| TouchableOpacity, | |||||
| } from 'react-native'; | |||||
| //引用插件 | |||||
| import Swiper from 'react-native-swiper'; | |||||
| import HttpUtils from './HttpUtils.js'; | |||||
| import CodePush from "react-native-code-push"; | |||||
| // 取得屏幕的宽高Dimensions | |||||
| const { width, height } = Dimensions.get('window'); | |||||
| export default class MyPage extends Component { | |||||
| constructor(props) { | |||||
| super(props); | |||||
| this.state = { | |||||
| swiperShow: false, | |||||
| text:'', | |||||
| qrcode:[], | |||||
| restartAllowed: true , | |||||
| syncMessage: "我是小更新" , | |||||
| progress: false | |||||
| }; | |||||
| } | |||||
| // 监听更新状态 | |||||
| codePushStatusDidChange(syncStatus) { | |||||
| switch(syncStatus) { | |||||
| case CodePush.SyncStatus.CHECKING_FOR_UPDATE: | |||||
| this.setState({ syncMessage: "Checking for update." }); | |||||
| break; | |||||
| case CodePush.SyncStatus.DOWNLOADING_PACKAGE: | |||||
| this.setState({ syncMessage: "Downloading package." }); | |||||
| break; | |||||
| case CodePush.SyncStatus.AWAITING_USER_ACTION: | |||||
| this.setState({ syncMessage: "Awaiting user action." }); | |||||
| break; | |||||
| case CodePush.SyncStatus.INSTALLING_UPDATE: | |||||
| this.setState({ syncMessage: "Installing update." }); | |||||
| break; | |||||
| case CodePush.SyncStatus.UP_TO_DATE: | |||||
| this.setState({ syncMessage: "App up to date.", progress: false }); | |||||
| break; | |||||
| case CodePush.SyncStatus.UPDATE_IGNORED: | |||||
| this.setState({ syncMessage: "Update cancelled by user.", progress: false }); | |||||
| break; | |||||
| case CodePush.SyncStatus.UPDATE_INSTALLED: | |||||
| this.setState({ syncMessage: "Update installed and will be applied on restart.", progress: false }); | |||||
| break; | |||||
| case CodePush.SyncStatus.UNKNOWN_ERROR: | |||||
| this.setState({ syncMessage: "An unknown error occurred.", progress: false }); | |||||
| break; | |||||
| } | |||||
| } | |||||
| codePushDownloadDidProgress(progress) { | |||||
| this.setState({ progress }); | |||||
| } | |||||
| // 允许重启后更新 | |||||
| toggleAllowRestart() { | |||||
| this.state.restartAllowed | |||||
| ? CodePush.disallowRestart() | |||||
| : CodePush.allowRestart(); | |||||
| this.setState({ restartAllowed: !this.state.restartAllowed }); | |||||
| } | |||||
| // 获取更新数据 | |||||
| getUpdateMetadata() { | |||||
| CodePush.getUpdateMetadata(CodePush.UpdateState.RUNNING) | |||||
| .then((metadata: LocalPackage) => { | |||||
| this.setState({ syncMessage: metadata ? JSON.stringify(metadata) : "Running binary version", progress: false }); | |||||
| }, (error: any) => { | |||||
| this.setState({ syncMessage: "Error: " + error, progress: false }); | |||||
| }); | |||||
| } | |||||
| /** Update is downloaded silently, and applied on restart (recommended) 自动更新,一键操作 */ | |||||
| sync() { | |||||
| CodePush.sync( | |||||
| {}, | |||||
| this.codePushStatusDidChange.bind(this), | |||||
| this.codePushDownloadDidProgress.bind(this) | |||||
| ); | |||||
| } | |||||
| /** Update pops a confirmation dialog, and then immediately reboots the app 一键更新,加入的配置项 */ | |||||
| syncImmediate() { | |||||
| CodePush.sync( | |||||
| { installMode: CodePush.InstallMode.IMMEDIATE, updateDialog: true }, | |||||
| this.codePushStatusDidChange.bind(this), | |||||
| this.codePushDownloadDidProgress.bind(this) | |||||
| ); | |||||
| } | |||||
| // 轮播图 | |||||
| renderBanner() { | |||||
| if (this.state.swiperShow) { | |||||
| console.log ('返回值' + this.state.swiperShow); | |||||
| return ( | |||||
| <Swiper | |||||
| style={styles.wrapper} | |||||
| showsButtons={false} | |||||
| removeClippedSubviews={false} //这个很主要啊,解决白屏问题 | |||||
| autoplay={true} | |||||
| horizontal ={true} | |||||
| paginationStyle={styles.paginationStyle} | |||||
| dotStyle={styles.dotStyle} | |||||
| activeDotStyle={styles.activeDotStyle} | |||||
| > | |||||
| <Image source={require('./image/page1.jpg')} resizeMode='stretch' style={styles.bannerImg}/> | |||||
| <Image source={require('./image/page2.jpg')} resizeMode='stretch' style={styles.bannerImg}/> | |||||
| <Image source={require('./image/page3.jpg')} resizeMode='stretch' style={styles.bannerImg}/> | |||||
| <Image source={require('./image/page4.jpg')} resizeMode='stretch' style={styles.bannerImg}/> | |||||
| </Swiper> | |||||
| ); | |||||
| } else { | |||||
| return ( | |||||
| <View style={styles.wrapper}> | |||||
| <Image style={{width: 300, height: 300}} source={{uri:'data:image/jpeg;base64,'+ this.state.qrcode}}/> | |||||
| <Text style={{marginTop: 16}}>{this.state.text}</Text> | |||||
| </View> | |||||
| ); | |||||
| } | |||||
| } | |||||
| get() { | |||||
| HttpUtils.get('https://mall.youlane.cn/api/wxDeviceScreenAd/list?deviceId=11%3AAA%3A33%3ABB%3A44&pageNum=1&pageSize=5') | |||||
| .then(result => { | |||||
| this.setState({ | |||||
| text: JSON.stringify, | |||||
| qrcode: result.data.list[0].qrcode}); | |||||
| }) | |||||
| .catch(error => console.error(error)) | |||||
| } | |||||
| componentDidMount() { | |||||
| this.get() | |||||
| setTimeout(() => { | |||||
| this.setState({ | |||||
| swiperShow: true, | |||||
| }); | |||||
| }, 10000) | |||||
| } | |||||
| render() { | |||||
| let progressView; | |||||
| if (this.state.progress) { | |||||
| progressView = ( | |||||
| <Text style={styles.messages}>{this.state.progress.receivedBytes} of {this.state.progress.totalBytes} bytes received</Text> | |||||
| ); | |||||
| } | |||||
| return ( | |||||
| <View style={styles.container}> | |||||
| <Text style={styles.welcome}> | |||||
| 可以修改此处文字,查看是否更新成功! | |||||
| </Text> | |||||
| <TouchableOpacity onPress={this.sync.bind(this)}> | |||||
| <Text style={styles.syncButton}>Press for background sync</Text> | |||||
| </TouchableOpacity> | |||||
| <TouchableOpacity onPress={this.syncImmediate.bind(this)}> | |||||
| <Text style={styles.syncButton}>Press for dialog-driven sync</Text> | |||||
| </TouchableOpacity> | |||||
| {progressView} | |||||
| <TouchableOpacity onPress={this.toggleAllowRestart.bind(this)}> | |||||
| <Text style={styles.restartToggleButton}>Restart { this.state.restartAllowed ? "allowed" : "forbidden"}</Text> | |||||
| </TouchableOpacity> | |||||
| <TouchableOpacity onPress={this.getUpdateMetadata.bind(this)}> | |||||
| <Text style={styles.syncButton}>Press for Update Metadata</Text> | |||||
| </TouchableOpacity> | |||||
| <Text style={styles.messages}>{this.state.syncMessage || ""}</Text> | |||||
| </View> | |||||
| ); | |||||
| /* | |||||
| return ( | |||||
| <View style={styles.container}> | |||||
| {this.renderBanner()} | |||||
| </View> | |||||
| ); | |||||
| */ | |||||
| } | |||||
| } | |||||
| const styles = StyleSheet.create({ | |||||
| container: { | |||||
| width:width, | |||||
| height:height, | |||||
| flex:1 | |||||
| }, | |||||
| wrapper: { | |||||
| width:width, | |||||
| height:height, | |||||
| flex:1 | |||||
| }, | |||||
| bannerImg: { | |||||
| width:width, | |||||
| height:height, | |||||
| flex:1 | |||||
| }, | |||||
| container: { | |||||
| flex: 1, | |||||
| alignItems: "center", | |||||
| backgroundColor: "#F5FCFF", | |||||
| paddingTop: 50 | |||||
| }, | |||||
| image: { | |||||
| margin: 30, | |||||
| width: Dimensions.get("window").width - 100, | |||||
| height: 365 * (Dimensions.get("window").width - 100) / 651, | |||||
| }, | |||||
| messages: { | |||||
| marginTop: 30, | |||||
| textAlign: "center", | |||||
| }, | |||||
| restartToggleButton: { | |||||
| color: "blue", | |||||
| fontSize: 17 | |||||
| }, | |||||
| syncButton: { | |||||
| color: "green", | |||||
| fontSize: 17 | |||||
| }, | |||||
| welcome: { | |||||
| fontSize: 20, | |||||
| textAlign: "center", | |||||
| margin: 20 | |||||
| }, | |||||
| }); | |||||
| @@ -0,0 +1,39 @@ | |||||
| export default class HttpUtil { | |||||
| /** | |||||
| * 利用 Promise 的 get 方式请求 | |||||
| * @param url | |||||
| * @returns {Promise} | |||||
| */ | |||||
| static get(url) { | |||||
| return new Promise((resolve, reject) => { | |||||
| fetch(url) | |||||
| .then(response => response.json()) | |||||
| .then(result => resolve(result)) | |||||
| .catch(error => reject(error)) | |||||
| }) | |||||
| } | |||||
| /** | |||||
| * 利用 Promise 的 post 方式请求 | |||||
| * @param url | |||||
| * @param params | |||||
| * @returns {Promise} | |||||
| */ | |||||
| static post(url, params) { | |||||
| return new Promise((resolve, reject) => { | |||||
| fetch(url, { | |||||
| method: 'POST', | |||||
| headers: { | |||||
| 'Accept': 'application/json', | |||||
| 'Content-Type': 'application/json' | |||||
| }, | |||||
| body: JSON.stringify(params) | |||||
| }) | |||||
| .then(response => response.json()) | |||||
| .then(result => resolve(result)) | |||||
| .catch(error => reject(error)) | |||||
| }) | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,15 @@ | |||||
| /** | |||||
| * @format | |||||
| * @lint-ignore-every XPLATJSCOPYRIGHT1 | |||||
| */ | |||||
| import 'react-native'; | |||||
| import React from 'react'; | |||||
| import App from '../App'; | |||||
| // Note: test renderer must be required after react-native. | |||||
| import renderer from 'react-test-renderer'; | |||||
| it('renders correctly', () => { | |||||
| renderer.create(<App />); | |||||
| }); | |||||
| @@ -0,0 +1,55 @@ | |||||
| # 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 | |||||
| # | |||||
| load(":build_defs.bzl", "create_aar_targets", "create_jar_targets") | |||||
| lib_deps = [] | |||||
| create_aar_targets(glob(["libs/*.aar"])) | |||||
| create_jar_targets(glob(["libs/*.jar"])) | |||||
| 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.screenad", | |||||
| ) | |||||
| android_resource( | |||||
| name = "res", | |||||
| package = "com.screenad", | |||||
| res = "src/main/res", | |||||
| ) | |||||
| android_binary( | |||||
| name = "app", | |||||
| keystore = "//android/keystores:debug", | |||||
| manifest = "src/main/AndroidManifest.xml", | |||||
| package_type = "debug", | |||||
| deps = [ | |||||
| ":app-code", | |||||
| ], | |||||
| ) | |||||
| @@ -0,0 +1,149 @@ | |||||
| 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, | |||||
| * | |||||
| * // whether to disable dev mode in custom build variants (by default only disabled in release) | |||||
| * // for example: to disable dev mode in the staging build type (if configured) | |||||
| * devDisabledInStaging: true, | |||||
| * // The configuration property can be in the following formats | |||||
| * // 'devDisabledIn${productFlavor}${buildType}' | |||||
| * // 'devDisabledIn${buildType}' | |||||
| * | |||||
| * // 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: [] | |||||
| * ] | |||||
| */ | |||||
| project.ext.react = [ | |||||
| entryFile: "index.js" | |||||
| ] | |||||
| apply from: "../../node_modules/react-native/react.gradle" | |||||
| apply from: "../../node_modules/react-native-code-push/android/codepush.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 rootProject.ext.compileSdkVersion | |||||
| buildToolsVersion rootProject.ext.buildToolsVersion | |||||
| defaultConfig { | |||||
| applicationId "com.screenad" | |||||
| minSdkVersion rootProject.ext.minSdkVersion | |||||
| targetSdkVersion rootProject.ext.targetSdkVersion | |||||
| versionCode 1 | |||||
| versionName "1.0" | |||||
| } | |||||
| splits { | |||||
| abi { | |||||
| reset() | |||||
| enable enableSeparateBuildPerCPUArchitecture | |||||
| universalApk false // If true, also generate a universal APK | |||||
| include "armeabi-v7a", "x86", "arm64-v8a" | |||||
| } | |||||
| } | |||||
| 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, "arm64-v8a": 3] | |||||
| 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 { | |||||
| implementation project(':react-native-code-push') | |||||
| implementation fileTree(dir: "libs", include: ["*.jar"]) | |||||
| implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}" | |||||
| implementation "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' | |||||
| } | |||||
| @@ -0,0 +1,19 @@ | |||||
| """Helper definitions to glob .aar and .jar targets""" | |||||
| def create_aar_targets(aarfiles): | |||||
| for aarfile in aarfiles: | |||||
| name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")] | |||||
| lib_deps.append(":" + name) | |||||
| android_prebuilt_aar( | |||||
| name = name, | |||||
| aar = aarfile, | |||||
| ) | |||||
| def create_jar_targets(jarfiles): | |||||
| for jarfile in jarfiles: | |||||
| name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")] | |||||
| lib_deps.append(":" + name) | |||||
| prebuilt_jar( | |||||
| name = name, | |||||
| binary_jar = jarfile, | |||||
| ) | |||||
| @@ -0,0 +1,17 @@ | |||||
| # 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 *; | |||||
| #} | |||||
| @@ -0,0 +1,29 @@ | |||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| package="com.screenad"> | |||||
| <uses-permission android:name="android.permission.INTERNET" /> | |||||
| <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> | |||||
| <application | |||||
| android:name=".MainApplication" | |||||
| android:label="@string/app_name" | |||||
| android:icon="@mipmap/ic_launcher" | |||||
| android:roundIcon="@mipmap/ic_launcher_round" | |||||
| android:allowBackup="false" | |||||
| android:theme="@style/AppTheme"> | |||||
| <activity | |||||
| android:name=".MainActivity" | |||||
| android:screenOrientation="portrait" | |||||
| android:label="@string/app_name" | |||||
| android:configChanges="keyboard|keyboardHidden|orientation|screenSize" | |||||
| android:windowSoftInputMode="adjustResize"> | |||||
| <intent-filter> | |||||
| <action android:name="android.intent.action.MAIN" /> | |||||
| <category android:name="android.intent.category.LAUNCHER" /> | |||||
| </intent-filter> | |||||
| </activity> | |||||
| <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" /> | |||||
| </application> | |||||
| </manifest> | |||||
| @@ -0,0 +1,15 @@ | |||||
| package com.screenad; | |||||
| 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 "screenAd"; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,58 @@ | |||||
| package com.screenad; | |||||
| import android.app.Application; | |||||
| import com.facebook.react.ReactApplication; | |||||
| import com.microsoft.codepush.react.CodePush; | |||||
| 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 | |||||
| protected String getJSBundleFile() { | |||||
| return CodePush.getJSBundleFile(); | |||||
| } | |||||
| @Override | |||||
| public boolean getUseDeveloperSupport() { | |||||
| return BuildConfig.DEBUG; | |||||
| } | |||||
| @Override | |||||
| protected List<ReactPackage> getPackages() { | |||||
| return Arrays.<ReactPackage>asList( | |||||
| new MainReactPackage(), | |||||
| new CodePush( | |||||
| getResources().getString(R.string.reactNativeCodePush_androidDeploymentKey), | |||||
| getApplicationContext(), | |||||
| BuildConfig.DEBUG, | |||||
| "http://202.165.179.86:3333/" | |||||
| ) | |||||
| ); | |||||
| } | |||||
| @Override | |||||
| protected String getJSMainModuleName() { | |||||
| return "index"; | |||||
| } | |||||
| }; | |||||
| @Override | |||||
| public ReactNativeHost getReactNativeHost() { | |||||
| return mReactNativeHost; | |||||
| } | |||||
| @Override | |||||
| public void onCreate() { | |||||
| super.onCreate(); | |||||
| SoLoader.init(this, /* native exopackage */ false); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,4 @@ | |||||
| <resources> | |||||
| <string moduleConfig="true" name="reactNativeCodePush_androidDeploymentKey">9rYZYySFD0ryN5wCD9YmjJkT55Kf4ksvOXqog</string> | |||||
| <string name="app_name">screenAd</string> | |||||
| </resources> | |||||
| @@ -0,0 +1,8 @@ | |||||
| <resources> | |||||
| <!-- Base application theme. --> | |||||
| <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> | |||||
| <!-- Customize your theme here. --> | |||||
| </style> | |||||
| </resources> | |||||
| @@ -0,0 +1,39 @@ | |||||
| // Top-level build file where you can add configuration options common to all sub-projects/modules. | |||||
| buildscript { | |||||
| ext { | |||||
| buildToolsVersion = "28.0.3" | |||||
| minSdkVersion = 16 | |||||
| compileSdkVersion = 28 | |||||
| targetSdkVersion = 27 | |||||
| supportLibVersion = "28.0.0" | |||||
| } | |||||
| repositories { | |||||
| google() | |||||
| jcenter() | |||||
| } | |||||
| dependencies { | |||||
| classpath 'com.android.tools.build:gradle:3.2.1' | |||||
| // NOTE: Do not place your application dependencies here; they belong | |||||
| // in the individual module build.gradle files | |||||
| } | |||||
| } | |||||
| allprojects { | |||||
| repositories { | |||||
| mavenLocal() | |||||
| google() | |||||
| jcenter() | |||||
| maven { | |||||
| // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm | |||||
| url "$rootDir/../node_modules/react-native/android" | |||||
| } | |||||
| } | |||||
| } | |||||
| task wrapper(type: Wrapper) { | |||||
| gradleVersion = '4.7' | |||||
| distributionUrl = distributionUrl.replace("bin", "all") | |||||
| } | |||||
| @@ -0,0 +1,18 @@ | |||||
| # 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 | |||||
| @@ -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-4.7-all.zip | |||||
| @@ -0,0 +1,172 @@ | |||||
| #!/usr/bin/env sh | |||||
| ############################################################################## | |||||
| ## | |||||
| ## Gradle start up script for UN*X | |||||
| ## | |||||
| ############################################################################## | |||||
| # 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\"`/" >/dev/null | |||||
| APP_HOME="`pwd -P`" | |||||
| cd "$SAVED" >/dev/null | |||||
| APP_NAME="Gradle" | |||||
| APP_BASE_NAME=`basename "$0"` | |||||
| # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | |||||
| DEFAULT_JVM_OPTS="" | |||||
| # 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 | |||||
| nonstop=false | |||||
| case "`uname`" in | |||||
| CYGWIN* ) | |||||
| cygwin=true | |||||
| ;; | |||||
| Darwin* ) | |||||
| darwin=true | |||||
| ;; | |||||
| MINGW* ) | |||||
| msys=true | |||||
| ;; | |||||
| NONSTOP* ) | |||||
| nonstop=true | |||||
| ;; | |||||
| esac | |||||
| 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" -a "$nonstop" = "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"` | |||||
| JAVACMD=`cygpath --unix "$JAVACMD"` | |||||
| # 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 | |||||
| # Escape application args | |||||
| save () { | |||||
| for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done | |||||
| echo " " | |||||
| } | |||||
| APP_ARGS=$(save "$@") | |||||
| # Collect all arguments for the java command, following the shell quoting and substitution rules | |||||
| eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" | |||||
| # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong | |||||
| if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then | |||||
| cd "$(dirname "$0")" | |||||
| fi | |||||
| exec "$JAVACMD" "$@" | |||||
| @@ -0,0 +1,84 @@ | |||||
| @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 | |||||
| set DIRNAME=%~dp0 | |||||
| if "%DIRNAME%" == "" set DIRNAME=. | |||||
| set APP_BASE_NAME=%~n0 | |||||
| set APP_HOME=%DIRNAME% | |||||
| @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= | |||||
| @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 Windows variants | |||||
| if not "%OS%" == "Windows_NT" goto win9xME_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=%* | |||||
| :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 | |||||
| @@ -0,0 +1,8 @@ | |||||
| keystore( | |||||
| name = "debug", | |||||
| properties = "debug.keystore.properties", | |||||
| store = "debug.keystore", | |||||
| visibility = [ | |||||
| "PUBLIC", | |||||
| ], | |||||
| ) | |||||
| @@ -0,0 +1,4 @@ | |||||
| key.store=debug.keystore | |||||
| key.alias=androiddebugkey | |||||
| key.store.password=android | |||||
| key.alias.password=android | |||||
| @@ -0,0 +1,5 @@ | |||||
| rootProject.name = 'screenAd' | |||||
| include ':react-native-code-push' | |||||
| project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '..\\node_modules\\react-native-code-push\\android\\app') | |||||
| include ':app' | |||||
| @@ -0,0 +1,4 @@ | |||||
| { | |||||
| "name": "screenAd", | |||||
| "displayName": "screenAd" | |||||
| } | |||||
| @@ -0,0 +1,3 @@ | |||||
| module.exports = { | |||||
| presets: ["module:metro-react-native-babel-preset"] | |||||
| } | |||||
| @@ -0,0 +1,10 @@ | |||||
| /** | |||||
| * @format | |||||
| * @lint-ignore-every XPLATJSCOPYRIGHT1 | |||||
| */ | |||||
| import {AppRegistry} from 'react-native'; | |||||
| import App from './App'; | |||||
| import {name as appName} from './app.json'; | |||||
| AppRegistry.registerComponent(appName, () => App); | |||||
| @@ -0,0 +1,54 @@ | |||||
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||||
| <plist version="1.0"> | |||||
| <dict> | |||||
| <key>CFBundleDevelopmentRegion</key> | |||||
| <string>en</string> | |||||
| <key>CFBundleExecutable</key> | |||||
| <string>$(EXECUTABLE_NAME)</string> | |||||
| <key>CFBundleIdentifier</key> | |||||
| <string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string> | |||||
| <key>CFBundleInfoDictionaryVersion</key> | |||||
| <string>6.0</string> | |||||
| <key>CFBundleName</key> | |||||
| <string>$(PRODUCT_NAME)</string> | |||||
| <key>CFBundlePackageType</key> | |||||
| <string>APPL</string> | |||||
| <key>CFBundleShortVersionString</key> | |||||
| <string>1.0</string> | |||||
| <key>CFBundleSignature</key> | |||||
| <string>????</string> | |||||
| <key>CFBundleVersion</key> | |||||
| <string>1</string> | |||||
| <key>LSRequiresIPhoneOS</key> | |||||
| <true/> | |||||
| <key>UILaunchStoryboardName</key> | |||||
| <string>LaunchScreen</string> | |||||
| <key>UIRequiredDeviceCapabilities</key> | |||||
| <array> | |||||
| <string>armv7</string> | |||||
| </array> | |||||
| <key>UISupportedInterfaceOrientations</key> | |||||
| <array> | |||||
| <string>UIInterfaceOrientationPortrait</string> | |||||
| <string>UIInterfaceOrientationLandscapeLeft</string> | |||||
| <string>UIInterfaceOrientationLandscapeRight</string> | |||||
| </array> | |||||
| <key>UIViewControllerBasedStatusBarAppearance</key> | |||||
| <false/> | |||||
| <key>NSLocationWhenInUseUsageDescription</key> | |||||
| <string></string> | |||||
| <key>NSAppTransportSecurity</key> | |||||
| <!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ --> | |||||
| <dict> | |||||
| <key>NSExceptionDomains</key> | |||||
| <dict> | |||||
| <key>localhost</key> | |||||
| <dict> | |||||
| <key>NSExceptionAllowsInsecureHTTPLoads</key> | |||||
| <true/> | |||||
| </dict> | |||||
| </dict> | |||||
| </dict> | |||||
| </dict> | |||||
| </plist> | |||||
| @@ -0,0 +1,24 @@ | |||||
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||||
| <plist version="1.0"> | |||||
| <dict> | |||||
| <key>CFBundleDevelopmentRegion</key> | |||||
| <string>en</string> | |||||
| <key>CFBundleExecutable</key> | |||||
| <string>$(EXECUTABLE_NAME)</string> | |||||
| <key>CFBundleIdentifier</key> | |||||
| <string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string> | |||||
| <key>CFBundleInfoDictionaryVersion</key> | |||||
| <string>6.0</string> | |||||
| <key>CFBundleName</key> | |||||
| <string>$(PRODUCT_NAME)</string> | |||||
| <key>CFBundlePackageType</key> | |||||
| <string>BNDL</string> | |||||
| <key>CFBundleShortVersionString</key> | |||||
| <string>1.0</string> | |||||
| <key>CFBundleSignature</key> | |||||
| <string>????</string> | |||||
| <key>CFBundleVersion</key> | |||||
| <string>1</string> | |||||
| </dict> | |||||
| </plist> | |||||
| @@ -0,0 +1,129 @@ | |||||
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <Scheme | |||||
| LastUpgradeVersion = "0940" | |||||
| version = "1.3"> | |||||
| <BuildAction | |||||
| parallelizeBuildables = "NO" | |||||
| buildImplicitDependencies = "YES"> | |||||
| <BuildActionEntries> | |||||
| <BuildActionEntry | |||||
| buildForTesting = "YES" | |||||
| buildForRunning = "YES" | |||||
| buildForProfiling = "YES" | |||||
| buildForArchiving = "YES" | |||||
| buildForAnalyzing = "YES"> | |||||
| <BuildableReference | |||||
| BuildableIdentifier = "primary" | |||||
| BlueprintIdentifier = "2D2A28121D9B038B00D4039D" | |||||
| BuildableName = "libReact.a" | |||||
| BlueprintName = "React-tvOS" | |||||
| ReferencedContainer = "container:../node_modules/react-native/React/React.xcodeproj"> | |||||
| </BuildableReference> | |||||
| </BuildActionEntry> | |||||
| <BuildActionEntry | |||||
| buildForTesting = "YES" | |||||
| buildForRunning = "YES" | |||||
| buildForProfiling = "YES" | |||||
| buildForArchiving = "YES" | |||||
| buildForAnalyzing = "YES"> | |||||
| <BuildableReference | |||||
| BuildableIdentifier = "primary" | |||||
| BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7" | |||||
| BuildableName = "screenAd-tvOS.app" | |||||
| BlueprintName = "screenAd-tvOS" | |||||
| ReferencedContainer = "container:screenAd.xcodeproj"> | |||||
| </BuildableReference> | |||||
| </BuildActionEntry> | |||||
| <BuildActionEntry | |||||
| buildForTesting = "YES" | |||||
| buildForRunning = "YES" | |||||
| buildForProfiling = "NO" | |||||
| buildForArchiving = "NO" | |||||
| buildForAnalyzing = "YES"> | |||||
| <BuildableReference | |||||
| BuildableIdentifier = "primary" | |||||
| BlueprintIdentifier = "2D02E48F1E0B4A5D006451C7" | |||||
| BuildableName = "screenAd-tvOSTests.xctest" | |||||
| BlueprintName = "screenAd-tvOSTests" | |||||
| ReferencedContainer = "container:screenAd.xcodeproj"> | |||||
| </BuildableReference> | |||||
| </BuildActionEntry> | |||||
| </BuildActionEntries> | |||||
| </BuildAction> | |||||
| <TestAction | |||||
| buildConfiguration = "Debug" | |||||
| selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | |||||
| selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | |||||
| shouldUseLaunchSchemeArgsEnv = "YES"> | |||||
| <Testables> | |||||
| <TestableReference | |||||
| skipped = "NO"> | |||||
| <BuildableReference | |||||
| BuildableIdentifier = "primary" | |||||
| BlueprintIdentifier = "2D02E48F1E0B4A5D006451C7" | |||||
| BuildableName = "screenAd-tvOSTests.xctest" | |||||
| BlueprintName = "screenAd-tvOSTests" | |||||
| ReferencedContainer = "container:screenAd.xcodeproj"> | |||||
| </BuildableReference> | |||||
| </TestableReference> | |||||
| </Testables> | |||||
| <MacroExpansion> | |||||
| <BuildableReference | |||||
| BuildableIdentifier = "primary" | |||||
| BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7" | |||||
| BuildableName = "screenAd-tvOS.app" | |||||
| BlueprintName = "screenAd-tvOS" | |||||
| ReferencedContainer = "container:screenAd.xcodeproj"> | |||||
| </BuildableReference> | |||||
| </MacroExpansion> | |||||
| <AdditionalOptions> | |||||
| </AdditionalOptions> | |||||
| </TestAction> | |||||
| <LaunchAction | |||||
| buildConfiguration = "Debug" | |||||
| selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | |||||
| selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | |||||
| launchStyle = "0" | |||||
| useCustomWorkingDirectory = "NO" | |||||
| ignoresPersistentStateOnLaunch = "NO" | |||||
| debugDocumentVersioning = "YES" | |||||
| debugServiceExtension = "internal" | |||||
| allowLocationSimulation = "YES"> | |||||
| <BuildableProductRunnable | |||||
| runnableDebuggingMode = "0"> | |||||
| <BuildableReference | |||||
| BuildableIdentifier = "primary" | |||||
| BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7" | |||||
| BuildableName = "screenAd-tvOS.app" | |||||
| BlueprintName = "screenAd-tvOS" | |||||
| ReferencedContainer = "container:screenAd.xcodeproj"> | |||||
| </BuildableReference> | |||||
| </BuildableProductRunnable> | |||||
| <AdditionalOptions> | |||||
| </AdditionalOptions> | |||||
| </LaunchAction> | |||||
| <ProfileAction | |||||
| buildConfiguration = "Release" | |||||
| shouldUseLaunchSchemeArgsEnv = "YES" | |||||
| savedToolIdentifier = "" | |||||
| useCustomWorkingDirectory = "NO" | |||||
| debugDocumentVersioning = "YES"> | |||||
| <BuildableProductRunnable | |||||
| runnableDebuggingMode = "0"> | |||||
| <BuildableReference | |||||
| BuildableIdentifier = "primary" | |||||
| BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7" | |||||
| BuildableName = "screenAd-tvOS.app" | |||||
| BlueprintName = "screenAd-tvOS" | |||||
| ReferencedContainer = "container:screenAd.xcodeproj"> | |||||
| </BuildableReference> | |||||
| </BuildableProductRunnable> | |||||
| </ProfileAction> | |||||
| <AnalyzeAction | |||||
| buildConfiguration = "Debug"> | |||||
| </AnalyzeAction> | |||||
| <ArchiveAction | |||||
| buildConfiguration = "Release" | |||||
| revealArchiveInOrganizer = "YES"> | |||||
| </ArchiveAction> | |||||
| </Scheme> | |||||
| @@ -0,0 +1,129 @@ | |||||
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <Scheme | |||||
| LastUpgradeVersion = "0940" | |||||
| version = "1.3"> | |||||
| <BuildAction | |||||
| parallelizeBuildables = "NO" | |||||
| buildImplicitDependencies = "YES"> | |||||
| <BuildActionEntries> | |||||
| <BuildActionEntry | |||||
| buildForTesting = "YES" | |||||
| buildForRunning = "YES" | |||||
| buildForProfiling = "YES" | |||||
| buildForArchiving = "YES" | |||||
| buildForAnalyzing = "YES"> | |||||
| <BuildableReference | |||||
| BuildableIdentifier = "primary" | |||||
| BlueprintIdentifier = "83CBBA2D1A601D0E00E9B192" | |||||
| BuildableName = "libReact.a" | |||||
| BlueprintName = "React" | |||||
| ReferencedContainer = "container:../node_modules/react-native/React/React.xcodeproj"> | |||||
| </BuildableReference> | |||||
| </BuildActionEntry> | |||||
| <BuildActionEntry | |||||
| buildForTesting = "YES" | |||||
| buildForRunning = "YES" | |||||
| buildForProfiling = "YES" | |||||
| buildForArchiving = "YES" | |||||
| buildForAnalyzing = "YES"> | |||||
| <BuildableReference | |||||
| BuildableIdentifier = "primary" | |||||
| BlueprintIdentifier = "13B07F861A680F5B00A75B9A" | |||||
| BuildableName = "screenAd.app" | |||||
| BlueprintName = "screenAd" | |||||
| ReferencedContainer = "container:screenAd.xcodeproj"> | |||||
| </BuildableReference> | |||||
| </BuildActionEntry> | |||||
| <BuildActionEntry | |||||
| buildForTesting = "YES" | |||||
| buildForRunning = "YES" | |||||
| buildForProfiling = "NO" | |||||
| buildForArchiving = "NO" | |||||
| buildForAnalyzing = "YES"> | |||||
| <BuildableReference | |||||
| BuildableIdentifier = "primary" | |||||
| BlueprintIdentifier = "00E356ED1AD99517003FC87E" | |||||
| BuildableName = "screenAdTests.xctest" | |||||
| BlueprintName = "screenAdTests" | |||||
| ReferencedContainer = "container:screenAd.xcodeproj"> | |||||
| </BuildableReference> | |||||
| </BuildActionEntry> | |||||
| </BuildActionEntries> | |||||
| </BuildAction> | |||||
| <TestAction | |||||
| buildConfiguration = "Debug" | |||||
| selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | |||||
| selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | |||||
| shouldUseLaunchSchemeArgsEnv = "YES"> | |||||
| <Testables> | |||||
| <TestableReference | |||||
| skipped = "NO"> | |||||
| <BuildableReference | |||||
| BuildableIdentifier = "primary" | |||||
| BlueprintIdentifier = "00E356ED1AD99517003FC87E" | |||||
| BuildableName = "screenAdTests.xctest" | |||||
| BlueprintName = "screenAdTests" | |||||
| ReferencedContainer = "container:screenAd.xcodeproj"> | |||||
| </BuildableReference> | |||||
| </TestableReference> | |||||
| </Testables> | |||||
| <MacroExpansion> | |||||
| <BuildableReference | |||||
| BuildableIdentifier = "primary" | |||||
| BlueprintIdentifier = "13B07F861A680F5B00A75B9A" | |||||
| BuildableName = "screenAd.app" | |||||
| BlueprintName = "screenAd" | |||||
| ReferencedContainer = "container:screenAd.xcodeproj"> | |||||
| </BuildableReference> | |||||
| </MacroExpansion> | |||||
| <AdditionalOptions> | |||||
| </AdditionalOptions> | |||||
| </TestAction> | |||||
| <LaunchAction | |||||
| buildConfiguration = "Debug" | |||||
| selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | |||||
| selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | |||||
| launchStyle = "0" | |||||
| useCustomWorkingDirectory = "NO" | |||||
| ignoresPersistentStateOnLaunch = "NO" | |||||
| debugDocumentVersioning = "YES" | |||||
| debugServiceExtension = "internal" | |||||
| allowLocationSimulation = "YES"> | |||||
| <BuildableProductRunnable | |||||
| runnableDebuggingMode = "0"> | |||||
| <BuildableReference | |||||
| BuildableIdentifier = "primary" | |||||
| BlueprintIdentifier = "13B07F861A680F5B00A75B9A" | |||||
| BuildableName = "screenAd.app" | |||||
| BlueprintName = "screenAd" | |||||
| ReferencedContainer = "container:screenAd.xcodeproj"> | |||||
| </BuildableReference> | |||||
| </BuildableProductRunnable> | |||||
| <AdditionalOptions> | |||||
| </AdditionalOptions> | |||||
| </LaunchAction> | |||||
| <ProfileAction | |||||
| buildConfiguration = "Release" | |||||
| shouldUseLaunchSchemeArgsEnv = "YES" | |||||
| savedToolIdentifier = "" | |||||
| useCustomWorkingDirectory = "NO" | |||||
| debugDocumentVersioning = "YES"> | |||||
| <BuildableProductRunnable | |||||
| runnableDebuggingMode = "0"> | |||||
| <BuildableReference | |||||
| BuildableIdentifier = "primary" | |||||
| BlueprintIdentifier = "13B07F861A680F5B00A75B9A" | |||||
| BuildableName = "screenAd.app" | |||||
| BlueprintName = "screenAd" | |||||
| ReferencedContainer = "container:screenAd.xcodeproj"> | |||||
| </BuildableReference> | |||||
| </BuildableProductRunnable> | |||||
| </ProfileAction> | |||||
| <AnalyzeAction | |||||
| buildConfiguration = "Debug"> | |||||
| </AnalyzeAction> | |||||
| <ArchiveAction | |||||
| buildConfiguration = "Release" | |||||
| revealArchiveInOrganizer = "YES"> | |||||
| </ArchiveAction> | |||||
| </Scheme> | |||||
| @@ -0,0 +1,14 @@ | |||||
| /** | |||||
| * Copyright (c) Facebook, Inc. and its affiliates. | |||||
| * | |||||
| * This source code is licensed under the MIT license found in the | |||||
| * LICENSE file in the root directory of this source tree. | |||||
| */ | |||||
| #import <UIKit/UIKit.h> | |||||
| @interface AppDelegate : UIResponder <UIApplicationDelegate> | |||||
| @property (nonatomic, strong) UIWindow *window; | |||||
| @end | |||||
| @@ -0,0 +1,41 @@ | |||||
| /** | |||||
| * Copyright (c) Facebook, Inc. and its affiliates. | |||||
| * | |||||
| * This source code is licensed under the MIT license found in the | |||||
| * LICENSE file in the root directory of this source tree. | |||||
| */ | |||||
| #import "AppDelegate.h" | |||||
| #import <CodePush/CodePush.h> | |||||
| #import <React/RCTBundleURLProvider.h> | |||||
| #import <React/RCTRootView.h> | |||||
| @implementation AppDelegate | |||||
| - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions | |||||
| { | |||||
| NSURL *jsCodeLocation; | |||||
| #ifdef DEBUG | |||||
| jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; | |||||
| #else | |||||
| jsCodeLocation = [CodePush bundleURL]; | |||||
| #endif | |||||
| RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation | |||||
| moduleName:@"screenAd" | |||||
| initialProperties:nil | |||||
| launchOptions:launchOptions]; | |||||
| rootView.backgroundColor = [UIColor blackColor]; | |||||
| self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; | |||||
| UIViewController *rootViewController = [UIViewController new]; | |||||
| rootViewController.view = rootView; | |||||
| self.window.rootViewController = rootViewController; | |||||
| [self.window makeKeyAndVisible]; | |||||
| return YES; | |||||
| } | |||||
| @end | |||||
| @@ -0,0 +1,42 @@ | |||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES"> | |||||
| <dependencies> | |||||
| <deployment identifier="iOS"/> | |||||
| <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/> | |||||
| <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/> | |||||
| </dependencies> | |||||
| <objects> | |||||
| <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> | |||||
| <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> | |||||
| <view contentMode="scaleToFill" id="iN0-l3-epB"> | |||||
| <rect key="frame" x="0.0" y="0.0" width="480" height="480"/> | |||||
| <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | |||||
| <subviews> | |||||
| <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Powered by React Native" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye"> | |||||
| <rect key="frame" x="20" y="439" width="441" height="21"/> | |||||
| <fontDescription key="fontDescription" type="system" pointSize="17"/> | |||||
| <color key="textColor" cocoaTouchSystemColor="darkTextColor"/> | |||||
| <nil key="highlightedColor"/> | |||||
| </label> | |||||
| <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="screenAd" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX"> | |||||
| <rect key="frame" x="20" y="140" width="441" height="43"/> | |||||
| <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/> | |||||
| <color key="textColor" cocoaTouchSystemColor="darkTextColor"/> | |||||
| <nil key="highlightedColor"/> | |||||
| </label> | |||||
| </subviews> | |||||
| <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> | |||||
| <constraints> | |||||
| <constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/> | |||||
| <constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/> | |||||
| <constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/> | |||||
| <constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/> | |||||
| <constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/> | |||||
| <constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/> | |||||
| </constraints> | |||||
| <nil key="simulatedStatusBarMetrics"/> | |||||
| <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/> | |||||
| <point key="canvasLocation" x="548" y="455"/> | |||||
| </view> | |||||
| </objects> | |||||
| </document> | |||||
| @@ -0,0 +1,38 @@ | |||||
| { | |||||
| "images" : [ | |||||
| { | |||||
| "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" | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| { | |||||
| "info" : { | |||||
| "version" : 1, | |||||
| "author" : "xcode" | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,59 @@ | |||||
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||||
| <plist version="1.0"> | |||||
| <dict> | |||||
| <key>CFBundleDevelopmentRegion</key> | |||||
| <string>en</string> | |||||
| <key>CFBundleDisplayName</key> | |||||
| <string>screenAd</string> | |||||
| <key>CFBundleExecutable</key> | |||||
| <string>$(EXECUTABLE_NAME)</string> | |||||
| <key>CFBundleIdentifier</key> | |||||
| <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | |||||
| <key>CFBundleInfoDictionaryVersion</key> | |||||
| <string>6.0</string> | |||||
| <key>CFBundleName</key> | |||||
| <string>$(PRODUCT_NAME)</string> | |||||
| <key>CFBundlePackageType</key> | |||||
| <string>APPL</string> | |||||
| <key>CFBundleShortVersionString</key> | |||||
| <string>1.0</string> | |||||
| <key>CFBundleSignature</key> | |||||
| <string>????</string> | |||||
| <key>CFBundleVersion</key> | |||||
| <string>1</string> | |||||
| <key>LSRequiresIPhoneOS</key> | |||||
| <true/> | |||||
| <key>NSLocationWhenInUseUsageDescription</key> | |||||
| <string/> | |||||
| <key>UILaunchStoryboardName</key> | |||||
| <string>LaunchScreen</string> | |||||
| <key>UIRequiredDeviceCapabilities</key> | |||||
| <array> | |||||
| <string>armv7</string> | |||||
| </array> | |||||
| <key>UISupportedInterfaceOrientations</key> | |||||
| <array> | |||||
| <string>UIInterfaceOrientationPortrait</string> | |||||
| <string>UIInterfaceOrientationLandscapeLeft</string> | |||||
| <string>UIInterfaceOrientationLandscapeRight</string> | |||||
| </array> | |||||
| <key>UIViewControllerBasedStatusBarAppearance</key> | |||||
| <false/> | |||||
| <key>NSAppTransportSecurity</key> | |||||
| <dict> | |||||
| <key>NSAllowsArbitraryLoads</key> | |||||
| <true/> | |||||
| <key>NSExceptionDomains</key> | |||||
| <dict> | |||||
| <key>localhost</key> | |||||
| <dict> | |||||
| <key>NSExceptionAllowsInsecureHTTPLoads</key> | |||||
| <true/> | |||||
| </dict> | |||||
| </dict> | |||||
| </dict> | |||||
| <key>CodePushDeploymentKey</key> | |||||
| <string>deployment-key-here</string> | |||||
| </dict> | |||||
| </plist> | |||||
| @@ -0,0 +1,16 @@ | |||||
| /** | |||||
| * Copyright (c) Facebook, Inc. and its affiliates. | |||||
| * | |||||
| * This source code is licensed under the MIT license found in the | |||||
| * LICENSE file in the root directory of this source tree. | |||||
| */ | |||||
| #import <UIKit/UIKit.h> | |||||
| #import "AppDelegate.h" | |||||
| int main(int argc, char * argv[]) { | |||||
| @autoreleasepool { | |||||
| return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||||
| <plist version="1.0"> | |||||
| <dict> | |||||
| <key>CFBundleDevelopmentRegion</key> | |||||
| <string>en</string> | |||||
| <key>CFBundleExecutable</key> | |||||
| <string>$(EXECUTABLE_NAME)</string> | |||||
| <key>CFBundleIdentifier</key> | |||||
| <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | |||||
| <key>CFBundleInfoDictionaryVersion</key> | |||||
| <string>6.0</string> | |||||
| <key>CFBundleName</key> | |||||
| <string>$(PRODUCT_NAME)</string> | |||||
| <key>CFBundlePackageType</key> | |||||
| <string>BNDL</string> | |||||
| <key>CFBundleShortVersionString</key> | |||||
| <string>1.0</string> | |||||
| <key>CFBundleSignature</key> | |||||
| <string>????</string> | |||||
| <key>CFBundleVersion</key> | |||||
| <string>1</string> | |||||
| </dict> | |||||
| </plist> | |||||
| @@ -0,0 +1,68 @@ | |||||
| /** | |||||
| * Copyright (c) Facebook, Inc. and its affiliates. | |||||
| * | |||||
| * This source code is licensed under the MIT license found in the | |||||
| * LICENSE file in the root directory of this source tree. | |||||
| */ | |||||
| #import <UIKit/UIKit.h> | |||||
| #import <XCTest/XCTest.h> | |||||
| #import <React/RCTLog.h> | |||||
| #import <React/RCTRootView.h> | |||||
| #define TIMEOUT_SECONDS 600 | |||||
| #define TEXT_TO_LOOK_FOR @"Welcome to React Native!" | |||||
| @interface screenAdTests : XCTestCase | |||||
| @end | |||||
| @implementation screenAdTests | |||||
| - (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 | |||||
| @@ -0,0 +1,25 @@ | |||||
| { | |||||
| "name": "screenAd", | |||||
| "version": "0.0.1", | |||||
| "private": true, | |||||
| "scripts": { | |||||
| "start": "node node_modules/react-native/local-cli/cli.js start", | |||||
| "test": "jest" | |||||
| }, | |||||
| "dependencies": { | |||||
| "react": "16.6.3", | |||||
| "react-native": "0.58.4", | |||||
| "react-native-code-push": "^5.5.2", | |||||
| "react-native-swiper": "^1.5.14" | |||||
| }, | |||||
| "devDependencies": { | |||||
| "babel-core": "7.0.0-bridge.0", | |||||
| "babel-jest": "24.1.0", | |||||
| "jest": "24.1.0", | |||||
| "metro-react-native-babel-preset": "0.51.1", | |||||
| "react-test-renderer": "16.6.3" | |||||
| }, | |||||
| "jest": { | |||||
| "preset": "react-native" | |||||
| } | |||||
| } | |||||