├── .DS_Store ├── .gitignore ├── README.MD └── source_code ├── .babelrc ├── .buckconfig ├── .flowconfig ├── .gitattributes ├── .watchmanconfig ├── README-Changelog.md ├── README.md ├── __tests__ ├── index.android.js └── index.ios.js ├── android ├── app │ ├── BUCK │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ ├── index.android.bundle │ │ └── index.android.bundle.meta │ │ ├── java │ │ └── com │ │ │ └── haha │ │ │ ├── MainActivity.java │ │ │ └── MainApplication.java │ │ └── res │ │ ├── drawable-hdpi │ │ └── node_modules_reactnavigation_src_views_assets_backicon.png │ │ ├── drawable-mdpi │ │ └── node_modules_reactnavigation_src_views_assets_backicon.png │ │ ├── drawable-xhdpi │ │ └── node_modules_reactnavigation_src_views_assets_backicon.png │ │ ├── drawable-xxhdpi │ │ └── node_modules_reactnavigation_src_views_assets_backicon.png │ │ ├── drawable-xxxhdpi │ │ └── node_modules_reactnavigation_src_views_assets_backicon.png │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher2222.png │ │ └── values │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── keystores │ ├── BUCK │ └── debug.keystore.properties └── settings.gradle ├── app.json ├── assets ├── newest.png ├── question.png └── serie.png ├── bundle ├── main.jsbundle └── main.jsbundle.meta ├── img ├── cc-bg-dark.jpg ├── main.png ├── s.png └── sina.png ├── index.android.js ├── ios ├── haha-tvOS │ └── Info.plist ├── haha-tvOSTests │ └── Info.plist ├── haha.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ ├── haha-tvOS.xcscheme │ │ └── haha.xcscheme ├── haha │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Base.lproj │ │ └── LaunchScreen.xib │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ └── main.m └── hahaTests │ ├── Info.plist │ └── hahaTests.m ├── package-lock.json ├── package.json ├── src ├── AboutScreen.js ├── Api.js ├── CategoryListScreen.js ├── CategoryScreen.js ├── CrashCourseDrawer.js ├── HomeScreen.js ├── NoteScreen.js ├── TestScreen.js └── VideoScreen.js └── unrelated-stuff ├── cc-logo.png ├── side.jpg ├── ss.png ├── tab1.jpg └── tab2.jpg /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | project.xcworkspace 24 | 25 | # Android/IntelliJ 26 | # 27 | build/ 28 | .idea 29 | .gradle 30 | local.properties 31 | *.iml 32 | 33 | # node.js 34 | # 35 | node_modules/ 36 | npm-debug.log 37 | yarn-error.log 38 | 39 | # BUCK 40 | buck-out/ 41 | \.buckd/ 42 | *.keystore 43 | 44 | # fastlane 45 | # 46 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 47 | # screenshots whenever they are needed. 48 | # For more information about the recommended setup visit: 49 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 50 | 51 | fastlane/report.xml 52 | fastlane/Preview.html 53 | fastlane/screenshots 54 | -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | ## 应用名称:CC 速成班 2 | CC 是 Crash Course 的缩写。是 Youtube 上的一个教育类频道。 3 | 4 | ### 介绍 5 | 这是个安卓 App 6 | App 打开是有中文字幕的 Crash Course 视频 (字幕组自己维护 App 内容) 7 | 点击会跳转到B站, 推荐同时安装B站的 App 搭配使用。 8 | 9 | ### 下载地址 10 | * Android: [酷安应用市场](https://www.coolapk.com/apk/147390) 11 | * iOS: [无法过审](https://github.com/1c7/CrashCourse-iOS-App) 12 | 13 | ### 应用截图1 14 | 15 | 16 | ### 应用截图2 17 | 18 | 19 | ### 视频演示 20 | https://www.bilibili.com/video/av13236166/ -------------------------------------------------------------------------------- /source_code/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react-native"], 3 | "plugins": ["@babel/plugin-proposal-nullish-coalescing-operator", "@babel/plugin-proposal-optional-chaining"] 4 | } 5 | -------------------------------------------------------------------------------- /source_code/.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /source_code/.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | ; We fork some components by platform 3 | .*/*[.]android.js 4 | 5 | ; Ignore "BUCK" generated dirs 6 | /\.buckd/ 7 | 8 | ; Ignore unexpected extra "@providesModule" 9 | .*/node_modules/.*/node_modules/fbjs/.* 10 | 11 | ; Ignore duplicate module providers 12 | ; For RN Apps installed via npm, "Libraries" folder is inside 13 | ; "node_modules/react-native" but in the source repo it is in the root 14 | .*/Libraries/react-native/React.js 15 | .*/Libraries/react-native/ReactNative.js 16 | 17 | [include] 18 | 19 | [libs] 20 | node_modules/react-native/Libraries/react-native/react-native-interface.js 21 | node_modules/react-native/flow 22 | flow/ 23 | 24 | [options] 25 | emoji=true 26 | 27 | module.system=haste 28 | 29 | experimental.strict_type_args=true 30 | 31 | munge_underscores=true 32 | 33 | 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' 34 | 35 | suppress_type=$FlowIssue 36 | suppress_type=$FlowFixMe 37 | suppress_type=$FixMe 38 | 39 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(4[0-5]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) 40 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(4[0-5]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ 41 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy 42 | suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError 43 | 44 | unsafe.enable_getters_and_setters=true 45 | 46 | [version] 47 | ^0.45.0 48 | -------------------------------------------------------------------------------- /source_code/.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | -------------------------------------------------------------------------------- /source_code/.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /source_code/README-Changelog.md: -------------------------------------------------------------------------------- 1 | # 更新日志 2 | 3 | ## 2019-6-7 4 | 更新原因: App 不可用, 打开无法加载数据 5 | 问题原因: API 域名。crashcourse.myherego.com 因为我离职所以无法使用了,现在用了 api.crashcourse.club 6 | 解决: 7 | 1. React Native 版本升: 0.44 到 0.59 8 | 2. Android Studio 3.4.1 根据报错,清理了一些配置,能成功 Sync 9 | 3. react navigation 从 1.0.0-beta11 更新到 3.0, 有 break changes. 大改了 `index.android.js` 的代码 10 | 4. `` 里面不能包含 children, 换成 `` 就可以了 11 | 12 | 额外补充: 13 | 原本今天 2019-6-7 打算继续找工作, 但是突发了这个事情(App 打不开). 14 | 这个总得修, 也不能不修或者推给别人修, 15 | 开始时间: 下午1点 16 | 预计结束时间: 下午2点前结束 17 | 实际结束时间: 晚上7点20分. 主要是装 Android Studio 和 SDK 花了不少时间, 18 | 跑起来还碰到了各种问题, 光是为了跑起来就弄到了 4,5 点. 19 | 打包提交到酷安就晚上7点20了,一天就砸在这玩意上了, 略有不满 20 | -------------------------------------------------------------------------------- /source_code/README.md: -------------------------------------------------------------------------------- 1 | ## 文档第二部分 2 | Crash Course 字幕组 Q 群:305631757 3 | 4 | [字幕组微博](http://weibo.com/5237129097/profile?rightmod=1&wvr=6&mod=personnumber&is_all=1) 5 | 6 | 7 | ### 技术 8 | * App:React Native 0.59 (React Navigation 3.0) 9 | * 后端:Ruby on Rails 5 10 | * 服务器:感谢 @coolralf 提供服务器 11 | 12 | 注:这里的代码和上架的 App 完全一致,无删减 13 | (唯一的例外是去掉了 keystore,打包要用的证书不开源) 14 | 15 | ### 本地运行 16 | 先安装基本的 npm 模块(包括 React Native) 17 | ``` 18 | git clone https://github.com/1c7/CrashCourse-Android-App.git 19 | cd CrashCourse-Android-App/SourceCode/ 20 | npm install 21 | # 在 Android Studio 里打开一个手机模拟器,然后运行: 22 | react-native run-android 23 | ``` 24 | 25 | ## 每次更新 App 版本时: 26 | #### 第一步:Android 写新的版本数 27 | https://stackoverflow.com/questions/35924721/how-to-update-version-number-of-react-native-app 28 | 29 | You should be changing your versionCode and versionName in android/app/build.gradle: 30 | ``` 31 | android { 32 | 33 | defaultConfig { 34 | 35 | versionCode 1 36 | versionName "1.0" 37 | 38 | {...} 39 | } 40 | 41 | {...} 42 | } 43 | ``` 44 | 45 | #### 第二步:Android 打包 46 | https://facebook.github.io/react-native/docs/signed-apk-android.html 47 | 第一次打包和之后再打包不一样(可以省略一些配置,因为第一次已经配置了) 48 | 现在打包是这样的: 49 | 50 | 1. 弄一个安卓证书, 我的叫 cc.keystore 51 | 2. 把 cc.keystore 文件放进 项目/android/app/ 文件夹 52 | 3. 运行 `cd android && ./gradlew assembleRelease` 53 | 4. 生成的文件在: `android/app/build/outputs/apk/app-release.apk` 54 | 55 | 56 | #### 文章介绍(知乎专栏) 57 | [https://zhuanlan.zhihu.com/p/27804727](https://zhuanlan.zhihu.com/p/27804727) 58 | 59 | ### 可以改进的地方(欢迎提交 PR) 60 | 1. 图片加载时提供一个占位符/动画/进度条。而不是一直白色 61 | 2. 顶部下拉刷新   62 | 4. 捐款二维码放到侧边栏底部,点击就保存到相册里,而不是现在深深的藏在说明里,差不多要滚动到正中央才看得到 63 | 5. 加一些动画效果? 64 | 65 | 参与方式:   66 | 在这里开个 issue 表达你有兴趣,然后大概要做什么,改进哪些地方,等等   67 | 68 | ### App 上架地点 69 | **只上线了酷安** 70 | 豌豆荚,小米,百度,比较烦就没上。 71 | 腾讯应用宝拒了,所以也没上。 72 | 73 | -------------------------------------------------------------------------------- /source_code/__tests__/index.android.js: -------------------------------------------------------------------------------- 1 | import 'react-native'; 2 | import React from 'react'; 3 | import Index from '../index.android.js'; 4 | 5 | // Note: test renderer must be required after react-native. 6 | import renderer from 'react-test-renderer'; 7 | 8 | it('renders correctly', () => { 9 | const tree = renderer.create( 10 | 11 | ); 12 | }); 13 | -------------------------------------------------------------------------------- /source_code/__tests__/index.ios.js: -------------------------------------------------------------------------------- 1 | import 'react-native'; 2 | import React from 'react'; 3 | import Index from '../index.ios.js'; 4 | 5 | // Note: test renderer must be required after react-native. 6 | import renderer from 'react-test-renderer'; 7 | 8 | it('renders correctly', () => { 9 | const tree = renderer.create( 10 | 11 | ); 12 | }); 13 | -------------------------------------------------------------------------------- /source_code/android/app/BUCK: -------------------------------------------------------------------------------- 1 | # To learn about Buck see [Docs](https://buckbuild.com/). 2 | # To run your application with Buck: 3 | # - install Buck 4 | # - `npm start` - to start the packager 5 | # - `cd android` 6 | # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` 7 | # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck 8 | # - `buck install -r android/app` - compile, install and run application 9 | # 10 | 11 | lib_deps = [] 12 | 13 | for jarfile in glob(['libs/*.jar']): 14 | name = 'jars__' + jarfile[jarfile.rindex('/') + 1: jarfile.rindex('.jar')] 15 | lib_deps.append(':' + name) 16 | prebuilt_jar( 17 | name = name, 18 | binary_jar = jarfile, 19 | ) 20 | 21 | for aarfile in glob(['libs/*.aar']): 22 | name = 'aars__' + aarfile[aarfile.rindex('/') + 1: aarfile.rindex('.aar')] 23 | lib_deps.append(':' + name) 24 | android_prebuilt_aar( 25 | name = name, 26 | aar = aarfile, 27 | ) 28 | 29 | android_library( 30 | name = "all-libs", 31 | exported_deps = lib_deps, 32 | ) 33 | 34 | android_library( 35 | name = "app-code", 36 | srcs = glob([ 37 | "src/main/java/**/*.java", 38 | ]), 39 | deps = [ 40 | ":all-libs", 41 | ":build_config", 42 | ":res", 43 | ], 44 | ) 45 | 46 | android_build_config( 47 | name = "build_config", 48 | package = "com.haha", 49 | ) 50 | 51 | android_resource( 52 | name = "res", 53 | package = "com.haha", 54 | res = "src/main/res", 55 | ) 56 | 57 | android_binary( 58 | name = "app", 59 | keystore = "//android/keystores:debug", 60 | manifest = "src/main/AndroidManifest.xml", 61 | package_type = "debug", 62 | deps = [ 63 | ":app-code", 64 | ], 65 | ) 66 | -------------------------------------------------------------------------------- /source_code/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "com.android.application" 2 | 3 | import com.android.build.OutputFile 4 | 5 | /** 6 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets 7 | * and bundleReleaseJsAndAssets). 8 | * These basically call `react-native bundle` with the correct arguments during the Android build 9 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the 10 | * bundle directly from the development server. Below you can see all the possible configurations 11 | * and their defaults. If you decide to add a configuration block, make sure to add it before the 12 | * `apply from: "../../node_modules/react-native/react.gradle"` line. 13 | * 14 | * project.ext.react = [ 15 | * // the name of the generated asset file containing your JS bundle 16 | * bundleAssetName: "index.android.bundle", 17 | * 18 | * // the entry file for bundle generation 19 | * entryFile: "index.android.js", 20 | * 21 | * // whether to bundle JS and assets in debug mode 22 | * bundleInDebug: false, 23 | * 24 | * // whether to bundle JS and assets in release mode 25 | * bundleInRelease: true, 26 | * 27 | * // whether to bundle JS and assets in another build variant (if configured). 28 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants 29 | * // The configuration property can be in the following formats 30 | * // 'bundleIn${productFlavor}${buildType}' 31 | * // 'bundleIn${buildType}' 32 | * // bundleInFreeDebug: true, 33 | * // bundleInPaidRelease: true, 34 | * // bundleInBeta: true, 35 | * 36 | * // whether to disable dev mode in custom build variants (by default only disabled in release) 37 | * // for example: to disable dev mode in the staging build type (if configured) 38 | * devDisabledInStaging: true, 39 | * // The configuration property can be in the following formats 40 | * // 'devDisabledIn${productFlavor}${buildType}' 41 | * // 'devDisabledIn${buildType}' 42 | * 43 | * // the root of your project, i.e. where "package.json" lives 44 | * root: "../../", 45 | * 46 | * // where to put the JS bundle asset in debug mode 47 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", 48 | * 49 | * // where to put the JS bundle asset in release mode 50 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release", 51 | * 52 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 53 | * // require('./image.png')), in debug mode 54 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", 55 | * 56 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 57 | * // require('./image.png')), in release mode 58 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", 59 | * 60 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means 61 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to 62 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle 63 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ 64 | * // for example, you might want to remove it from here. 65 | * inputExcludes: ["android/**", "ios/**"], 66 | * 67 | * // override which node gets called and with what additional arguments 68 | * nodeExecutableAndArgs: ["node"], 69 | * 70 | * // supply additional arguments to the packager 71 | * extraPackagerArgs: [] 72 | * ] 73 | */ 74 | 75 | apply from: "../../node_modules/react-native/react.gradle" 76 | 77 | /** 78 | * Set this to true to create two separate APKs instead of one: 79 | * - An APK that only works on ARM devices 80 | * - An APK that only works on x86 devices 81 | * The advantage is the size of the APK is reduced by about 4MB. 82 | * Upload all the APKs to the Play Store and people will download 83 | * the correct one based on the CPU architecture of their device. 84 | */ 85 | def enableSeparateBuildPerCPUArchitecture = false 86 | 87 | /** 88 | * Run Proguard to shrink the Java bytecode in release builds. 89 | */ 90 | def enableProguardInReleaseBuilds = false 91 | 92 | android { 93 | compileSdkVersion 28 94 | buildToolsVersion '28.0.3' 95 | 96 | defaultConfig { 97 | applicationId "com.crashcourse.china.c17" 98 | minSdkVersion 16 99 | targetSdkVersion 28 100 | versionCode 6 101 | versionName "1.7" 102 | ndk { 103 | abiFilters "armeabi-v7a", "x86" 104 | } 105 | } 106 | signingConfigs { 107 | release { 108 | if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) { 109 | storeFile file(MYAPP_RELEASE_STORE_FILE) 110 | storePassword MYAPP_RELEASE_STORE_PASSWORD 111 | keyAlias MYAPP_RELEASE_KEY_ALIAS 112 | keyPassword MYAPP_RELEASE_KEY_PASSWORD 113 | } 114 | } 115 | } 116 | splits { 117 | abi { 118 | reset() 119 | enable enableSeparateBuildPerCPUArchitecture 120 | universalApk false // If true, also generate a universal APK 121 | include "armeabi-v7a", "x86" 122 | } 123 | } 124 | buildTypes { 125 | release { 126 | minifyEnabled enableProguardInReleaseBuilds 127 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 128 | signingConfig signingConfigs.release 129 | } 130 | } 131 | // applicationVariants are e.g. debug, release 132 | applicationVariants.all { variant -> 133 | variant.outputs.each { output -> 134 | // For each separate APK per architecture, set a unique version code as described here: 135 | // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits 136 | def versionCodes = ["armeabi-v7a":1, "x86":2] 137 | def abi = output.getFilter(OutputFile.ABI) 138 | if (abi != null) { // null for the universal-debug, universal-release variants 139 | output.versionCodeOverride = 140 | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode 141 | } 142 | } 143 | } 144 | } 145 | 146 | dependencies { 147 | implementation project(':react-native-gesture-handler') 148 | implementation fileTree(dir: "libs", include: ["*.jar"]) 149 | implementation "com.android.support:appcompat-v7:26.1.0" 150 | implementation "com.facebook.react:react-native:+" // From node_modules 151 | } 152 | 153 | // Run this once to be able to run the application with BUCK 154 | // puts all compile dependencies into folder libs for BUCK to use 155 | task copyDownloadableDepsToLibs(type: Copy) { 156 | from configurations.compile 157 | into 'libs' 158 | } 159 | -------------------------------------------------------------------------------- /source_code/android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Disabling obfuscation is useful if you collect stack traces from production crashes 20 | # (unless you are using a system that supports de-obfuscate the stack traces). 21 | -dontobfuscate 22 | 23 | # React Native 24 | 25 | # Keep our interfaces so they can be used by other ProGuard rules. 26 | # See http://sourceforge.net/p/proguard/bugs/466/ 27 | -keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip 28 | -keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters 29 | -keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip 30 | 31 | # Do not strip any method/class that is annotated with @DoNotStrip 32 | -keep @com.facebook.proguard.annotations.DoNotStrip class * 33 | -keep @com.facebook.common.internal.DoNotStrip class * 34 | -keepclassmembers class * { 35 | @com.facebook.proguard.annotations.DoNotStrip *; 36 | @com.facebook.common.internal.DoNotStrip *; 37 | } 38 | 39 | -keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * { 40 | void set*(***); 41 | *** get*(); 42 | } 43 | 44 | -keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } 45 | -keep class * extends com.facebook.react.bridge.NativeModule { *; } 46 | -keepclassmembers,includedescriptorclasses class * { native ; } 47 | -keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; } 48 | -keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; } 49 | -keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; } 50 | 51 | -dontwarn com.facebook.react.** 52 | 53 | # TextLayoutBuilder uses a non-public Android constructor within StaticLayout. 54 | # See libs/proxy/src/main/java/com/facebook/fbui/textlayoutbuilder/proxy for details. 55 | -dontwarn android.text.StaticLayout 56 | 57 | # okhttp 58 | 59 | -keepattributes Signature 60 | -keepattributes *Annotation* 61 | -keep class okhttp3.** { *; } 62 | -keep interface okhttp3.** { *; } 63 | -dontwarn okhttp3.** 64 | 65 | # okio 66 | 67 | -keep class sun.misc.Unsafe { *; } 68 | -dontwarn java.nio.file.* 69 | -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 70 | -dontwarn okio.** 71 | -------------------------------------------------------------------------------- /source_code/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 16 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /source_code/android/app/src/main/assets/index.android.bundle.meta: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/android/app/src/main/assets/index.android.bundle.meta -------------------------------------------------------------------------------- /source_code/android/app/src/main/java/com/haha/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.crashcourse.china.c17; 2 | 3 | import com.facebook.react.ReactActivity; 4 | 5 | public class MainActivity extends ReactActivity { 6 | 7 | /** 8 | * Returns the name of the main component registered from JavaScript. 9 | * This is used to schedule rendering of the component. 10 | */ 11 | @Override 12 | protected String getMainComponentName() { 13 | return "haha"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /source_code/android/app/src/main/java/com/haha/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.crashcourse.china.c17; 2 | 3 | 4 | import android.app.Application; 5 | 6 | import com.facebook.react.ReactApplication; 7 | import com.facebook.react.ReactNativeHost; 8 | import com.facebook.react.ReactPackage; 9 | import com.facebook.react.shell.MainReactPackage; 10 | import com.facebook.soloader.SoLoader; 11 | 12 | import java.util.Arrays; 13 | import java.util.List; 14 | import com.swmansion.gesturehandler.react.RNGestureHandlerPackage; 15 | 16 | public class MainApplication extends Application implements ReactApplication { 17 | 18 | private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { 19 | @Override 20 | public boolean getUseDeveloperSupport() { 21 | return BuildConfig.DEBUG; 22 | } 23 | 24 | @Override 25 | protected List getPackages() { 26 | return Arrays.asList( 27 | new MainReactPackage(), 28 | new RNGestureHandlerPackage() 29 | ); 30 | } 31 | }; 32 | 33 | @Override 34 | public ReactNativeHost getReactNativeHost() { 35 | return mReactNativeHost; 36 | } 37 | 38 | @Override 39 | public void onCreate() { 40 | super.onCreate(); 41 | SoLoader.init(this, /* native exopackage */ false); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /source_code/android/app/src/main/res/drawable-hdpi/node_modules_reactnavigation_src_views_assets_backicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/android/app/src/main/res/drawable-hdpi/node_modules_reactnavigation_src_views_assets_backicon.png -------------------------------------------------------------------------------- /source_code/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_src_views_assets_backicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_src_views_assets_backicon.png -------------------------------------------------------------------------------- /source_code/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_src_views_assets_backicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_src_views_assets_backicon.png -------------------------------------------------------------------------------- /source_code/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_src_views_assets_backicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_src_views_assets_backicon.png -------------------------------------------------------------------------------- /source_code/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_src_views_assets_backicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_src_views_assets_backicon.png -------------------------------------------------------------------------------- /source_code/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /source_code/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /source_code/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /source_code/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /source_code/android/app/src/main/res/mipmap-xxhdpi/ic_launcher2222.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/android/app/src/main/res/mipmap-xxhdpi/ic_launcher2222.png -------------------------------------------------------------------------------- /source_code/android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | CC 速成课 3 | 4 | -------------------------------------------------------------------------------- /source_code/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /source_code/android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | google() 7 | } 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.4.1' 10 | 11 | // NOTE: Do not place your application dependencies here; they belong 12 | // in the individual module build.gradle files 13 | } 14 | } 15 | 16 | allprojects { 17 | repositories { 18 | mavenLocal() 19 | jcenter() 20 | maven { 21 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 22 | url "$rootDir/../node_modules/react-native/android" 23 | } 24 | google() 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /source_code/android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | 20 | MYAPP_RELEASE_STORE_FILE=cc.keystore 21 | MYAPP_RELEASE_KEY_ALIAS=cc 22 | MYAPP_RELEASE_STORE_PASSWORD=thiswww 23 | MYAPP_RELEASE_KEY_PASSWORD=thiswww -------------------------------------------------------------------------------- /source_code/android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /source_code/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 07 16:08:27 CST 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip 7 | -------------------------------------------------------------------------------- /source_code/android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # For Cygwin, ensure paths are in UNIX format before anything is touched. 46 | if $cygwin ; then 47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 48 | fi 49 | 50 | # Attempt to set APP_HOME 51 | # Resolve links: $0 may be a link 52 | PRG="$0" 53 | # Need this for relative symlinks. 54 | while [ -h "$PRG" ] ; do 55 | ls=`ls -ld "$PRG"` 56 | link=`expr "$ls" : '.*-> \(.*\)$'` 57 | if expr "$link" : '/.*' > /dev/null; then 58 | PRG="$link" 59 | else 60 | PRG=`dirname "$PRG"`"/$link" 61 | fi 62 | done 63 | SAVED="`pwd`" 64 | cd "`dirname \"$PRG\"`/" >&- 65 | APP_HOME="`pwd -P`" 66 | cd "$SAVED" >&- 67 | 68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 69 | 70 | # Determine the Java command to use to start the JVM. 71 | if [ -n "$JAVA_HOME" ] ; then 72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 73 | # IBM's JDK on AIX uses strange locations for the executables 74 | JAVACMD="$JAVA_HOME/jre/sh/java" 75 | else 76 | JAVACMD="$JAVA_HOME/bin/java" 77 | fi 78 | if [ ! -x "$JAVACMD" ] ; then 79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 80 | 81 | Please set the JAVA_HOME variable in your environment to match the 82 | location of your Java installation." 83 | fi 84 | else 85 | JAVACMD="java" 86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 87 | 88 | Please set the JAVA_HOME variable in your environment to match the 89 | location of your Java installation." 90 | fi 91 | 92 | # Increase the maximum file descriptors if we can. 93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 94 | MAX_FD_LIMIT=`ulimit -H -n` 95 | if [ $? -eq 0 ] ; then 96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 97 | MAX_FD="$MAX_FD_LIMIT" 98 | fi 99 | ulimit -n $MAX_FD 100 | if [ $? -ne 0 ] ; then 101 | warn "Could not set maximum file descriptor limit: $MAX_FD" 102 | fi 103 | else 104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 105 | fi 106 | fi 107 | 108 | # For Darwin, add options to specify how the application appears in the dock 109 | if $darwin; then 110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 111 | fi 112 | 113 | # For Cygwin, switch paths to Windows format before running java 114 | if $cygwin ; then 115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 158 | function splitJvmOpts() { 159 | JVM_OPTS=("$@") 160 | } 161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 163 | 164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 165 | -------------------------------------------------------------------------------- /source_code/android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /source_code/android/keystores/BUCK: -------------------------------------------------------------------------------- 1 | keystore( 2 | name = "debug", 3 | properties = "debug.keystore.properties", 4 | store = "debug.keystore", 5 | visibility = [ 6 | "PUBLIC", 7 | ], 8 | ) 9 | -------------------------------------------------------------------------------- /source_code/android/keystores/debug.keystore.properties: -------------------------------------------------------------------------------- 1 | key.store=debug.keystore 2 | key.alias=androiddebugkey 3 | key.store.password=android 4 | key.alias.password=android 5 | -------------------------------------------------------------------------------- /source_code/android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'crashcoursechina' 2 | include ':react-native-gesture-handler' 3 | project(':react-native-gesture-handler').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-gesture-handler/android') 4 | include ':react-native-video' 5 | project(':react-native-video').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-video/android') 6 | 7 | include ':app' 8 | -------------------------------------------------------------------------------- /source_code/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "haha", 3 | "displayName": "haha" 4 | } -------------------------------------------------------------------------------- /source_code/assets/newest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/assets/newest.png -------------------------------------------------------------------------------- /source_code/assets/question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/assets/question.png -------------------------------------------------------------------------------- /source_code/assets/serie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/assets/serie.png -------------------------------------------------------------------------------- /source_code/bundle/main.jsbundle.meta: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/bundle/main.jsbundle.meta -------------------------------------------------------------------------------- /source_code/img/cc-bg-dark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/img/cc-bg-dark.jpg -------------------------------------------------------------------------------- /source_code/img/main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/img/main.png -------------------------------------------------------------------------------- /source_code/img/s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/img/s.png -------------------------------------------------------------------------------- /source_code/img/sina.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1c7/CrashCourse-Android-App/6e1c173d82309f75cefad5ae6459d84a5377c7dc/source_code/img/sina.png -------------------------------------------------------------------------------- /source_code/index.android.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { 3 | AppRegistry, 4 | Image, 5 | Icon, 6 | } from 'react-native'; 7 | import { 8 | createStackNavigator, 9 | createAppContainer, 10 | createBottomTabNavigator, 11 | } from "react-navigation"; 12 | 13 | import HomeScreen from './src/HomeScreen'; // 首页 14 | import AboutScreen from './src/AboutScreen'; // 关于 15 | import CategoryScreen from './src/CategoryScreen'; // 系列 16 | import CategoryListScreen from './src/CategoryListScreen'; // 系列列表 17 | // import CrashCourseDrawer from './src/CrashCourseDrawer'; // 侧边栏 18 | 19 | const CategoryStack = createStackNavigator({ 20 | Category: CategoryScreen, 21 | CategoryList: CategoryListScreen, 22 | }); 23 | 24 | const TabNavigator = createBottomTabNavigator({ 25 | Home:{ screen: HomeScreen, navigationOptions: { 26 | title: '最新', 27 | // showIcon: false, 28 | tabBarIcon: ({ focused, tintcolor }) => ( 29 | 30 | ) 31 | }}, 32 | Category: { screen: CategoryStack, navigationOptions: { 33 | title: '系列', 34 | // showIcon: false, 35 | tabBarIcon: ({ focused, tintcolor }) => ( 36 | 37 | ) 38 | }}, 39 | About: { screen: AboutScreen, navigationOptions: { 40 | title: '关于', 41 | // showIcon: false, 42 | tabBarIcon: ({ focused, tintcolor }) => ( 43 | 44 | ) 45 | }}, 46 | }); 47 | 48 | const AppNavigator = createAppContainer(TabNavigator); 49 | 50 | export default class App extends React.Component { 51 | render() { 52 | return ; 53 | } 54 | } 55 | 56 | AppRegistry.registerComponent('haha', () => App); -------------------------------------------------------------------------------- /source_code/ios/haha-tvOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UIViewControllerBasedStatusBarAppearance 38 | 39 | NSLocationWhenInUseUsageDescription 40 | 41 | NSAppTransportSecurity 42 | 43 | 44 | NSExceptionDomains 45 | 46 | localhost 47 | 48 | NSExceptionAllowsInsecureHTTPLoads 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /source_code/ios/haha-tvOSTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /source_code/ios/haha.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | /* Begin PBXBuildFile section */ 9 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 10 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; 11 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; 12 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; 13 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 14 | 00E356F31AD99517003FC87E /* hahaTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* hahaTests.m */; }; 15 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; 16 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; 17 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; 18 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 19 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 20 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 21 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 22 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 23 | 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 24 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 25 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 26 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 27 | 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 28 | 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; }; 29 | 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; }; 30 | 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; }; 31 | 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; }; 32 | 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; }; 33 | 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; }; 34 | 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; }; 35 | 2DCD954D1E0B4F2C00145EB5 /* hahaTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* hahaTests.m */; }; 36 | 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 37 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 38 | A6A9C590692B438F8DB0C991 /* libRCTVideo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E14293BC2A0845B2B7A832D5 /* libRCTVideo.a */; }; 39 | CDE205F4DDFB49DBA6F11DC3 /* libRNGestureHandler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FBE554D159C48759AE4EBA7 /* libRNGestureHandler.a */; }; 40 | 191CFA7284B047EFA699D979 /* libRNGestureHandler-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9625A88D38924876B58D4C06 /* libRNGestureHandler-tvOS.a */; }; 41 | /* End PBXBuildFile section */ 42 | 43 | /* Begin PBXContainerItemProxy section */ 44 | 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { 45 | isa = PBXContainerItemProxy; 46 | containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 47 | proxyType = 2; 48 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 49 | remoteInfo = RCTActionSheet; 50 | }; 51 | 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { 52 | isa = PBXContainerItemProxy; 53 | containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 54 | proxyType = 2; 55 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 56 | remoteInfo = RCTGeolocation; 57 | }; 58 | 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { 59 | isa = PBXContainerItemProxy; 60 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 61 | proxyType = 2; 62 | remoteGlobalIDString = 58B5115D1A9E6B3D00147676; 63 | remoteInfo = RCTImage; 64 | }; 65 | 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { 66 | isa = PBXContainerItemProxy; 67 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 68 | proxyType = 2; 69 | remoteGlobalIDString = 58B511DB1A9E6C8500147676; 70 | remoteInfo = RCTNetwork; 71 | }; 72 | 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { 73 | isa = PBXContainerItemProxy; 74 | containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 75 | proxyType = 2; 76 | remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; 77 | remoteInfo = RCTVibration; 78 | }; 79 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { 80 | isa = PBXContainerItemProxy; 81 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 82 | proxyType = 1; 83 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A; 84 | remoteInfo = haha; 85 | }; 86 | 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { 87 | isa = PBXContainerItemProxy; 88 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 89 | proxyType = 2; 90 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 91 | remoteInfo = RCTSettings; 92 | }; 93 | 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { 94 | isa = PBXContainerItemProxy; 95 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 96 | proxyType = 2; 97 | remoteGlobalIDString = 3C86DF461ADF2C930047B81A; 98 | remoteInfo = RCTWebSocket; 99 | }; 100 | 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { 101 | isa = PBXContainerItemProxy; 102 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 103 | proxyType = 2; 104 | remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; 105 | remoteInfo = React; 106 | }; 107 | 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = { 108 | isa = PBXContainerItemProxy; 109 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 110 | proxyType = 1; 111 | remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7; 112 | remoteInfo = "haha-tvOS"; 113 | }; 114 | 3623E74522AA3A9700DEB4C2 /* PBXContainerItemProxy */ = { 115 | isa = PBXContainerItemProxy; 116 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 117 | proxyType = 2; 118 | remoteGlobalIDString = 3DBE0D001F3B181A0099AA32; 119 | remoteInfo = fishhook; 120 | }; 121 | 3623E74722AA3A9700DEB4C2 /* PBXContainerItemProxy */ = { 122 | isa = PBXContainerItemProxy; 123 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 124 | proxyType = 2; 125 | remoteGlobalIDString = 3DBE0D0D1F3B181C0099AA32; 126 | remoteInfo = "fishhook-tvOS"; 127 | }; 128 | 3623E75922AA3A9700DEB4C2 /* PBXContainerItemProxy */ = { 129 | isa = PBXContainerItemProxy; 130 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 131 | proxyType = 2; 132 | remoteGlobalIDString = EBF21BDC1FC498900052F4D5; 133 | remoteInfo = jsinspector; 134 | }; 135 | 3623E75B22AA3A9700DEB4C2 /* PBXContainerItemProxy */ = { 136 | isa = PBXContainerItemProxy; 137 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 138 | proxyType = 2; 139 | remoteGlobalIDString = EBF21BFA1FC4989A0052F4D5; 140 | remoteInfo = "jsinspector-tvOS"; 141 | }; 142 | 3623E75D22AA3A9700DEB4C2 /* PBXContainerItemProxy */ = { 143 | isa = PBXContainerItemProxy; 144 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 145 | proxyType = 2; 146 | remoteGlobalIDString = 139D7ECE1E25DB7D00323FB7; 147 | remoteInfo = "third-party"; 148 | }; 149 | 3623E75F22AA3A9700DEB4C2 /* PBXContainerItemProxy */ = { 150 | isa = PBXContainerItemProxy; 151 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 152 | proxyType = 2; 153 | remoteGlobalIDString = 3D383D3C1EBD27B6005632C8; 154 | remoteInfo = "third-party-tvOS"; 155 | }; 156 | 3623E76122AA3A9700DEB4C2 /* PBXContainerItemProxy */ = { 157 | isa = PBXContainerItemProxy; 158 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 159 | proxyType = 2; 160 | remoteGlobalIDString = 139D7E881E25C6D100323FB7; 161 | remoteInfo = "double-conversion"; 162 | }; 163 | 3623E76322AA3A9700DEB4C2 /* PBXContainerItemProxy */ = { 164 | isa = PBXContainerItemProxy; 165 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 166 | proxyType = 2; 167 | remoteGlobalIDString = 3D383D621EBD27B9005632C8; 168 | remoteInfo = "double-conversion-tvOS"; 169 | }; 170 | 3623E76522AA3A9700DEB4C2 /* PBXContainerItemProxy */ = { 171 | isa = PBXContainerItemProxy; 172 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 173 | proxyType = 2; 174 | remoteGlobalIDString = EDEBC6D6214B3E7000DD5AC8; 175 | remoteInfo = jsi; 176 | }; 177 | 3623E76722AA3A9700DEB4C2 /* PBXContainerItemProxy */ = { 178 | isa = PBXContainerItemProxy; 179 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 180 | proxyType = 2; 181 | remoteGlobalIDString = EDEBC73B214B45A300DD5AC8; 182 | remoteInfo = jsiexecutor; 183 | }; 184 | 3623E76922AA3A9700DEB4C2 /* PBXContainerItemProxy */ = { 185 | isa = PBXContainerItemProxy; 186 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 187 | proxyType = 2; 188 | remoteGlobalIDString = ED296FB6214C9A0900B7C4FE; 189 | remoteInfo = "jsi-tvOS"; 190 | }; 191 | 3623E76B22AA3A9700DEB4C2 /* PBXContainerItemProxy */ = { 192 | isa = PBXContainerItemProxy; 193 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 194 | proxyType = 2; 195 | remoteGlobalIDString = ED296FEE214C9CF800B7C4FE; 196 | remoteInfo = "jsiexecutor-tvOS"; 197 | }; 198 | 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = { 199 | isa = PBXContainerItemProxy; 200 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 201 | proxyType = 2; 202 | remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; 203 | remoteInfo = "RCTImage-tvOS"; 204 | }; 205 | 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = { 206 | isa = PBXContainerItemProxy; 207 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 208 | proxyType = 2; 209 | remoteGlobalIDString = 2D2A28471D9B043800D4039D; 210 | remoteInfo = "RCTLinking-tvOS"; 211 | }; 212 | 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 213 | isa = PBXContainerItemProxy; 214 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 215 | proxyType = 2; 216 | remoteGlobalIDString = 2D2A28541D9B044C00D4039D; 217 | remoteInfo = "RCTNetwork-tvOS"; 218 | }; 219 | 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 220 | isa = PBXContainerItemProxy; 221 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 222 | proxyType = 2; 223 | remoteGlobalIDString = 2D2A28611D9B046600D4039D; 224 | remoteInfo = "RCTSettings-tvOS"; 225 | }; 226 | 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = { 227 | isa = PBXContainerItemProxy; 228 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 229 | proxyType = 2; 230 | remoteGlobalIDString = 2D2A287B1D9B048500D4039D; 231 | remoteInfo = "RCTText-tvOS"; 232 | }; 233 | 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = { 234 | isa = PBXContainerItemProxy; 235 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 236 | proxyType = 2; 237 | remoteGlobalIDString = 2D2A28881D9B049200D4039D; 238 | remoteInfo = "RCTWebSocket-tvOS"; 239 | }; 240 | 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = { 241 | isa = PBXContainerItemProxy; 242 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 243 | proxyType = 2; 244 | remoteGlobalIDString = 2D2A28131D9B038B00D4039D; 245 | remoteInfo = "React-tvOS"; 246 | }; 247 | 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = { 248 | isa = PBXContainerItemProxy; 249 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 250 | proxyType = 2; 251 | remoteGlobalIDString = 3D3C059A1DE3340900C268FA; 252 | remoteInfo = yoga; 253 | }; 254 | 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = { 255 | isa = PBXContainerItemProxy; 256 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 257 | proxyType = 2; 258 | remoteGlobalIDString = 3D3C06751DE3340C00C268FA; 259 | remoteInfo = "yoga-tvOS"; 260 | }; 261 | 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = { 262 | isa = PBXContainerItemProxy; 263 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 264 | proxyType = 2; 265 | remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4; 266 | remoteInfo = cxxreact; 267 | }; 268 | 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 269 | isa = PBXContainerItemProxy; 270 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 271 | proxyType = 2; 272 | remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; 273 | remoteInfo = "cxxreact-tvOS"; 274 | }; 275 | 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { 276 | isa = PBXContainerItemProxy; 277 | containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 278 | proxyType = 2; 279 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 280 | remoteInfo = RCTAnimation; 281 | }; 282 | 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { 283 | isa = PBXContainerItemProxy; 284 | containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 285 | proxyType = 2; 286 | remoteGlobalIDString = 2D2A28201D9B03D100D4039D; 287 | remoteInfo = "RCTAnimation-tvOS"; 288 | }; 289 | 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { 290 | isa = PBXContainerItemProxy; 291 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 292 | proxyType = 2; 293 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 294 | remoteInfo = RCTLinking; 295 | }; 296 | 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { 297 | isa = PBXContainerItemProxy; 298 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 299 | proxyType = 2; 300 | remoteGlobalIDString = 58B5119B1A9E6C1200147676; 301 | remoteInfo = RCTText; 302 | }; 303 | /* End PBXContainerItemProxy section */ 304 | 305 | /* Begin PBXFileReference section */ 306 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 307 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; 308 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; 309 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; 310 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; 311 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; 312 | 00E356EE1AD99517003FC87E /* hahaTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = hahaTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 313 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 314 | 00E356F21AD99517003FC87E /* hahaTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = hahaTests.m; sourceTree = ""; }; 315 | 05CEF8DFD04646D9B54F6E86 /* RCTVideo.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RCTVideo.xcodeproj; path = "../node_modules/react-native-video/ios/RCTVideo.xcodeproj"; sourceTree = ""; }; 316 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; 317 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; 318 | 13B07F961A680F5B00A75B9A /* haha.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = haha.app; sourceTree = BUILT_PRODUCTS_DIR; }; 319 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = haha/AppDelegate.h; sourceTree = ""; }; 320 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = haha/AppDelegate.m; sourceTree = ""; }; 321 | 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 322 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = haha/Images.xcassets; sourceTree = ""; }; 323 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = haha/Info.plist; sourceTree = ""; }; 324 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = haha/main.m; sourceTree = ""; }; 325 | 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; 326 | 2D02E47B1E0B4A5D006451C7 /* haha-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "haha-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 327 | 2D02E4901E0B4A5D006451C7 /* haha-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "haha-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 328 | 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; 329 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; 330 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; 331 | E14293BC2A0845B2B7A832D5 /* libRCTVideo.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTVideo.a; sourceTree = ""; }; 332 | 5E9417A22C874A75AF0CD9F9 /* RNGestureHandler.xcodeproj */ = {isa = PBXFileReference; name = "RNGestureHandler.xcodeproj"; path = "../node_modules/react-native-gesture-handler/ios/RNGestureHandler.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; 333 | 7FBE554D159C48759AE4EBA7 /* libRNGestureHandler.a */ = {isa = PBXFileReference; name = "libRNGestureHandler.a"; path = "libRNGestureHandler.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; 334 | 9625A88D38924876B58D4C06 /* libRNGestureHandler-tvOS.a */ = {isa = PBXFileReference; name = "libRNGestureHandler-tvOS.a"; path = "libRNGestureHandler-tvOS.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; 335 | /* End PBXFileReference section */ 336 | 337 | /* Begin PBXFrameworksBuildPhase section */ 338 | 00E356EB1AD99517003FC87E /* Frameworks */ = { 339 | isa = PBXFrameworksBuildPhase; 340 | buildActionMask = 2147483647; 341 | files = ( 342 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, 343 | ); 344 | runOnlyForDeploymentPostprocessing = 0; 345 | }; 346 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 347 | isa = PBXFrameworksBuildPhase; 348 | buildActionMask = 2147483647; 349 | files = ( 350 | 146834051AC3E58100842450 /* libReact.a in Frameworks */, 351 | 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, 352 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, 353 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, 354 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, 355 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, 356 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, 357 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, 358 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 359 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 360 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, 361 | A6A9C590692B438F8DB0C991 /* libRCTVideo.a in Frameworks */, 362 | CDE205F4DDFB49DBA6F11DC3 /* libRNGestureHandler.a in Frameworks */, 363 | ); 364 | runOnlyForDeploymentPostprocessing = 0; 365 | }; 366 | 2D02E4781E0B4A5D006451C7 /* Frameworks */ = { 367 | isa = PBXFrameworksBuildPhase; 368 | buildActionMask = 2147483647; 369 | files = ( 370 | 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */, 371 | 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */, 372 | 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */, 373 | 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */, 374 | 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */, 375 | 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */, 376 | 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */, 377 | 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */, 378 | 191CFA7284B047EFA699D979 /* libRNGestureHandler-tvOS.a in Frameworks */, 379 | ); 380 | runOnlyForDeploymentPostprocessing = 0; 381 | }; 382 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = { 383 | isa = PBXFrameworksBuildPhase; 384 | buildActionMask = 2147483647; 385 | files = ( 386 | ); 387 | runOnlyForDeploymentPostprocessing = 0; 388 | }; 389 | /* End PBXFrameworksBuildPhase section */ 390 | 391 | /* Begin PBXGroup section */ 392 | 00C302A81ABCB8CE00DB3ED1 /* Products */ = { 393 | isa = PBXGroup; 394 | children = ( 395 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, 396 | ); 397 | name = Products; 398 | sourceTree = ""; 399 | }; 400 | 00C302B61ABCB90400DB3ED1 /* Products */ = { 401 | isa = PBXGroup; 402 | children = ( 403 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, 404 | ); 405 | name = Products; 406 | sourceTree = ""; 407 | }; 408 | 00C302BC1ABCB91800DB3ED1 /* Products */ = { 409 | isa = PBXGroup; 410 | children = ( 411 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, 412 | 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */, 413 | ); 414 | name = Products; 415 | sourceTree = ""; 416 | }; 417 | 00C302D41ABCB9D200DB3ED1 /* Products */ = { 418 | isa = PBXGroup; 419 | children = ( 420 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, 421 | 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */, 422 | ); 423 | name = Products; 424 | sourceTree = ""; 425 | }; 426 | 00C302E01ABCB9EE00DB3ED1 /* Products */ = { 427 | isa = PBXGroup; 428 | children = ( 429 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, 430 | ); 431 | name = Products; 432 | sourceTree = ""; 433 | }; 434 | 00E356EF1AD99517003FC87E /* hahaTests */ = { 435 | isa = PBXGroup; 436 | children = ( 437 | 00E356F21AD99517003FC87E /* hahaTests.m */, 438 | 00E356F01AD99517003FC87E /* Supporting Files */, 439 | ); 440 | path = hahaTests; 441 | sourceTree = ""; 442 | }; 443 | 00E356F01AD99517003FC87E /* Supporting Files */ = { 444 | isa = PBXGroup; 445 | children = ( 446 | 00E356F11AD99517003FC87E /* Info.plist */, 447 | ); 448 | name = "Supporting Files"; 449 | sourceTree = ""; 450 | }; 451 | 139105B71AF99BAD00B5F7CC /* Products */ = { 452 | isa = PBXGroup; 453 | children = ( 454 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, 455 | 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */, 456 | ); 457 | name = Products; 458 | sourceTree = ""; 459 | }; 460 | 139FDEE71B06529A00C62182 /* Products */ = { 461 | isa = PBXGroup; 462 | children = ( 463 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, 464 | 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, 465 | 3623E74622AA3A9700DEB4C2 /* libfishhook.a */, 466 | 3623E74822AA3A9700DEB4C2 /* libfishhook-tvOS.a */, 467 | ); 468 | name = Products; 469 | sourceTree = ""; 470 | }; 471 | 13B07FAE1A68108700A75B9A /* haha */ = { 472 | isa = PBXGroup; 473 | children = ( 474 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 475 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 476 | 13B07FB01A68108700A75B9A /* AppDelegate.m */, 477 | 13B07FB51A68108700A75B9A /* Images.xcassets */, 478 | 13B07FB61A68108700A75B9A /* Info.plist */, 479 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, 480 | 13B07FB71A68108700A75B9A /* main.m */, 481 | ); 482 | name = haha; 483 | sourceTree = ""; 484 | }; 485 | 146834001AC3E56700842450 /* Products */ = { 486 | isa = PBXGroup; 487 | children = ( 488 | 146834041AC3E56700842450 /* libReact.a */, 489 | 3DAD3EA31DF850E9000B6D8A /* libReact.a */, 490 | 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, 491 | 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, 492 | 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, 493 | 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */, 494 | 3623E75A22AA3A9700DEB4C2 /* libjsinspector.a */, 495 | 3623E75C22AA3A9700DEB4C2 /* libjsinspector-tvOS.a */, 496 | 3623E75E22AA3A9700DEB4C2 /* libthird-party.a */, 497 | 3623E76022AA3A9700DEB4C2 /* libthird-party.a */, 498 | 3623E76222AA3A9700DEB4C2 /* libdouble-conversion.a */, 499 | 3623E76422AA3A9700DEB4C2 /* libdouble-conversion.a */, 500 | 3623E76622AA3A9700DEB4C2 /* libjsi.a */, 501 | 3623E76822AA3A9700DEB4C2 /* libjsiexecutor.a */, 502 | 3623E76A22AA3A9700DEB4C2 /* libjsi-tvOS.a */, 503 | 3623E76C22AA3A9700DEB4C2 /* libjsiexecutor-tvOS.a */, 504 | ); 505 | name = Products; 506 | sourceTree = ""; 507 | }; 508 | 3623E73122AA3A9400DEB4C2 /* Recovered References */ = { 509 | isa = PBXGroup; 510 | children = ( 511 | E14293BC2A0845B2B7A832D5 /* libRCTVideo.a */, 512 | ); 513 | name = "Recovered References"; 514 | sourceTree = ""; 515 | }; 516 | 5E91572E1DD0AC6500FF2AA8 /* Products */ = { 517 | isa = PBXGroup; 518 | children = ( 519 | 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, 520 | 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */, 521 | ); 522 | name = Products; 523 | sourceTree = ""; 524 | }; 525 | 78C398B11ACF4ADC00677621 /* Products */ = { 526 | isa = PBXGroup; 527 | children = ( 528 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, 529 | 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */, 530 | ); 531 | name = Products; 532 | sourceTree = ""; 533 | }; 534 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 535 | isa = PBXGroup; 536 | children = ( 537 | 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, 538 | 146833FF1AC3E56700842450 /* React.xcodeproj */, 539 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, 540 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, 541 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, 542 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, 543 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, 544 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, 545 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 546 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, 547 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, 548 | 05CEF8DFD04646D9B54F6E86 /* RCTVideo.xcodeproj */, 549 | 5E9417A22C874A75AF0CD9F9 /* RNGestureHandler.xcodeproj */, 550 | ); 551 | name = Libraries; 552 | sourceTree = ""; 553 | }; 554 | 832341B11AAA6A8300B99B32 /* Products */ = { 555 | isa = PBXGroup; 556 | children = ( 557 | 832341B51AAA6A8300B99B32 /* libRCTText.a */, 558 | 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */, 559 | ); 560 | name = Products; 561 | sourceTree = ""; 562 | }; 563 | 83CBB9F61A601CBA00E9B192 = { 564 | isa = PBXGroup; 565 | children = ( 566 | 13B07FAE1A68108700A75B9A /* haha */, 567 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 568 | 00E356EF1AD99517003FC87E /* hahaTests */, 569 | 83CBBA001A601CBA00E9B192 /* Products */, 570 | 3623E73122AA3A9400DEB4C2 /* Recovered References */, 571 | ); 572 | indentWidth = 2; 573 | sourceTree = ""; 574 | tabWidth = 2; 575 | }; 576 | 83CBBA001A601CBA00E9B192 /* Products */ = { 577 | isa = PBXGroup; 578 | children = ( 579 | 13B07F961A680F5B00A75B9A /* haha.app */, 580 | 00E356EE1AD99517003FC87E /* hahaTests.xctest */, 581 | 2D02E47B1E0B4A5D006451C7 /* haha-tvOS.app */, 582 | 2D02E4901E0B4A5D006451C7 /* haha-tvOSTests.xctest */, 583 | ); 584 | name = Products; 585 | sourceTree = ""; 586 | }; 587 | /* End PBXGroup section */ 588 | 589 | /* Begin PBXNativeTarget section */ 590 | 00E356ED1AD99517003FC87E /* hahaTests */ = { 591 | isa = PBXNativeTarget; 592 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "hahaTests" */; 593 | buildPhases = ( 594 | 00E356EA1AD99517003FC87E /* Sources */, 595 | 00E356EB1AD99517003FC87E /* Frameworks */, 596 | 00E356EC1AD99517003FC87E /* Resources */, 597 | ); 598 | buildRules = ( 599 | ); 600 | dependencies = ( 601 | 00E356F51AD99517003FC87E /* PBXTargetDependency */, 602 | ); 603 | name = hahaTests; 604 | productName = hahaTests; 605 | productReference = 00E356EE1AD99517003FC87E /* hahaTests.xctest */; 606 | productType = "com.apple.product-type.bundle.unit-test"; 607 | }; 608 | 13B07F861A680F5B00A75B9A /* haha */ = { 609 | isa = PBXNativeTarget; 610 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "haha" */; 611 | buildPhases = ( 612 | 13B07F871A680F5B00A75B9A /* Sources */, 613 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 614 | 13B07F8E1A680F5B00A75B9A /* Resources */, 615 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 616 | ); 617 | buildRules = ( 618 | ); 619 | dependencies = ( 620 | ); 621 | name = haha; 622 | productName = "Hello World"; 623 | productReference = 13B07F961A680F5B00A75B9A /* haha.app */; 624 | productType = "com.apple.product-type.application"; 625 | }; 626 | 2D02E47A1E0B4A5D006451C7 /* haha-tvOS */ = { 627 | isa = PBXNativeTarget; 628 | buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "haha-tvOS" */; 629 | buildPhases = ( 630 | 2D02E4771E0B4A5D006451C7 /* Sources */, 631 | 2D02E4781E0B4A5D006451C7 /* Frameworks */, 632 | 2D02E4791E0B4A5D006451C7 /* Resources */, 633 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */, 634 | ); 635 | buildRules = ( 636 | ); 637 | dependencies = ( 638 | ); 639 | name = "haha-tvOS"; 640 | productName = "haha-tvOS"; 641 | productReference = 2D02E47B1E0B4A5D006451C7 /* haha-tvOS.app */; 642 | productType = "com.apple.product-type.application"; 643 | }; 644 | 2D02E48F1E0B4A5D006451C7 /* haha-tvOSTests */ = { 645 | isa = PBXNativeTarget; 646 | buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "haha-tvOSTests" */; 647 | buildPhases = ( 648 | 2D02E48C1E0B4A5D006451C7 /* Sources */, 649 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */, 650 | 2D02E48E1E0B4A5D006451C7 /* Resources */, 651 | ); 652 | buildRules = ( 653 | ); 654 | dependencies = ( 655 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */, 656 | ); 657 | name = "haha-tvOSTests"; 658 | productName = "haha-tvOSTests"; 659 | productReference = 2D02E4901E0B4A5D006451C7 /* haha-tvOSTests.xctest */; 660 | productType = "com.apple.product-type.bundle.unit-test"; 661 | }; 662 | /* End PBXNativeTarget section */ 663 | 664 | /* Begin PBXProject section */ 665 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 666 | isa = PBXProject; 667 | attributes = { 668 | LastUpgradeCheck = 610; 669 | ORGANIZATIONNAME = Facebook; 670 | TargetAttributes = { 671 | 00E356ED1AD99517003FC87E = { 672 | CreatedOnToolsVersion = 6.2; 673 | TestTargetID = 13B07F861A680F5B00A75B9A; 674 | }; 675 | 13B07F861A680F5B00A75B9A = { 676 | DevelopmentTeam = 7REP7X4736; 677 | }; 678 | 2D02E47A1E0B4A5D006451C7 = { 679 | CreatedOnToolsVersion = 8.2.1; 680 | ProvisioningStyle = Automatic; 681 | }; 682 | 2D02E48F1E0B4A5D006451C7 = { 683 | CreatedOnToolsVersion = 8.2.1; 684 | ProvisioningStyle = Automatic; 685 | TestTargetID = 2D02E47A1E0B4A5D006451C7; 686 | }; 687 | }; 688 | }; 689 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "haha" */; 690 | compatibilityVersion = "Xcode 3.2"; 691 | developmentRegion = English; 692 | hasScannedForEncodings = 0; 693 | knownRegions = ( 694 | English, 695 | en, 696 | Base, 697 | ); 698 | mainGroup = 83CBB9F61A601CBA00E9B192; 699 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 700 | projectDirPath = ""; 701 | projectReferences = ( 702 | { 703 | ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; 704 | ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 705 | }, 706 | { 707 | ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; 708 | ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 709 | }, 710 | { 711 | ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; 712 | ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 713 | }, 714 | { 715 | ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; 716 | ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 717 | }, 718 | { 719 | ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; 720 | ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 721 | }, 722 | { 723 | ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; 724 | ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 725 | }, 726 | { 727 | ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; 728 | ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 729 | }, 730 | { 731 | ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; 732 | ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 733 | }, 734 | { 735 | ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; 736 | ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 737 | }, 738 | { 739 | ProductGroup = 139FDEE71B06529A00C62182 /* Products */; 740 | ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 741 | }, 742 | { 743 | ProductGroup = 146834001AC3E56700842450 /* Products */; 744 | ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; 745 | }, 746 | ); 747 | projectRoot = ""; 748 | targets = ( 749 | 13B07F861A680F5B00A75B9A /* haha */, 750 | 00E356ED1AD99517003FC87E /* hahaTests */, 751 | 2D02E47A1E0B4A5D006451C7 /* haha-tvOS */, 752 | 2D02E48F1E0B4A5D006451C7 /* haha-tvOSTests */, 753 | ); 754 | }; 755 | /* End PBXProject section */ 756 | 757 | /* Begin PBXReferenceProxy section */ 758 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { 759 | isa = PBXReferenceProxy; 760 | fileType = archive.ar; 761 | path = libRCTActionSheet.a; 762 | remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; 763 | sourceTree = BUILT_PRODUCTS_DIR; 764 | }; 765 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { 766 | isa = PBXReferenceProxy; 767 | fileType = archive.ar; 768 | path = libRCTGeolocation.a; 769 | remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; 770 | sourceTree = BUILT_PRODUCTS_DIR; 771 | }; 772 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { 773 | isa = PBXReferenceProxy; 774 | fileType = archive.ar; 775 | path = libRCTImage.a; 776 | remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; 777 | sourceTree = BUILT_PRODUCTS_DIR; 778 | }; 779 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { 780 | isa = PBXReferenceProxy; 781 | fileType = archive.ar; 782 | path = libRCTNetwork.a; 783 | remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; 784 | sourceTree = BUILT_PRODUCTS_DIR; 785 | }; 786 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { 787 | isa = PBXReferenceProxy; 788 | fileType = archive.ar; 789 | path = libRCTVibration.a; 790 | remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; 791 | sourceTree = BUILT_PRODUCTS_DIR; 792 | }; 793 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { 794 | isa = PBXReferenceProxy; 795 | fileType = archive.ar; 796 | path = libRCTSettings.a; 797 | remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; 798 | sourceTree = BUILT_PRODUCTS_DIR; 799 | }; 800 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { 801 | isa = PBXReferenceProxy; 802 | fileType = archive.ar; 803 | path = libRCTWebSocket.a; 804 | remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; 805 | sourceTree = BUILT_PRODUCTS_DIR; 806 | }; 807 | 146834041AC3E56700842450 /* libReact.a */ = { 808 | isa = PBXReferenceProxy; 809 | fileType = archive.ar; 810 | path = libReact.a; 811 | remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; 812 | sourceTree = BUILT_PRODUCTS_DIR; 813 | }; 814 | 3623E74622AA3A9700DEB4C2 /* libfishhook.a */ = { 815 | isa = PBXReferenceProxy; 816 | fileType = archive.ar; 817 | path = libfishhook.a; 818 | remoteRef = 3623E74522AA3A9700DEB4C2 /* PBXContainerItemProxy */; 819 | sourceTree = BUILT_PRODUCTS_DIR; 820 | }; 821 | 3623E74822AA3A9700DEB4C2 /* libfishhook-tvOS.a */ = { 822 | isa = PBXReferenceProxy; 823 | fileType = archive.ar; 824 | path = "libfishhook-tvOS.a"; 825 | remoteRef = 3623E74722AA3A9700DEB4C2 /* PBXContainerItemProxy */; 826 | sourceTree = BUILT_PRODUCTS_DIR; 827 | }; 828 | 3623E75A22AA3A9700DEB4C2 /* libjsinspector.a */ = { 829 | isa = PBXReferenceProxy; 830 | fileType = archive.ar; 831 | path = libjsinspector.a; 832 | remoteRef = 3623E75922AA3A9700DEB4C2 /* PBXContainerItemProxy */; 833 | sourceTree = BUILT_PRODUCTS_DIR; 834 | }; 835 | 3623E75C22AA3A9700DEB4C2 /* libjsinspector-tvOS.a */ = { 836 | isa = PBXReferenceProxy; 837 | fileType = archive.ar; 838 | path = "libjsinspector-tvOS.a"; 839 | remoteRef = 3623E75B22AA3A9700DEB4C2 /* PBXContainerItemProxy */; 840 | sourceTree = BUILT_PRODUCTS_DIR; 841 | }; 842 | 3623E75E22AA3A9700DEB4C2 /* libthird-party.a */ = { 843 | isa = PBXReferenceProxy; 844 | fileType = archive.ar; 845 | path = "libthird-party.a"; 846 | remoteRef = 3623E75D22AA3A9700DEB4C2 /* PBXContainerItemProxy */; 847 | sourceTree = BUILT_PRODUCTS_DIR; 848 | }; 849 | 3623E76022AA3A9700DEB4C2 /* libthird-party.a */ = { 850 | isa = PBXReferenceProxy; 851 | fileType = archive.ar; 852 | path = "libthird-party.a"; 853 | remoteRef = 3623E75F22AA3A9700DEB4C2 /* PBXContainerItemProxy */; 854 | sourceTree = BUILT_PRODUCTS_DIR; 855 | }; 856 | 3623E76222AA3A9700DEB4C2 /* libdouble-conversion.a */ = { 857 | isa = PBXReferenceProxy; 858 | fileType = archive.ar; 859 | path = "libdouble-conversion.a"; 860 | remoteRef = 3623E76122AA3A9700DEB4C2 /* PBXContainerItemProxy */; 861 | sourceTree = BUILT_PRODUCTS_DIR; 862 | }; 863 | 3623E76422AA3A9700DEB4C2 /* libdouble-conversion.a */ = { 864 | isa = PBXReferenceProxy; 865 | fileType = archive.ar; 866 | path = "libdouble-conversion.a"; 867 | remoteRef = 3623E76322AA3A9700DEB4C2 /* PBXContainerItemProxy */; 868 | sourceTree = BUILT_PRODUCTS_DIR; 869 | }; 870 | 3623E76622AA3A9700DEB4C2 /* libjsi.a */ = { 871 | isa = PBXReferenceProxy; 872 | fileType = archive.ar; 873 | path = libjsi.a; 874 | remoteRef = 3623E76522AA3A9700DEB4C2 /* PBXContainerItemProxy */; 875 | sourceTree = BUILT_PRODUCTS_DIR; 876 | }; 877 | 3623E76822AA3A9700DEB4C2 /* libjsiexecutor.a */ = { 878 | isa = PBXReferenceProxy; 879 | fileType = archive.ar; 880 | path = libjsiexecutor.a; 881 | remoteRef = 3623E76722AA3A9700DEB4C2 /* PBXContainerItemProxy */; 882 | sourceTree = BUILT_PRODUCTS_DIR; 883 | }; 884 | 3623E76A22AA3A9700DEB4C2 /* libjsi-tvOS.a */ = { 885 | isa = PBXReferenceProxy; 886 | fileType = archive.ar; 887 | path = "libjsi-tvOS.a"; 888 | remoteRef = 3623E76922AA3A9700DEB4C2 /* PBXContainerItemProxy */; 889 | sourceTree = BUILT_PRODUCTS_DIR; 890 | }; 891 | 3623E76C22AA3A9700DEB4C2 /* libjsiexecutor-tvOS.a */ = { 892 | isa = PBXReferenceProxy; 893 | fileType = archive.ar; 894 | path = "libjsiexecutor-tvOS.a"; 895 | remoteRef = 3623E76B22AA3A9700DEB4C2 /* PBXContainerItemProxy */; 896 | sourceTree = BUILT_PRODUCTS_DIR; 897 | }; 898 | 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = { 899 | isa = PBXReferenceProxy; 900 | fileType = archive.ar; 901 | path = "libRCTImage-tvOS.a"; 902 | remoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */; 903 | sourceTree = BUILT_PRODUCTS_DIR; 904 | }; 905 | 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = { 906 | isa = PBXReferenceProxy; 907 | fileType = archive.ar; 908 | path = "libRCTLinking-tvOS.a"; 909 | remoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */; 910 | sourceTree = BUILT_PRODUCTS_DIR; 911 | }; 912 | 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = { 913 | isa = PBXReferenceProxy; 914 | fileType = archive.ar; 915 | path = "libRCTNetwork-tvOS.a"; 916 | remoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */; 917 | sourceTree = BUILT_PRODUCTS_DIR; 918 | }; 919 | 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = { 920 | isa = PBXReferenceProxy; 921 | fileType = archive.ar; 922 | path = "libRCTSettings-tvOS.a"; 923 | remoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */; 924 | sourceTree = BUILT_PRODUCTS_DIR; 925 | }; 926 | 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = { 927 | isa = PBXReferenceProxy; 928 | fileType = archive.ar; 929 | path = "libRCTText-tvOS.a"; 930 | remoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */; 931 | sourceTree = BUILT_PRODUCTS_DIR; 932 | }; 933 | 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = { 934 | isa = PBXReferenceProxy; 935 | fileType = archive.ar; 936 | path = "libRCTWebSocket-tvOS.a"; 937 | remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */; 938 | sourceTree = BUILT_PRODUCTS_DIR; 939 | }; 940 | 3DAD3EA31DF850E9000B6D8A /* libReact.a */ = { 941 | isa = PBXReferenceProxy; 942 | fileType = archive.ar; 943 | path = libReact.a; 944 | remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */; 945 | sourceTree = BUILT_PRODUCTS_DIR; 946 | }; 947 | 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = { 948 | isa = PBXReferenceProxy; 949 | fileType = archive.ar; 950 | path = libyoga.a; 951 | remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */; 952 | sourceTree = BUILT_PRODUCTS_DIR; 953 | }; 954 | 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = { 955 | isa = PBXReferenceProxy; 956 | fileType = archive.ar; 957 | path = libyoga.a; 958 | remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */; 959 | sourceTree = BUILT_PRODUCTS_DIR; 960 | }; 961 | 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = { 962 | isa = PBXReferenceProxy; 963 | fileType = archive.ar; 964 | path = libcxxreact.a; 965 | remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */; 966 | sourceTree = BUILT_PRODUCTS_DIR; 967 | }; 968 | 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = { 969 | isa = PBXReferenceProxy; 970 | fileType = archive.ar; 971 | path = libcxxreact.a; 972 | remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; 973 | sourceTree = BUILT_PRODUCTS_DIR; 974 | }; 975 | 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { 976 | isa = PBXReferenceProxy; 977 | fileType = archive.ar; 978 | path = libRCTAnimation.a; 979 | remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; 980 | sourceTree = BUILT_PRODUCTS_DIR; 981 | }; 982 | 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { 983 | isa = PBXReferenceProxy; 984 | fileType = archive.ar; 985 | path = libRCTAnimation.a; 986 | remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; 987 | sourceTree = BUILT_PRODUCTS_DIR; 988 | }; 989 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { 990 | isa = PBXReferenceProxy; 991 | fileType = archive.ar; 992 | path = libRCTLinking.a; 993 | remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; 994 | sourceTree = BUILT_PRODUCTS_DIR; 995 | }; 996 | 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { 997 | isa = PBXReferenceProxy; 998 | fileType = archive.ar; 999 | path = libRCTText.a; 1000 | remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; 1001 | sourceTree = BUILT_PRODUCTS_DIR; 1002 | }; 1003 | /* End PBXReferenceProxy section */ 1004 | 1005 | /* Begin PBXResourcesBuildPhase section */ 1006 | 00E356EC1AD99517003FC87E /* Resources */ = { 1007 | isa = PBXResourcesBuildPhase; 1008 | buildActionMask = 2147483647; 1009 | files = ( 1010 | ); 1011 | runOnlyForDeploymentPostprocessing = 0; 1012 | }; 1013 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 1014 | isa = PBXResourcesBuildPhase; 1015 | buildActionMask = 2147483647; 1016 | files = ( 1017 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 1018 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, 1019 | ); 1020 | runOnlyForDeploymentPostprocessing = 0; 1021 | }; 1022 | 2D02E4791E0B4A5D006451C7 /* Resources */ = { 1023 | isa = PBXResourcesBuildPhase; 1024 | buildActionMask = 2147483647; 1025 | files = ( 1026 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */, 1027 | ); 1028 | runOnlyForDeploymentPostprocessing = 0; 1029 | }; 1030 | 2D02E48E1E0B4A5D006451C7 /* Resources */ = { 1031 | isa = PBXResourcesBuildPhase; 1032 | buildActionMask = 2147483647; 1033 | files = ( 1034 | ); 1035 | runOnlyForDeploymentPostprocessing = 0; 1036 | }; 1037 | /* End PBXResourcesBuildPhase section */ 1038 | 1039 | /* Begin PBXShellScriptBuildPhase section */ 1040 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 1041 | isa = PBXShellScriptBuildPhase; 1042 | buildActionMask = 2147483647; 1043 | files = ( 1044 | ); 1045 | inputPaths = ( 1046 | ); 1047 | name = "Bundle React Native code and images"; 1048 | outputPaths = ( 1049 | ); 1050 | runOnlyForDeploymentPostprocessing = 0; 1051 | shellPath = /bin/sh; 1052 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; 1053 | }; 1054 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { 1055 | isa = PBXShellScriptBuildPhase; 1056 | buildActionMask = 2147483647; 1057 | files = ( 1058 | ); 1059 | inputPaths = ( 1060 | ); 1061 | name = "Bundle React Native Code And Images"; 1062 | outputPaths = ( 1063 | ); 1064 | runOnlyForDeploymentPostprocessing = 0; 1065 | shellPath = /bin/sh; 1066 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; 1067 | }; 1068 | /* End PBXShellScriptBuildPhase section */ 1069 | 1070 | /* Begin PBXSourcesBuildPhase section */ 1071 | 00E356EA1AD99517003FC87E /* Sources */ = { 1072 | isa = PBXSourcesBuildPhase; 1073 | buildActionMask = 2147483647; 1074 | files = ( 1075 | 00E356F31AD99517003FC87E /* hahaTests.m in Sources */, 1076 | ); 1077 | runOnlyForDeploymentPostprocessing = 0; 1078 | }; 1079 | 13B07F871A680F5B00A75B9A /* Sources */ = { 1080 | isa = PBXSourcesBuildPhase; 1081 | buildActionMask = 2147483647; 1082 | files = ( 1083 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 1084 | 13B07FC11A68108700A75B9A /* main.m in Sources */, 1085 | ); 1086 | runOnlyForDeploymentPostprocessing = 0; 1087 | }; 1088 | 2D02E4771E0B4A5D006451C7 /* Sources */ = { 1089 | isa = PBXSourcesBuildPhase; 1090 | buildActionMask = 2147483647; 1091 | files = ( 1092 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */, 1093 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */, 1094 | ); 1095 | runOnlyForDeploymentPostprocessing = 0; 1096 | }; 1097 | 2D02E48C1E0B4A5D006451C7 /* Sources */ = { 1098 | isa = PBXSourcesBuildPhase; 1099 | buildActionMask = 2147483647; 1100 | files = ( 1101 | 2DCD954D1E0B4F2C00145EB5 /* hahaTests.m in Sources */, 1102 | ); 1103 | runOnlyForDeploymentPostprocessing = 0; 1104 | }; 1105 | /* End PBXSourcesBuildPhase section */ 1106 | 1107 | /* Begin PBXTargetDependency section */ 1108 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { 1109 | isa = PBXTargetDependency; 1110 | target = 13B07F861A680F5B00A75B9A /* haha */; 1111 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; 1112 | }; 1113 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = { 1114 | isa = PBXTargetDependency; 1115 | target = 2D02E47A1E0B4A5D006451C7 /* haha-tvOS */; 1116 | targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */; 1117 | }; 1118 | /* End PBXTargetDependency section */ 1119 | 1120 | /* Begin PBXVariantGroup section */ 1121 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { 1122 | isa = PBXVariantGroup; 1123 | children = ( 1124 | 13B07FB21A68108700A75B9A /* Base */, 1125 | ); 1126 | name = LaunchScreen.xib; 1127 | path = haha; 1128 | sourceTree = ""; 1129 | }; 1130 | /* End PBXVariantGroup section */ 1131 | 1132 | /* Begin XCBuildConfiguration section */ 1133 | 00E356F61AD99517003FC87E /* Debug */ = { 1134 | isa = XCBuildConfiguration; 1135 | buildSettings = { 1136 | BUNDLE_LOADER = "$(TEST_HOST)"; 1137 | GCC_PREPROCESSOR_DEFINITIONS = ( 1138 | "DEBUG=1", 1139 | "$(inherited)", 1140 | ); 1141 | HEADER_SEARCH_PATHS = ( 1142 | "$(inherited)", 1143 | "$(SRCROOT)/../node_modules/react-native-video/ios", 1144 | "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", 1145 | ); 1146 | INFOPLIST_FILE = hahaTests/Info.plist; 1147 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1148 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1149 | LIBRARY_SEARCH_PATHS = ( 1150 | "$(inherited)", 1151 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1152 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1153 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1154 | ); 1155 | OTHER_LDFLAGS = ( 1156 | "-ObjC", 1157 | "-lc++", 1158 | ); 1159 | PRODUCT_NAME = "$(TARGET_NAME)"; 1160 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/haha.app/haha"; 1161 | }; 1162 | name = Debug; 1163 | }; 1164 | 00E356F71AD99517003FC87E /* Release */ = { 1165 | isa = XCBuildConfiguration; 1166 | buildSettings = { 1167 | BUNDLE_LOADER = "$(TEST_HOST)"; 1168 | COPY_PHASE_STRIP = NO; 1169 | HEADER_SEARCH_PATHS = ( 1170 | "$(inherited)", 1171 | "$(SRCROOT)/../node_modules/react-native-video/ios", 1172 | "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", 1173 | ); 1174 | INFOPLIST_FILE = hahaTests/Info.plist; 1175 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1176 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1177 | LIBRARY_SEARCH_PATHS = ( 1178 | "$(inherited)", 1179 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1180 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1181 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1182 | ); 1183 | OTHER_LDFLAGS = ( 1184 | "-ObjC", 1185 | "-lc++", 1186 | ); 1187 | PRODUCT_NAME = "$(TARGET_NAME)"; 1188 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/haha.app/haha"; 1189 | }; 1190 | name = Release; 1191 | }; 1192 | 13B07F941A680F5B00A75B9A /* Debug */ = { 1193 | isa = XCBuildConfiguration; 1194 | buildSettings = { 1195 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1196 | CURRENT_PROJECT_VERSION = 1; 1197 | DEAD_CODE_STRIPPING = NO; 1198 | DEVELOPMENT_TEAM = 7REP7X4736; 1199 | HEADER_SEARCH_PATHS = ( 1200 | "$(inherited)", 1201 | "$(SRCROOT)/../node_modules/react-native-video/ios", 1202 | "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", 1203 | ); 1204 | INFOPLIST_FILE = haha/Info.plist; 1205 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 1206 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1207 | OTHER_LDFLAGS = ( 1208 | "$(inherited)", 1209 | "-ObjC", 1210 | "-lc++", 1211 | ); 1212 | PRODUCT_BUNDLE_IDENTIFIER = org.reactjs.native.chengzheng.chengzheng; 1213 | PRODUCT_NAME = haha; 1214 | TARGETED_DEVICE_FAMILY = 1; 1215 | VERSIONING_SYSTEM = "apple-generic"; 1216 | }; 1217 | name = Debug; 1218 | }; 1219 | 13B07F951A680F5B00A75B9A /* Release */ = { 1220 | isa = XCBuildConfiguration; 1221 | buildSettings = { 1222 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1223 | CURRENT_PROJECT_VERSION = 1; 1224 | DEVELOPMENT_TEAM = 7REP7X4736; 1225 | HEADER_SEARCH_PATHS = ( 1226 | "$(inherited)", 1227 | "$(SRCROOT)/../node_modules/react-native-video/ios", 1228 | "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", 1229 | ); 1230 | INFOPLIST_FILE = haha/Info.plist; 1231 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 1232 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1233 | OTHER_LDFLAGS = ( 1234 | "$(inherited)", 1235 | "-ObjC", 1236 | "-lc++", 1237 | ); 1238 | PRODUCT_BUNDLE_IDENTIFIER = org.reactjs.native.chengzheng.chengzheng; 1239 | PRODUCT_NAME = haha; 1240 | TARGETED_DEVICE_FAMILY = 1; 1241 | VERSIONING_SYSTEM = "apple-generic"; 1242 | }; 1243 | name = Release; 1244 | }; 1245 | 2D02E4971E0B4A5E006451C7 /* Debug */ = { 1246 | isa = XCBuildConfiguration; 1247 | buildSettings = { 1248 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; 1249 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 1250 | CLANG_ANALYZER_NONNULL = YES; 1251 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1252 | CLANG_WARN_INFINITE_RECURSION = YES; 1253 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1254 | DEBUG_INFORMATION_FORMAT = dwarf; 1255 | ENABLE_TESTABILITY = YES; 1256 | GCC_NO_COMMON_BLOCKS = YES; 1257 | HEADER_SEARCH_PATHS = ( 1258 | "$(inherited)", 1259 | "$(SRCROOT)/../node_modules/react-native-video/ios", 1260 | "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", 1261 | ); 1262 | INFOPLIST_FILE = "haha-tvOS/Info.plist"; 1263 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1264 | LIBRARY_SEARCH_PATHS = ( 1265 | "$(inherited)", 1266 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1267 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1268 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1269 | ); 1270 | OTHER_LDFLAGS = ( 1271 | "-ObjC", 1272 | "-lc++", 1273 | ); 1274 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.haha-tvOS"; 1275 | PRODUCT_NAME = "$(TARGET_NAME)"; 1276 | SDKROOT = appletvos; 1277 | TARGETED_DEVICE_FAMILY = 3; 1278 | TVOS_DEPLOYMENT_TARGET = 9.2; 1279 | }; 1280 | name = Debug; 1281 | }; 1282 | 2D02E4981E0B4A5E006451C7 /* Release */ = { 1283 | isa = XCBuildConfiguration; 1284 | buildSettings = { 1285 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; 1286 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 1287 | CLANG_ANALYZER_NONNULL = YES; 1288 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1289 | CLANG_WARN_INFINITE_RECURSION = YES; 1290 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1291 | COPY_PHASE_STRIP = NO; 1292 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1293 | GCC_NO_COMMON_BLOCKS = YES; 1294 | HEADER_SEARCH_PATHS = ( 1295 | "$(inherited)", 1296 | "$(SRCROOT)/../node_modules/react-native-video/ios", 1297 | "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", 1298 | ); 1299 | INFOPLIST_FILE = "haha-tvOS/Info.plist"; 1300 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1301 | LIBRARY_SEARCH_PATHS = ( 1302 | "$(inherited)", 1303 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1304 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1305 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1306 | ); 1307 | OTHER_LDFLAGS = ( 1308 | "-ObjC", 1309 | "-lc++", 1310 | ); 1311 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.haha-tvOS"; 1312 | PRODUCT_NAME = "$(TARGET_NAME)"; 1313 | SDKROOT = appletvos; 1314 | TARGETED_DEVICE_FAMILY = 3; 1315 | TVOS_DEPLOYMENT_TARGET = 9.2; 1316 | }; 1317 | name = Release; 1318 | }; 1319 | 2D02E4991E0B4A5E006451C7 /* Debug */ = { 1320 | isa = XCBuildConfiguration; 1321 | buildSettings = { 1322 | BUNDLE_LOADER = "$(TEST_HOST)"; 1323 | CLANG_ANALYZER_NONNULL = YES; 1324 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1325 | CLANG_WARN_INFINITE_RECURSION = YES; 1326 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1327 | DEBUG_INFORMATION_FORMAT = dwarf; 1328 | ENABLE_TESTABILITY = YES; 1329 | GCC_NO_COMMON_BLOCKS = YES; 1330 | INFOPLIST_FILE = "haha-tvOSTests/Info.plist"; 1331 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1332 | LIBRARY_SEARCH_PATHS = ( 1333 | "$(inherited)", 1334 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1335 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1336 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1337 | ); 1338 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.haha-tvOSTests"; 1339 | PRODUCT_NAME = "$(TARGET_NAME)"; 1340 | SDKROOT = appletvos; 1341 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/haha-tvOS.app/haha-tvOS"; 1342 | TVOS_DEPLOYMENT_TARGET = 10.1; 1343 | }; 1344 | name = Debug; 1345 | }; 1346 | 2D02E49A1E0B4A5E006451C7 /* Release */ = { 1347 | isa = XCBuildConfiguration; 1348 | buildSettings = { 1349 | BUNDLE_LOADER = "$(TEST_HOST)"; 1350 | CLANG_ANALYZER_NONNULL = YES; 1351 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1352 | CLANG_WARN_INFINITE_RECURSION = YES; 1353 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1354 | COPY_PHASE_STRIP = NO; 1355 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1356 | GCC_NO_COMMON_BLOCKS = YES; 1357 | INFOPLIST_FILE = "haha-tvOSTests/Info.plist"; 1358 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1359 | LIBRARY_SEARCH_PATHS = ( 1360 | "$(inherited)", 1361 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1362 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1363 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 1364 | ); 1365 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.haha-tvOSTests"; 1366 | PRODUCT_NAME = "$(TARGET_NAME)"; 1367 | SDKROOT = appletvos; 1368 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/haha-tvOS.app/haha-tvOS"; 1369 | TVOS_DEPLOYMENT_TARGET = 10.1; 1370 | }; 1371 | name = Release; 1372 | }; 1373 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 1374 | isa = XCBuildConfiguration; 1375 | buildSettings = { 1376 | ALWAYS_SEARCH_USER_PATHS = NO; 1377 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1378 | CLANG_CXX_LIBRARY = "libc++"; 1379 | CLANG_ENABLE_MODULES = YES; 1380 | CLANG_ENABLE_OBJC_ARC = YES; 1381 | CLANG_WARN_BOOL_CONVERSION = YES; 1382 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1383 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1384 | CLANG_WARN_EMPTY_BODY = YES; 1385 | CLANG_WARN_ENUM_CONVERSION = YES; 1386 | CLANG_WARN_INT_CONVERSION = YES; 1387 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1388 | CLANG_WARN_UNREACHABLE_CODE = YES; 1389 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1390 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1391 | COPY_PHASE_STRIP = NO; 1392 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1393 | GCC_C_LANGUAGE_STANDARD = gnu99; 1394 | GCC_DYNAMIC_NO_PIC = NO; 1395 | GCC_OPTIMIZATION_LEVEL = 0; 1396 | GCC_PREPROCESSOR_DEFINITIONS = ( 1397 | "DEBUG=1", 1398 | "$(inherited)", 1399 | ); 1400 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 1401 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1402 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1403 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1404 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1405 | GCC_WARN_UNUSED_FUNCTION = YES; 1406 | GCC_WARN_UNUSED_VARIABLE = YES; 1407 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1408 | MTL_ENABLE_DEBUG_INFO = YES; 1409 | ONLY_ACTIVE_ARCH = YES; 1410 | SDKROOT = iphoneos; 1411 | }; 1412 | name = Debug; 1413 | }; 1414 | 83CBBA211A601CBA00E9B192 /* Release */ = { 1415 | isa = XCBuildConfiguration; 1416 | buildSettings = { 1417 | ALWAYS_SEARCH_USER_PATHS = NO; 1418 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1419 | CLANG_CXX_LIBRARY = "libc++"; 1420 | CLANG_ENABLE_MODULES = YES; 1421 | CLANG_ENABLE_OBJC_ARC = YES; 1422 | CLANG_WARN_BOOL_CONVERSION = YES; 1423 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1424 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1425 | CLANG_WARN_EMPTY_BODY = YES; 1426 | CLANG_WARN_ENUM_CONVERSION = YES; 1427 | CLANG_WARN_INT_CONVERSION = YES; 1428 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1429 | CLANG_WARN_UNREACHABLE_CODE = YES; 1430 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1431 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1432 | COPY_PHASE_STRIP = YES; 1433 | ENABLE_NS_ASSERTIONS = NO; 1434 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1435 | GCC_C_LANGUAGE_STANDARD = gnu99; 1436 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1437 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1438 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1439 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1440 | GCC_WARN_UNUSED_FUNCTION = YES; 1441 | GCC_WARN_UNUSED_VARIABLE = YES; 1442 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1443 | MTL_ENABLE_DEBUG_INFO = NO; 1444 | SDKROOT = iphoneos; 1445 | VALIDATE_PRODUCT = YES; 1446 | }; 1447 | name = Release; 1448 | }; 1449 | /* End XCBuildConfiguration section */ 1450 | 1451 | /* Begin XCConfigurationList section */ 1452 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "hahaTests" */ = { 1453 | isa = XCConfigurationList; 1454 | buildConfigurations = ( 1455 | 00E356F61AD99517003FC87E /* Debug */, 1456 | 00E356F71AD99517003FC87E /* Release */, 1457 | ); 1458 | defaultConfigurationIsVisible = 0; 1459 | defaultConfigurationName = Release; 1460 | }; 1461 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "haha" */ = { 1462 | isa = XCConfigurationList; 1463 | buildConfigurations = ( 1464 | 13B07F941A680F5B00A75B9A /* Debug */, 1465 | 13B07F951A680F5B00A75B9A /* Release */, 1466 | ); 1467 | defaultConfigurationIsVisible = 0; 1468 | defaultConfigurationName = Release; 1469 | }; 1470 | 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "haha-tvOS" */ = { 1471 | isa = XCConfigurationList; 1472 | buildConfigurations = ( 1473 | 2D02E4971E0B4A5E006451C7 /* Debug */, 1474 | 2D02E4981E0B4A5E006451C7 /* Release */, 1475 | ); 1476 | defaultConfigurationIsVisible = 0; 1477 | defaultConfigurationName = Release; 1478 | }; 1479 | 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "haha-tvOSTests" */ = { 1480 | isa = XCConfigurationList; 1481 | buildConfigurations = ( 1482 | 2D02E4991E0B4A5E006451C7 /* Debug */, 1483 | 2D02E49A1E0B4A5E006451C7 /* Release */, 1484 | ); 1485 | defaultConfigurationIsVisible = 0; 1486 | defaultConfigurationName = Release; 1487 | }; 1488 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "haha" */ = { 1489 | isa = XCConfigurationList; 1490 | buildConfigurations = ( 1491 | 83CBBA201A601CBA00E9B192 /* Debug */, 1492 | 83CBBA211A601CBA00E9B192 /* Release */, 1493 | ); 1494 | defaultConfigurationIsVisible = 0; 1495 | defaultConfigurationName = Release; 1496 | }; 1497 | /* End XCConfigurationList section */ 1498 | }; 1499 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 1500 | } 1501 | -------------------------------------------------------------------------------- /source_code/ios/haha.xcodeproj/xcshareddata/xcschemes/haha-tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 61 | 67 | 68 | 69 | 70 | 71 | 77 | 78 | 79 | 80 | 81 | 82 | 92 | 94 | 100 | 101 | 102 | 103 | 104 | 105 | 111 | 113 | 119 | 120 | 121 | 122 | 124 | 125 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /source_code/ios/haha.xcodeproj/xcshareddata/xcschemes/haha.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 61 | 67 | 68 | 69 | 70 | 71 | 77 | 78 | 79 | 80 | 81 | 82 | 92 | 94 | 100 | 101 | 102 | 103 | 104 | 105 | 111 | 113 | 119 | 120 | 121 | 122 | 124 | 125 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /source_code/ios/haha/AppDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | 12 | @interface AppDelegate : UIResponder 13 | 14 | @property (nonatomic, strong) UIWindow *window; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /source_code/ios/haha/AppDelegate.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import "AppDelegate.h" 11 | 12 | #import 13 | #import 14 | 15 | @implementation AppDelegate 16 | 17 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 18 | { 19 | NSURL *jsCodeLocation; 20 | 21 | jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; 22 | 23 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 24 | moduleName:@"haha" 25 | initialProperties:nil 26 | launchOptions:launchOptions]; 27 | rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; 28 | 29 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 30 | UIViewController *rootViewController = [UIViewController new]; 31 | rootViewController.view = rootView; 32 | self.window.rootViewController = rootViewController; 33 | [self.window makeKeyAndVisible]; 34 | return YES; 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /source_code/ios/haha/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 21 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /source_code/ios/haha/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /source_code/ios/haha/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | CrashCourseChina 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | NSAppTransportSecurity 28 | 29 | NSExceptionDomains 30 | 31 | localhost 32 | 33 | NSExceptionAllowsInsecureHTTPLoads 34 | 35 | 36 | 37 | 38 | NSLocationWhenInUseUsageDescription 39 | 40 | UILaunchStoryboardName 41 | LaunchScreen 42 | UIRequiredDeviceCapabilities 43 | 44 | armv7 45 | 46 | UISupportedInterfaceOrientations 47 | 48 | UIInterfaceOrientationPortrait 49 | UIInterfaceOrientationLandscapeLeft 50 | UIInterfaceOrientationLandscapeRight 51 | 52 | UIViewControllerBasedStatusBarAppearance 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /source_code/ios/haha/main.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | 12 | #import "AppDelegate.h" 13 | 14 | int main(int argc, char * argv[]) { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /source_code/ios/hahaTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /source_code/ios/hahaTests/hahaTests.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | #import 12 | 13 | #import 14 | #import 15 | 16 | #define TIMEOUT_SECONDS 600 17 | #define TEXT_TO_LOOK_FOR @"Welcome to React Native!" 18 | 19 | @interface hahaTests : XCTestCase 20 | 21 | @end 22 | 23 | @implementation hahaTests 24 | 25 | - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test 26 | { 27 | if (test(view)) { 28 | return YES; 29 | } 30 | for (UIView *subview in [view subviews]) { 31 | if ([self findSubviewInView:subview matching:test]) { 32 | return YES; 33 | } 34 | } 35 | return NO; 36 | } 37 | 38 | - (void)testRendersWelcomeScreen 39 | { 40 | UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; 41 | NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; 42 | BOOL foundElement = NO; 43 | 44 | __block NSString *redboxError = nil; 45 | RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { 46 | if (level >= RCTLogLevelError) { 47 | redboxError = message; 48 | } 49 | }); 50 | 51 | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { 52 | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 53 | [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 54 | 55 | foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { 56 | if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { 57 | return YES; 58 | } 59 | return NO; 60 | }]; 61 | } 62 | 63 | RCTSetLogFunction(RCTDefaultLogFunction); 64 | 65 | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); 66 | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); 67 | } 68 | 69 | 70 | @end 71 | -------------------------------------------------------------------------------- /source_code/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "haha", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "node node_modules/react-native/local-cli/cli.js start", 7 | "test": "jest" 8 | }, 9 | "dependencies": { 10 | "install": "^0.12.2", 11 | "npm": "^6.9.0", 12 | "react": "16.8.6", 13 | "react-native": "^0.59.9", 14 | "react-native-gesture-handler": "^1.3.0", 15 | "react-native-grid-component": "^2.0.0", 16 | "react-navigation": "^3.11.0" 17 | }, 18 | "devDependencies": { 19 | "babel-jest": "24.8.0", 20 | "babel-preset-react-native": "5.0.0", 21 | "jest": "24.8.0", 22 | "react-test-renderer": "16.8.6" 23 | }, 24 | "jest": { 25 | "preset": "react-native" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /source_code/src/AboutScreen.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Text, Platform, View, StyleSheet, Dimensions } from 'react-native'; 3 | import Api_list from './Api'; 4 | 5 | export default class NoteScreen extends React.Component { 6 | static navigationOptions = ({ navigation }) => { 7 | if (Platform.OS === 'ios'){ 8 | return { 9 | title: '说明', 10 | }; 11 | } else { 12 | return { 13 | title: '说明', 14 | header: null, 15 | }; 16 | } 17 | }; 18 | 19 | render() { 20 | const url = Api_list.note_url; 21 | return ( 22 | 23 | 本 App 由 Crash Course 字幕组维护 24 | Q群 305631757 25 | 邮件 guokrfans@gmail.com 26 | 源代码 27 | https://github.com/1c7/CrashCourse-Android-App 28 | 想要夜间模式可以来写代码 29 | 30 | ); 31 | } 32 | 33 | } 34 | const styles = StyleSheet.create({ 35 | container: { 36 | height: Dimensions.get('window').height, 37 | justifyContent: 'center', 38 | alignItems: 'center', 39 | }, 40 | }) -------------------------------------------------------------------------------- /source_code/src/Api.js: -------------------------------------------------------------------------------- 1 | // API 地址全放这里 2 | 3 | var root_url = 'https://api.crashcourse.club'; 4 | 5 | export default Api_list = { 6 | newest_url: root_url + `/api/newest`, 7 | serie_url: root_url + "/api/series", 8 | single_serie_url: root_url + "/api/serie/", 9 | note_url: root_url + "/about_cc", 10 | weibo_url: 'https://weibo.com/u/5237129097/home?wvr=5' 11 | }; 12 | 13 | -------------------------------------------------------------------------------- /source_code/src/CategoryListScreen.js: -------------------------------------------------------------------------------- 1 | // 点击“系列”里任意一个方块显示的列表 2 | // 完全复制自 HomeScreen.js 做了些 3 | // 没做分页 4 | import React from 'react'; 5 | import { 6 | StyleSheet, 7 | Text, 8 | View, 9 | WebView, 10 | FlatList, 11 | Button, 12 | TouchableOpacity, 13 | ActivityIndicator, 14 | Image, 15 | Linking 16 | } from 'react-native'; 17 | import Api_list from './Api'; 18 | 19 | export default class CategoryListScreen extends React.Component { 20 | constructor(props) { 21 | super(props); 22 | this.state = { 23 | isLoading: true, 24 | data: [], // 列表的数据 25 | page: 1, 26 | refreshing: false, 27 | isEmpty: false 28 | }; 29 | } 30 | static navigationOptions = ({ navigation }) => { 31 | const {state, setParams} = navigation; 32 | return { 33 | title: `${navigation.state.params.serie_title}`, 34 | }; 35 | }; 36 | 37 | componentDidMount() { 38 | this.makeRemoteRequest(); 39 | } 40 | // 发请求 41 | makeRemoteRequest = () => { 42 | const { params } = this.props.navigation.state; 43 | const url = `${Api_list.single_serie_url}${params.serie_id}`; 44 | this.setState({ refreshing: true }); 45 | fetch(url) 46 | .then(res => res.json()) 47 | .then(res => { 48 | this.setState({ 49 | data: res, 50 | isLoading: false, 51 | refreshing: false, 52 | }); 53 | }) 54 | .catch(error => { 55 | this.setState({isLoading: false, refreshing: true }); 56 | console.log('CategoryList catch error'); 57 | }); 58 | }; 59 | 60 | _renderItem(item) { 61 | // 如果标题太长, 就切断变成 ... 62 | var length = 14; 63 | const trimmedString = item.title.length > length ? 64 | item.title.substring(0, length - 3) + "..." : 65 | item.title; 66 | return ( 67 | 68 | Linking.openURL(item.video_link)}> 71 | 75 | 76 | 77 | 第 {item.number} 集 78 | 79 | 80 | {item.title} 81 | 82 | 83 | 84 | 85 | ) 86 | } 87 | render() { 88 | if (this.state.isLoading) { 89 | return ( 90 | 91 | 92 | 93 | ); 94 | } 95 | if (this.state.data.length == 0) { 96 | return ( 97 | 98 | 一集也没有, 摊手 99 | 100 | ); 101 | } 102 | const { navigate } = this.props.navigation; 103 | return ( 104 | 105 | item.id} 108 | navigation = { navigate } 109 | renderItem = { ({item}) => this._renderItem(item) } 110 | onEndReached = {this.handleLoadMore} 111 | onEndReachedThreshold = {30} 112 | refreshing = {this.state.refreshing} 113 | /> 114 | 115 | ) 116 | } 117 | // 载入下一页 118 | handleLoadMore = () => { 119 | this.setState({ 120 | page: this.state.page + 1 121 | }, () => { 122 | this.makeRemoteRequest(); 123 | }) 124 | } 125 | } 126 | 127 | const styles = StyleSheet.create({ 128 | container: { 129 | flex: 1, 130 | justifyContent: 'center', 131 | alignItems: 'stretch', // 全宽 132 | }, 133 | serieText: { 134 | fontSize: 12, 135 | }, 136 | serieNumber: { 137 | fontSize: 12, 138 | }, 139 | bodyText: { 140 | fontSize: 14, 141 | fontWeight: 'bold', 142 | }, 143 | translatorText: { 144 | fontSize: 11, 145 | color: '#888', 146 | } 147 | }); -------------------------------------------------------------------------------- /source_code/src/CategoryScreen.js: -------------------------------------------------------------------------------- 1 | // "系列" - 那些方块 2 | import React, { Component } from 'react'; 3 | import { 4 | StyleSheet, 5 | View, 6 | Text, 7 | TouchableOpacity, 8 | Platform, 9 | ImageBackground, 10 | } from 'react-native'; 11 | import Api_list from './Api'; 12 | 13 | // 这个 Grid 来自 https://github.com/phil-r/react-native-grid-component 14 | import Grid from 'react-native-grid-component'; 15 | 16 | export default class CategoryScreen extends Component { 17 | constructor(props) { 18 | super(props); 19 | this.state = { 20 | isLoading: true, 21 | data: [], // 列表数据 22 | page: 1, 23 | refreshing: false 24 | }; 25 | } 26 | static navigationOptions = ({ navigation }) => { 27 | if (Platform.OS === 'ios'){ 28 | return { 29 | title: '系列', 30 | }; 31 | } else { 32 | return { 33 | title: '系列', 34 | header: null, 35 | }; 36 | } 37 | }; 38 | componentDidMount() { 39 | this.makeRemoteRequest(); 40 | } 41 | // 发请求 42 | makeRemoteRequest = () => { 43 | const url = Api_list.serie_url; 44 | this.setState({ refreshing: true }); 45 | fetch(url) 46 | .then(res => res.json()) 47 | .then(res => { 48 | this.setState({ 49 | data: res, 50 | isLoading: false, 51 | refreshing: false, 52 | }); 53 | }) 54 | .catch(error => { 55 | this.setState({isLoading: false, refreshing: true }); 56 | console.log('2Networking fail or result is empty'); 57 | }); 58 | }; 59 | 60 | _renderItem = (data, i) => 61 | this.props.navigation.navigate('CategoryList', {serie_id: data.id, serie_title:data.title})}> 63 | 64 | 65 | 66 | 67 | {data.title} 68 | {data.english_name} 69 | 70 | {data.subtitle} 71 | 72 | 73 | 74 | 75 | 76 | render() { 77 | const { navigate } = this.props.navigation; 78 | return ( 79 | 85 | ); 86 | } 87 | } 88 | 89 | const styles = StyleSheet.create({ 90 | container: { 91 | backgroundColor: 'black', 92 | flex: 1, 93 | height: 160, 94 | margin: 1, 95 | }, 96 | list: { 97 | flex: 1 98 | }, 99 | image:{ 100 | flex: 1, 101 | width: undefined, 102 | height: undefined, 103 | backgroundColor:'transparent', 104 | justifyContent: 'center', 105 | alignItems: 'center', 106 | }, 107 | text:{ 108 | fontWeight: "bold", 109 | fontSize: 18, 110 | color: 'white', 111 | }, 112 | en_text:{ 113 | fontSize: 14, 114 | color: 'white', 115 | }, 116 | subtitle_text:{ 117 | fontSize: 12, 118 | color: 'white', 119 | paddingBottom: 10, 120 | }, 121 | overlayTextView:{ 122 | flex: 1, 123 | justifyContent: 'center', 124 | alignItems: 'center', 125 | paddingTop: 20, 126 | }, 127 | overlay: { 128 | position: 'absolute', 129 | top: 0, 130 | right: 0, 131 | bottom: 0, 132 | left: 0, 133 | backgroundColor: 'black', 134 | opacity: 0.7 135 | } 136 | }); -------------------------------------------------------------------------------- /source_code/src/CrashCourseDrawer.js: -------------------------------------------------------------------------------- 1 | // 侧边栏 2019-6-7 废弃 2 | // 因为 React Navigation 从 1.0 升级到 3.0 我今天懒得改 3 | import React from 'react'; 4 | import { 5 | Image, 6 | StyleSheet, 7 | Text, 8 | View, 9 | TouchableOpacity, 10 | Linking 11 | } from 'react-native'; 12 | import Api_list from './Api'; 13 | 14 | export default class CrashCourseDrawer extends React.Component { 15 | render(){ 16 | const weibo = Api_list.weibo_url; 17 | const note = Api_list.note_url; 18 | return( 19 | 20 | {/* // */} 21 | 22 | 23 | 24 | 25 | 26 | 27 | Don't forget to be Awesome 28 | 29 | 30 | 31 | 32 | Linking.openURL(note)} style={styles.weiboItem}> 33 | 34 | 说明 35 | 36 | Linking.openURL(weibo)} style={styles.weiboItem}> 37 | 38 | Crash Course 字幕组 39 | 40 | 41 | {/* */} 42 | 43 | ) 44 | } 45 | }; 46 | 47 | 48 | // 侧边菜单 TODO Feature (有想法,不一定做) 49 | // icon + 说明(就可以拿掉第三个 "说明" 的 tab 了) 50 | // icon + 字幕组新浪微博 51 | // icon + 官方 Patron 52 | // 译者列表(排名不分先后) 53 | 54 | const styles = StyleSheet.create({ 55 | icon: { 56 | width: 24, 57 | height: 24, 58 | }, 59 | container: { 60 | flex: 1, 61 | width: null, 62 | height: null, 63 | resizeMode: 'cover', 64 | justifyContent: 'flex-start', 65 | alignItems:'flex-start' 66 | }, 67 | bigLogoContainer: { 68 | height: 140, 69 | width: 240, 70 | backgroundColor:'transparent', 71 | flex: 2, 72 | justifyContent:'center', 73 | alignItems:'center', 74 | marginLeft: 10 75 | }, 76 | bigLogo:{ 77 | resizeMode: 'contain', 78 | width: 180 79 | }, 80 | bottomContainer: { 81 | width:240, 82 | flex: 2, 83 | justifyContent:"flex-end", 84 | alignItems:'center', 85 | backgroundColor: 'transparent', 86 | flexDirection:'column' 87 | }, 88 | weiboItem:{ 89 | width:240, 90 | height: 46, 91 | flexDirection:'row', 92 | backgroundColor:'#00000066', 93 | justifyContent:'flex-start', 94 | alignItems:'center', 95 | alignSelf:'flex-end', 96 | paddingLeft: 40 97 | } 98 | }); -------------------------------------------------------------------------------- /source_code/src/HomeScreen.js: -------------------------------------------------------------------------------- 1 | // 最新 2 | import React from 'react'; 3 | import { 4 | StyleSheet, 5 | Text, 6 | View, 7 | FlatList, 8 | Button, 9 | TouchableOpacity, 10 | ActivityIndicator, 11 | Image, 12 | Linking, 13 | Platform 14 | } from 'react-native'; 15 | import Api_list from './Api'; 16 | 17 | export default class HomeScreen extends React.Component { 18 | constructor(props) { 19 | super(props); 20 | this.state = { 21 | isLoading: true, 22 | data: [], // 列表的数据 23 | page: 1, 24 | refreshing: false 25 | }; 26 | } 27 | static navigationOptions = ({ navigation }) => { 28 | const {state, setParams} = navigation; 29 | if (Platform.OS === 'ios'){ 30 | return { 31 | headerRight: