├── .flowconfig
├── .gitignore
├── .npmignore
├── App
├── Config
│ ├── api.js
│ └── config.js
└── Views
│ ├── Detail
│ ├── index.js
│ └── style.js
│ └── List
│ ├── Elements
│ └── Cell
│ │ ├── index.js
│ │ └── style.js
│ ├── index.js
│ └── style.js
├── README.md
├── iOS
├── ZhihuDaily.xcodeproj
│ ├── project.pbxproj
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── ZhihuDaily.xcscheme
├── ZhihuDaily
│ ├── AppDelegate.h
│ ├── AppDelegate.m
│ ├── Base.lproj
│ │ └── LaunchScreen.xib
│ ├── Images.xcassets
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Info.plist
│ ├── main.jsbundle
│ └── main.m
└── ZhihuDailyTests
│ ├── Info.plist
│ └── ZhihuDailyTests.m
├── index.ios.js
├── list_screenshot.png
└── package.json
/.flowconfig:
--------------------------------------------------------------------------------
1 | [ignore]
2 |
3 | # We fork some components by platform.
4 | .*/*.web.js
5 | .*/*.android.js
6 |
7 | # Some modules have their own node_modules with overlap
8 | .*/node_modules/node-haste/.*
9 |
10 | # Ignore react-tools where there are overlaps, but don't ignore anything that
11 | # react-native relies on
12 | .*/node_modules/react-tools/src/React.js
13 | .*/node_modules/react-tools/src/renderers/shared/event/EventPropagators.js
14 | .*/node_modules/react-tools/src/renderers/shared/event/eventPlugins/ResponderEventPlugin.js
15 | .*/node_modules/react-tools/src/shared/vendor/core/ExecutionEnvironment.js
16 |
17 |
18 | # Ignore commoner tests
19 | .*/node_modules/commoner/test/.*
20 |
21 | # See https://github.com/facebook/flow/issues/442
22 | .*/react-tools/node_modules/commoner/lib/reader.js
23 |
24 | # Ignore jest
25 | .*/react-native/node_modules/jest-cli/.*
26 |
27 | [include]
28 |
29 | [libs]
30 | node_modules/react-native/Libraries/react-native/react-native-interface.js
31 |
32 | [options]
33 | module.system=haste
34 |
35 | munge_underscores=true
36 |
37 | suppress_type=$FlowIssue
38 | suppress_type=$FlowFixMe
39 | suppress_type=$FixMe
40 |
41 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(1[0-4]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
42 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(1[0-4]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)? #[0-9]+
43 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
44 |
45 | [version]
46 | 0.14.0
47 |
--------------------------------------------------------------------------------
/.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 | # node.js
26 | #
27 | node_modules/
28 | npm-debug.log
29 |
30 | .idea/
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
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 |
24 | # node.js
25 | #
26 | node_modules/
27 | npm-debug.log
28 |
--------------------------------------------------------------------------------
/App/Config/api.js:
--------------------------------------------------------------------------------
1 | var config = require('./config');
2 |
3 | exports.latest = config.apiHost + 'news/latest';
4 | exports.detail = config.apiHost + 'news/';
5 |
--------------------------------------------------------------------------------
/App/Config/config.js:
--------------------------------------------------------------------------------
1 | // Exports configurations
2 |
3 | module.exports = {
4 | apiHost: 'http://news-at.zhihu.com/api/3/'
5 | };
6 |
--------------------------------------------------------------------------------
/App/Views/Detail/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var React = require('react-native');
4 | var HTMLView = require('react-native-htmlview');
5 |
6 | var {
7 | View,
8 | Text,
9 | Image,
10 | ScrollView,
11 | StyleSheet
12 | } = React;
13 |
14 | var api = require('../../Config/api');
15 | var styles = require('./style');
16 |
17 | module.exports = React.createClass({
18 |
19 | getInitialState: function () {
20 | return {
21 | loaded: false
22 | }
23 | },
24 |
25 | componentDidMount: function () {
26 | this.fetchData();
27 | },
28 |
29 | fetchData: function () {
30 | fetch(api.detail + this.props.id)
31 | .then((response) => response.json())
32 | .then((responseData) => {
33 | this.setState({
34 | loaded: true,
35 | data: responseData
36 | });
37 | }).done();
38 | },
39 |
40 | render: function () {
41 | if (!this.state.loaded) {
42 | return (
43 |
44 | 载入中...
45 |
46 | );
47 | }
48 |
49 | var data = this.state.data;
50 |
51 | return (
52 |
53 |
54 |
55 | {data.title}
56 | 图片:{data.image_source}
57 |
58 |
59 |
60 | );
61 | }
62 |
63 | });
64 |
65 | var htmlStyle = StyleSheet.create({
66 | h1: {
67 | margin: 0
68 | },
69 | a: {
70 | color: '#00bbcc'
71 | },
72 | mainWrap: {
73 | flex: 1,
74 | justifyContent: 'center'
75 | },
76 | heading: {
77 | color: 'red'
78 | },
79 | headingContent: {
80 | color: 'blue'
81 | }
82 | });
--------------------------------------------------------------------------------
/App/Views/Detail/style.js:
--------------------------------------------------------------------------------
1 | var React = require('react-native');
2 |
3 | var {
4 | StyleSheet,
5 | Dimensions
6 | } = React;
7 |
8 | var window = Dimensions.get('window');
9 |
10 | module.exports = StyleSheet.create({
11 | loadingContainer: {
12 | marginTop: 64
13 | },
14 | container: {
15 | flex: 1
16 | },
17 | header: {
18 | position: 'relative',
19 | backgroundColor: 'transparent',
20 | height: 200
21 | },
22 | headerGradient: {
23 | height: 200,
24 | width: window.width
25 | },
26 | image: {
27 | flex: 1,
28 | height: 200,
29 | width: window.width
30 | },
31 | title: {
32 | position: 'absolute',
33 | fontSize: 20,
34 | color: 'white',
35 | bottom: 30,
36 | left: 10,
37 | width: window.width - 20
38 | },
39 | imageSource: {
40 | position: 'absolute',
41 | fontSize: 12,
42 | color: 'white',
43 | bottom: 10,
44 | right: 10
45 | },
46 | loadingText: {
47 | fontSize: 20,
48 | textAlign: 'center',
49 | marginTop: 10,
50 | marginBottom: 10,
51 | marginRight: 10,
52 | color: '#008bed'
53 | },
54 | htmlView: {
55 | padding: 10
56 | }
57 | });
58 |
--------------------------------------------------------------------------------
/App/Views/List/Elements/Cell/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var React = require('react-native');
4 |
5 | var {
6 | Text,
7 | View,
8 | Image,
9 | TouchableHighlight
10 | } = React;
11 |
12 | var styles = require('./style');
13 |
14 | module.exports = React.createClass({
15 | render: function () {
16 | return (
17 |
20 |
21 |
22 | {this.props.news.title}
23 |
24 |
25 |
26 |
27 | );
28 | }
29 | });
30 |
--------------------------------------------------------------------------------
/App/Views/List/Elements/Cell/style.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var {
4 | StyleSheet,
5 | Dimensions
6 | } = require('react-native');
7 |
8 | module.exports = StyleSheet.create({
9 | cell: {
10 | flex: 1,
11 | flexDirection: 'row',
12 | marginLeft: 20,
13 | marginRight: 20,
14 | paddingTop: 10,
15 | paddingBottom: 10,
16 | borderBottomColor: '#dddddd',
17 | borderBottomWidth: 0.5,
18 | height: 80
19 | },
20 | text: {
21 | fontSize: 16,
22 | color: '#333333',
23 | textAlign: 'left',
24 | width: Dimensions.get('window').width - 110
25 | },
26 | image: {
27 | width: 60,
28 | height: 60,
29 | right: 0
30 | }
31 | });
32 |
--------------------------------------------------------------------------------
/App/Views/List/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | // Module dependencies
4 | var React = require('react-native');
5 | var Swiper = require('react-native-swiper');
6 |
7 | var {
8 | Text,
9 | View,
10 | ListView,
11 | Image
12 | } = React;
13 |
14 | var api = require('../../Config/api');
15 | var styles = require('./style');
16 | var CellView = require('./Elements/Cell');
17 | var DetailView = require('../Detail');
18 |
19 | module.exports = React.createClass({
20 | getInitialState: function () {
21 | return {
22 | dataSource: new ListView.DataSource({ rowHasChanged: (row1, row2) => row1 !== row2 }),
23 | loaded: false
24 | }
25 | },
26 |
27 | componentDidMount: function () {
28 | this.fetchData()
29 | },
30 |
31 | fetchData: function () {
32 | fetch(api.latest)
33 | .then((response) => response.json())
34 | .then((responseData) => {
35 | this.setState({
36 | stories: this.state.dataSource.cloneWithRows(responseData.stories),
37 | topStories: responseData.top_stories,
38 | loaded: true
39 | });
40 | })
41 | .done();
42 | },
43 |
44 | render: function () {
45 | if (!this.state.loaded) {
46 | return (
47 |
48 | 载入中...
49 |
50 | );
51 | }
52 |
53 | return this.renderListView();
54 | },
55 |
56 | renderSwiper: function () {
57 | return (
58 | }
62 | activeDot={}
63 | showButtons={true}
64 | paginationStyle={{
65 | bottom: 5
66 | }}>
67 | {this.state.topStories.map(function (story) {
68 | return (
69 | this.selectCell(story)}>
70 |
72 | {story.title}
73 |
74 | );
75 | })}
76 |
77 | );
78 | },
79 |
80 | renderListView: function () {
81 | return (
82 |
87 | );
88 | },
89 |
90 | renderCell: function (story) {
91 | return (
92 | this.selectCell(story) } />
94 | )
95 | },
96 |
97 | selectCell: function (story) {
98 | this.props.navigator.push({
99 | title: story.title,
100 | component: DetailView,
101 | passProps: {
102 | id: story.id
103 | }
104 | });
105 | }
106 |
107 | });
108 |
--------------------------------------------------------------------------------
/App/Views/List/style.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var React = require('react-native');
4 |
5 | var {
6 | StyleSheet,
7 | Dimensions
8 | } = React;
9 |
10 | module.exports = StyleSheet.create({
11 | container: {
12 | flex: 1,
13 | marginTop: 64,
14 | backgroundColor: 'white',
15 | flexDirection: 'column',
16 | justifyContent: 'flex-start'
17 | },
18 | list: {
19 |
20 | },
21 | centerText: {
22 | alignItems: 'center'
23 | },
24 | loadingText: {
25 | fontSize: 20,
26 | textAlign: 'center',
27 | marginTop: 10,
28 | marginBottom: 10,
29 | marginRight: 10,
30 | color: '#008bed'
31 | },
32 | slideImage: {
33 | width: Dimensions.get('window').width,
34 | height: 240
35 | },
36 | slideText: {
37 | bottom: 60,
38 | left: 10,
39 | color: 'white',
40 | fontSize: 20
41 | },
42 | dot: {
43 | backgroundColor: 'rgba(0,0,0,0.2)',
44 | width: 8,
45 | height: 8,
46 | borderRadius: 4,
47 | marginTop: 3,
48 | marginBottom: 3,
49 | marginLeft: 3,
50 | marginRight: 3
51 | },
52 | activeDot: {
53 | backgroundColor: 'white'
54 | },
55 | text: {
56 | color: '#fff',
57 | fontSize: 24,
58 | fontWeight: 'bold'
59 | }
60 | });
61 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Zhihu Daily
2 | ---
3 |
4 | Zhihu Daily iOS App - Made with [React Native](http://facebook.github.io/react-native/).
5 |
6 | ## Screenshot
7 |
8 |
9 |
10 | ## Develop
11 |
12 | ### API
13 |
14 | - News latest: http://news-at.zhihu.com/api/3/news/latest
15 | - News detail: http://news-at.zhihu.com/api/3/news/:id
16 |
17 | ### Run the App
18 |
19 | 1. Clone the project: `git clone git@github.com:Fantasy0/ZhihuDaily.git`
20 | 2. Install dependencies: `npm install`
21 | 3. Open the ZhihuDaily.xcodeproj with XCode
22 | 4. Click the run button
23 |
24 | ## Components used
25 |
26 | - [react-native-swiper](https://github.com/leecade/react-native-swiper)
27 | - [react-native-htmlview](https://github.com/jsdf/react-native-htmlview)
28 |
29 | ## License
30 |
31 | The MIT License
32 |
--------------------------------------------------------------------------------
/iOS/ZhihuDaily.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 008F07F31AC5B25A0029DE68 /* main.jsbundle in Resources */ = {isa = PBXBuildFile; fileRef = 008F07F21AC5B25A0029DE68 /* main.jsbundle */; };
11 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
12 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };
13 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };
14 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
15 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
16 | 00E356F31AD99517003FC87E /* ZhihuDailyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* ZhihuDailyTests.m */; };
17 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
18 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
19 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };
20 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
21 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
22 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
23 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
24 | 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
25 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
26 | /* End PBXBuildFile section */
27 |
28 | /* Begin PBXContainerItemProxy section */
29 | 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = {
30 | isa = PBXContainerItemProxy;
31 | containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
32 | proxyType = 2;
33 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
34 | remoteInfo = RCTActionSheet;
35 | };
36 | 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = {
37 | isa = PBXContainerItemProxy;
38 | containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
39 | proxyType = 2;
40 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
41 | remoteInfo = RCTGeolocation;
42 | };
43 | 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = {
44 | isa = PBXContainerItemProxy;
45 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
46 | proxyType = 2;
47 | remoteGlobalIDString = 58B5115D1A9E6B3D00147676;
48 | remoteInfo = RCTImage;
49 | };
50 | 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = {
51 | isa = PBXContainerItemProxy;
52 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
53 | proxyType = 2;
54 | remoteGlobalIDString = 58B511DB1A9E6C8500147676;
55 | remoteInfo = RCTNetwork;
56 | };
57 | 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = {
58 | isa = PBXContainerItemProxy;
59 | containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
60 | proxyType = 2;
61 | remoteGlobalIDString = 832C81801AAF6DEF007FA2F7;
62 | remoteInfo = RCTVibration;
63 | };
64 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
65 | isa = PBXContainerItemProxy;
66 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
67 | proxyType = 1;
68 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
69 | remoteInfo = ZhihuDaily;
70 | };
71 | 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {
72 | isa = PBXContainerItemProxy;
73 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
74 | proxyType = 2;
75 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
76 | remoteInfo = RCTSettings;
77 | };
78 | 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = {
79 | isa = PBXContainerItemProxy;
80 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
81 | proxyType = 2;
82 | remoteGlobalIDString = 3C86DF461ADF2C930047B81A;
83 | remoteInfo = RCTWebSocket;
84 | };
85 | 146834031AC3E56700842450 /* PBXContainerItemProxy */ = {
86 | isa = PBXContainerItemProxy;
87 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
88 | proxyType = 2;
89 | remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;
90 | remoteInfo = React;
91 | };
92 | 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {
93 | isa = PBXContainerItemProxy;
94 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
95 | proxyType = 2;
96 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
97 | remoteInfo = RCTLinking;
98 | };
99 | 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = {
100 | isa = PBXContainerItemProxy;
101 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
102 | proxyType = 2;
103 | remoteGlobalIDString = 58B5119B1A9E6C1200147676;
104 | remoteInfo = RCTText;
105 | };
106 | /* End PBXContainerItemProxy section */
107 |
108 | /* Begin PBXFileReference section */
109 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; };
110 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = ../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj; sourceTree = ""; };
111 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = ../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj; sourceTree = ""; };
112 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = ../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj; sourceTree = ""; };
113 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = ../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj; sourceTree = ""; };
114 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = ../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj; sourceTree = ""; };
115 | 00E356EE1AD99517003FC87E /* ZhihuDailyTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ZhihuDailyTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
116 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
117 | 00E356F21AD99517003FC87E /* ZhihuDailyTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ZhihuDailyTests.m; sourceTree = ""; };
118 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = ../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj; sourceTree = ""; };
119 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = ../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj; sourceTree = ""; };
120 | 13B07F961A680F5B00A75B9A /* ZhihuDaily.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ZhihuDaily.app; sourceTree = BUILT_PRODUCTS_DIR; };
121 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
122 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
123 | 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; };
124 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
125 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
126 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
127 | 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = ../node_modules/react-native/React/React.xcodeproj; sourceTree = ""; };
128 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = ../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj; sourceTree = ""; };
129 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = ../node_modules/react-native/Libraries/Text/RCTText.xcodeproj; sourceTree = ""; };
130 | /* End PBXFileReference section */
131 |
132 | /* Begin PBXFrameworksBuildPhase section */
133 | 00E356EB1AD99517003FC87E /* Frameworks */ = {
134 | isa = PBXFrameworksBuildPhase;
135 | buildActionMask = 2147483647;
136 | files = (
137 | );
138 | runOnlyForDeploymentPostprocessing = 0;
139 | };
140 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
141 | isa = PBXFrameworksBuildPhase;
142 | buildActionMask = 2147483647;
143 | files = (
144 | 146834051AC3E58100842450 /* libReact.a in Frameworks */,
145 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,
146 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,
147 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,
148 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,
149 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,
150 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,
151 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
152 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
153 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
154 | );
155 | runOnlyForDeploymentPostprocessing = 0;
156 | };
157 | /* End PBXFrameworksBuildPhase section */
158 |
159 | /* Begin PBXGroup section */
160 | 00C302A81ABCB8CE00DB3ED1 /* Products */ = {
161 | isa = PBXGroup;
162 | children = (
163 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */,
164 | );
165 | name = Products;
166 | sourceTree = "";
167 | };
168 | 00C302B61ABCB90400DB3ED1 /* Products */ = {
169 | isa = PBXGroup;
170 | children = (
171 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */,
172 | );
173 | name = Products;
174 | sourceTree = "";
175 | };
176 | 00C302BC1ABCB91800DB3ED1 /* Products */ = {
177 | isa = PBXGroup;
178 | children = (
179 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,
180 | );
181 | name = Products;
182 | sourceTree = "";
183 | };
184 | 00C302D41ABCB9D200DB3ED1 /* Products */ = {
185 | isa = PBXGroup;
186 | children = (
187 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,
188 | );
189 | name = Products;
190 | sourceTree = "";
191 | };
192 | 00C302E01ABCB9EE00DB3ED1 /* Products */ = {
193 | isa = PBXGroup;
194 | children = (
195 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */,
196 | );
197 | name = Products;
198 | sourceTree = "";
199 | };
200 | 00E356EF1AD99517003FC87E /* ZhihuDailyTests */ = {
201 | isa = PBXGroup;
202 | children = (
203 | 00E356F21AD99517003FC87E /* ZhihuDailyTests.m */,
204 | 00E356F01AD99517003FC87E /* Supporting Files */,
205 | );
206 | path = ZhihuDailyTests;
207 | sourceTree = "";
208 | };
209 | 00E356F01AD99517003FC87E /* Supporting Files */ = {
210 | isa = PBXGroup;
211 | children = (
212 | 00E356F11AD99517003FC87E /* Info.plist */,
213 | );
214 | name = "Supporting Files";
215 | sourceTree = "";
216 | };
217 | 139105B71AF99BAD00B5F7CC /* Products */ = {
218 | isa = PBXGroup;
219 | children = (
220 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,
221 | );
222 | name = Products;
223 | sourceTree = "";
224 | };
225 | 139FDEE71B06529A00C62182 /* Products */ = {
226 | isa = PBXGroup;
227 | children = (
228 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,
229 | );
230 | name = Products;
231 | sourceTree = "";
232 | };
233 | 13B07FAE1A68108700A75B9A /* ZhihuDaily */ = {
234 | isa = PBXGroup;
235 | children = (
236 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
237 | 13B07FB01A68108700A75B9A /* AppDelegate.m */,
238 | 13B07FB51A68108700A75B9A /* Images.xcassets */,
239 | 13B07FB61A68108700A75B9A /* Info.plist */,
240 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
241 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */,
242 | 13B07FB71A68108700A75B9A /* main.m */,
243 | );
244 | path = ZhihuDaily;
245 | sourceTree = "";
246 | };
247 | 146834001AC3E56700842450 /* Products */ = {
248 | isa = PBXGroup;
249 | children = (
250 | 146834041AC3E56700842450 /* libReact.a */,
251 | );
252 | name = Products;
253 | sourceTree = "";
254 | };
255 | 78C398B11ACF4ADC00677621 /* Products */ = {
256 | isa = PBXGroup;
257 | children = (
258 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */,
259 | );
260 | name = Products;
261 | sourceTree = "";
262 | };
263 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
264 | isa = PBXGroup;
265 | children = (
266 | 146833FF1AC3E56700842450 /* React.xcodeproj */,
267 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
268 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,
269 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,
270 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,
271 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */,
272 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,
273 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,
274 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,
275 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,
276 | );
277 | name = Libraries;
278 | sourceTree = "";
279 | };
280 | 832341B11AAA6A8300B99B32 /* Products */ = {
281 | isa = PBXGroup;
282 | children = (
283 | 832341B51AAA6A8300B99B32 /* libRCTText.a */,
284 | );
285 | name = Products;
286 | sourceTree = "";
287 | };
288 | 83CBB9F61A601CBA00E9B192 = {
289 | isa = PBXGroup;
290 | children = (
291 | 13B07FAE1A68108700A75B9A /* ZhihuDaily */,
292 | 00E356EF1AD99517003FC87E /* ZhihuDailyTests */,
293 | 832341AE1AAA6A7D00B99B32 /* Libraries */,
294 | 83CBBA001A601CBA00E9B192 /* Products */,
295 | );
296 | indentWidth = 2;
297 | sourceTree = "";
298 | tabWidth = 2;
299 | };
300 | 83CBBA001A601CBA00E9B192 /* Products */ = {
301 | isa = PBXGroup;
302 | children = (
303 | 13B07F961A680F5B00A75B9A /* ZhihuDaily.app */,
304 | 00E356EE1AD99517003FC87E /* ZhihuDailyTests.xctest */,
305 | );
306 | name = Products;
307 | sourceTree = "";
308 | };
309 | /* End PBXGroup section */
310 |
311 | /* Begin PBXNativeTarget section */
312 | 00E356ED1AD99517003FC87E /* ZhihuDailyTests */ = {
313 | isa = PBXNativeTarget;
314 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ZhihuDailyTests" */;
315 | buildPhases = (
316 | 00E356EA1AD99517003FC87E /* Sources */,
317 | 00E356EB1AD99517003FC87E /* Frameworks */,
318 | 00E356EC1AD99517003FC87E /* Resources */,
319 | );
320 | buildRules = (
321 | );
322 | dependencies = (
323 | 00E356F51AD99517003FC87E /* PBXTargetDependency */,
324 | );
325 | name = ZhihuDailyTests;
326 | productName = ZhihuDailyTests;
327 | productReference = 00E356EE1AD99517003FC87E /* ZhihuDailyTests.xctest */;
328 | productType = "com.apple.product-type.bundle.unit-test";
329 | };
330 | 13B07F861A680F5B00A75B9A /* ZhihuDaily */ = {
331 | isa = PBXNativeTarget;
332 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ZhihuDaily" */;
333 | buildPhases = (
334 | 13B07F871A680F5B00A75B9A /* Sources */,
335 | 13B07F8C1A680F5B00A75B9A /* Frameworks */,
336 | 13B07F8E1A680F5B00A75B9A /* Resources */,
337 | );
338 | buildRules = (
339 | );
340 | dependencies = (
341 | );
342 | name = ZhihuDaily;
343 | productName = "Hello World";
344 | productReference = 13B07F961A680F5B00A75B9A /* ZhihuDaily.app */;
345 | productType = "com.apple.product-type.application";
346 | };
347 | /* End PBXNativeTarget section */
348 |
349 | /* Begin PBXProject section */
350 | 83CBB9F71A601CBA00E9B192 /* Project object */ = {
351 | isa = PBXProject;
352 | attributes = {
353 | LastUpgradeCheck = 0610;
354 | ORGANIZATIONNAME = Facebook;
355 | TargetAttributes = {
356 | 00E356ED1AD99517003FC87E = {
357 | CreatedOnToolsVersion = 6.2;
358 | TestTargetID = 13B07F861A680F5B00A75B9A;
359 | };
360 | };
361 | };
362 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ZhihuDaily" */;
363 | compatibilityVersion = "Xcode 3.2";
364 | developmentRegion = English;
365 | hasScannedForEncodings = 0;
366 | knownRegions = (
367 | en,
368 | Base,
369 | );
370 | mainGroup = 83CBB9F61A601CBA00E9B192;
371 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
372 | projectDirPath = "";
373 | projectReferences = (
374 | {
375 | ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;
376 | ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
377 | },
378 | {
379 | ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;
380 | ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
381 | },
382 | {
383 | ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */;
384 | ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
385 | },
386 | {
387 | ProductGroup = 78C398B11ACF4ADC00677621 /* Products */;
388 | ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
389 | },
390 | {
391 | ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;
392 | ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
393 | },
394 | {
395 | ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;
396 | ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
397 | },
398 | {
399 | ProductGroup = 832341B11AAA6A8300B99B32 /* Products */;
400 | ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
401 | },
402 | {
403 | ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */;
404 | ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
405 | },
406 | {
407 | ProductGroup = 139FDEE71B06529A00C62182 /* Products */;
408 | ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
409 | },
410 | {
411 | ProductGroup = 146834001AC3E56700842450 /* Products */;
412 | ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
413 | },
414 | );
415 | projectRoot = "";
416 | targets = (
417 | 13B07F861A680F5B00A75B9A /* ZhihuDaily */,
418 | 00E356ED1AD99517003FC87E /* ZhihuDailyTests */,
419 | );
420 | };
421 | /* End PBXProject section */
422 |
423 | /* Begin PBXReferenceProxy section */
424 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = {
425 | isa = PBXReferenceProxy;
426 | fileType = archive.ar;
427 | path = libRCTActionSheet.a;
428 | remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */;
429 | sourceTree = BUILT_PRODUCTS_DIR;
430 | };
431 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = {
432 | isa = PBXReferenceProxy;
433 | fileType = archive.ar;
434 | path = libRCTGeolocation.a;
435 | remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */;
436 | sourceTree = BUILT_PRODUCTS_DIR;
437 | };
438 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = {
439 | isa = PBXReferenceProxy;
440 | fileType = archive.ar;
441 | path = libRCTImage.a;
442 | remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */;
443 | sourceTree = BUILT_PRODUCTS_DIR;
444 | };
445 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = {
446 | isa = PBXReferenceProxy;
447 | fileType = archive.ar;
448 | path = libRCTNetwork.a;
449 | remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */;
450 | sourceTree = BUILT_PRODUCTS_DIR;
451 | };
452 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = {
453 | isa = PBXReferenceProxy;
454 | fileType = archive.ar;
455 | path = libRCTVibration.a;
456 | remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;
457 | sourceTree = BUILT_PRODUCTS_DIR;
458 | };
459 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {
460 | isa = PBXReferenceProxy;
461 | fileType = archive.ar;
462 | path = libRCTSettings.a;
463 | remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */;
464 | sourceTree = BUILT_PRODUCTS_DIR;
465 | };
466 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = {
467 | isa = PBXReferenceProxy;
468 | fileType = archive.ar;
469 | path = libRCTWebSocket.a;
470 | remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */;
471 | sourceTree = BUILT_PRODUCTS_DIR;
472 | };
473 | 146834041AC3E56700842450 /* libReact.a */ = {
474 | isa = PBXReferenceProxy;
475 | fileType = archive.ar;
476 | path = libReact.a;
477 | remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;
478 | sourceTree = BUILT_PRODUCTS_DIR;
479 | };
480 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {
481 | isa = PBXReferenceProxy;
482 | fileType = archive.ar;
483 | path = libRCTLinking.a;
484 | remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */;
485 | sourceTree = BUILT_PRODUCTS_DIR;
486 | };
487 | 832341B51AAA6A8300B99B32 /* libRCTText.a */ = {
488 | isa = PBXReferenceProxy;
489 | fileType = archive.ar;
490 | path = libRCTText.a;
491 | remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;
492 | sourceTree = BUILT_PRODUCTS_DIR;
493 | };
494 | /* End PBXReferenceProxy section */
495 |
496 | /* Begin PBXResourcesBuildPhase section */
497 | 00E356EC1AD99517003FC87E /* Resources */ = {
498 | isa = PBXResourcesBuildPhase;
499 | buildActionMask = 2147483647;
500 | files = (
501 | );
502 | runOnlyForDeploymentPostprocessing = 0;
503 | };
504 | 13B07F8E1A680F5B00A75B9A /* Resources */ = {
505 | isa = PBXResourcesBuildPhase;
506 | buildActionMask = 2147483647;
507 | files = (
508 | 008F07F31AC5B25A0029DE68 /* main.jsbundle in Resources */,
509 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
510 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
511 | );
512 | runOnlyForDeploymentPostprocessing = 0;
513 | };
514 | /* End PBXResourcesBuildPhase section */
515 |
516 | /* Begin PBXSourcesBuildPhase section */
517 | 00E356EA1AD99517003FC87E /* Sources */ = {
518 | isa = PBXSourcesBuildPhase;
519 | buildActionMask = 2147483647;
520 | files = (
521 | 00E356F31AD99517003FC87E /* ZhihuDailyTests.m in Sources */,
522 | );
523 | runOnlyForDeploymentPostprocessing = 0;
524 | };
525 | 13B07F871A680F5B00A75B9A /* Sources */ = {
526 | isa = PBXSourcesBuildPhase;
527 | buildActionMask = 2147483647;
528 | files = (
529 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
530 | 13B07FC11A68108700A75B9A /* main.m in Sources */,
531 | );
532 | runOnlyForDeploymentPostprocessing = 0;
533 | };
534 | /* End PBXSourcesBuildPhase section */
535 |
536 | /* Begin PBXTargetDependency section */
537 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
538 | isa = PBXTargetDependency;
539 | target = 13B07F861A680F5B00A75B9A /* ZhihuDaily */;
540 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
541 | };
542 | /* End PBXTargetDependency section */
543 |
544 | /* Begin PBXVariantGroup section */
545 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {
546 | isa = PBXVariantGroup;
547 | children = (
548 | 13B07FB21A68108700A75B9A /* Base */,
549 | );
550 | name = LaunchScreen.xib;
551 | sourceTree = "";
552 | };
553 | /* End PBXVariantGroup section */
554 |
555 | /* Begin XCBuildConfiguration section */
556 | 00E356F61AD99517003FC87E /* Debug */ = {
557 | isa = XCBuildConfiguration;
558 | buildSettings = {
559 | BUNDLE_LOADER = "$(TEST_HOST)";
560 | FRAMEWORK_SEARCH_PATHS = (
561 | "$(SDKROOT)/Developer/Library/Frameworks",
562 | "$(inherited)",
563 | );
564 | GCC_PREPROCESSOR_DEFINITIONS = (
565 | "DEBUG=1",
566 | "$(inherited)",
567 | );
568 | INFOPLIST_FILE = ZhihuDailyTests/Info.plist;
569 | IPHONEOS_DEPLOYMENT_TARGET = 8.2;
570 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
571 | PRODUCT_NAME = "$(TARGET_NAME)";
572 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ZhihuDaily.app/ZhihuDaily";
573 | };
574 | name = Debug;
575 | };
576 | 00E356F71AD99517003FC87E /* Release */ = {
577 | isa = XCBuildConfiguration;
578 | buildSettings = {
579 | BUNDLE_LOADER = "$(TEST_HOST)";
580 | COPY_PHASE_STRIP = NO;
581 | FRAMEWORK_SEARCH_PATHS = (
582 | "$(SDKROOT)/Developer/Library/Frameworks",
583 | "$(inherited)",
584 | );
585 | INFOPLIST_FILE = ZhihuDailyTests/Info.plist;
586 | IPHONEOS_DEPLOYMENT_TARGET = 8.2;
587 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
588 | PRODUCT_NAME = "$(TARGET_NAME)";
589 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ZhihuDaily.app/ZhihuDaily";
590 | };
591 | name = Release;
592 | };
593 | 13B07F941A680F5B00A75B9A /* Debug */ = {
594 | isa = XCBuildConfiguration;
595 | buildSettings = {
596 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
597 | HEADER_SEARCH_PATHS = (
598 | "$(inherited)",
599 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
600 | "$(SRCROOT)/../node_modules/react-native/React/**",
601 | );
602 | INFOPLIST_FILE = "$(SRCROOT)/ZhihuDaily/Info.plist";
603 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
604 | OTHER_LDFLAGS = "-ObjC";
605 | PRODUCT_NAME = ZhihuDaily;
606 | };
607 | name = Debug;
608 | };
609 | 13B07F951A680F5B00A75B9A /* Release */ = {
610 | isa = XCBuildConfiguration;
611 | buildSettings = {
612 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
613 | HEADER_SEARCH_PATHS = (
614 | "$(inherited)",
615 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
616 | "$(SRCROOT)/../node_modules/react-native/React/**",
617 | );
618 | INFOPLIST_FILE = "$(SRCROOT)/ZhihuDaily/Info.plist";
619 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
620 | OTHER_LDFLAGS = "-ObjC";
621 | PRODUCT_NAME = ZhihuDaily;
622 | };
623 | name = Release;
624 | };
625 | 83CBBA201A601CBA00E9B192 /* Debug */ = {
626 | isa = XCBuildConfiguration;
627 | buildSettings = {
628 | ALWAYS_SEARCH_USER_PATHS = NO;
629 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
630 | CLANG_CXX_LIBRARY = "libc++";
631 | CLANG_ENABLE_MODULES = YES;
632 | CLANG_ENABLE_OBJC_ARC = YES;
633 | CLANG_WARN_BOOL_CONVERSION = YES;
634 | CLANG_WARN_CONSTANT_CONVERSION = YES;
635 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
636 | CLANG_WARN_EMPTY_BODY = YES;
637 | CLANG_WARN_ENUM_CONVERSION = YES;
638 | CLANG_WARN_INT_CONVERSION = YES;
639 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
640 | CLANG_WARN_UNREACHABLE_CODE = YES;
641 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
642 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
643 | COPY_PHASE_STRIP = NO;
644 | ENABLE_STRICT_OBJC_MSGSEND = YES;
645 | GCC_C_LANGUAGE_STANDARD = gnu99;
646 | GCC_DYNAMIC_NO_PIC = NO;
647 | GCC_OPTIMIZATION_LEVEL = 0;
648 | GCC_PREPROCESSOR_DEFINITIONS = (
649 | "DEBUG=1",
650 | "$(inherited)",
651 | );
652 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
653 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
654 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
655 | GCC_WARN_UNDECLARED_SELECTOR = YES;
656 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
657 | GCC_WARN_UNUSED_FUNCTION = YES;
658 | GCC_WARN_UNUSED_VARIABLE = YES;
659 | HEADER_SEARCH_PATHS = (
660 | "$(inherited)",
661 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
662 | "$(SRCROOT)/../node_modules/react-native/React/**",
663 | );
664 | IPHONEOS_DEPLOYMENT_TARGET = 7.0;
665 | MTL_ENABLE_DEBUG_INFO = YES;
666 | ONLY_ACTIVE_ARCH = YES;
667 | SDKROOT = iphoneos;
668 | };
669 | name = Debug;
670 | };
671 | 83CBBA211A601CBA00E9B192 /* Release */ = {
672 | isa = XCBuildConfiguration;
673 | buildSettings = {
674 | ALWAYS_SEARCH_USER_PATHS = NO;
675 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
676 | CLANG_CXX_LIBRARY = "libc++";
677 | CLANG_ENABLE_MODULES = YES;
678 | CLANG_ENABLE_OBJC_ARC = YES;
679 | CLANG_WARN_BOOL_CONVERSION = YES;
680 | CLANG_WARN_CONSTANT_CONVERSION = YES;
681 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
682 | CLANG_WARN_EMPTY_BODY = YES;
683 | CLANG_WARN_ENUM_CONVERSION = YES;
684 | CLANG_WARN_INT_CONVERSION = YES;
685 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
686 | CLANG_WARN_UNREACHABLE_CODE = YES;
687 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
688 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
689 | COPY_PHASE_STRIP = YES;
690 | ENABLE_NS_ASSERTIONS = NO;
691 | ENABLE_STRICT_OBJC_MSGSEND = YES;
692 | GCC_C_LANGUAGE_STANDARD = gnu99;
693 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
694 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
695 | GCC_WARN_UNDECLARED_SELECTOR = YES;
696 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
697 | GCC_WARN_UNUSED_FUNCTION = YES;
698 | GCC_WARN_UNUSED_VARIABLE = YES;
699 | HEADER_SEARCH_PATHS = (
700 | "$(inherited)",
701 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
702 | "$(SRCROOT)/../node_modules/react-native/React/**",
703 | );
704 | IPHONEOS_DEPLOYMENT_TARGET = 7.0;
705 | MTL_ENABLE_DEBUG_INFO = NO;
706 | SDKROOT = iphoneos;
707 | VALIDATE_PRODUCT = YES;
708 | };
709 | name = Release;
710 | };
711 | /* End XCBuildConfiguration section */
712 |
713 | /* Begin XCConfigurationList section */
714 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ZhihuDailyTests" */ = {
715 | isa = XCConfigurationList;
716 | buildConfigurations = (
717 | 00E356F61AD99517003FC87E /* Debug */,
718 | 00E356F71AD99517003FC87E /* Release */,
719 | );
720 | defaultConfigurationIsVisible = 0;
721 | defaultConfigurationName = Release;
722 | };
723 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ZhihuDaily" */ = {
724 | isa = XCConfigurationList;
725 | buildConfigurations = (
726 | 13B07F941A680F5B00A75B9A /* Debug */,
727 | 13B07F951A680F5B00A75B9A /* Release */,
728 | );
729 | defaultConfigurationIsVisible = 0;
730 | defaultConfigurationName = Release;
731 | };
732 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ZhihuDaily" */ = {
733 | isa = XCConfigurationList;
734 | buildConfigurations = (
735 | 83CBBA201A601CBA00E9B192 /* Debug */,
736 | 83CBBA211A601CBA00E9B192 /* Release */,
737 | );
738 | defaultConfigurationIsVisible = 0;
739 | defaultConfigurationName = Release;
740 | };
741 | /* End XCConfigurationList section */
742 | };
743 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
744 | }
745 |
--------------------------------------------------------------------------------
/iOS/ZhihuDaily.xcodeproj/xcshareddata/xcschemes/ZhihuDaily.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
29 |
35 |
36 |
37 |
38 |
39 |
44 |
45 |
47 |
53 |
54 |
55 |
56 |
57 |
63 |
64 |
65 |
66 |
75 |
77 |
83 |
84 |
85 |
86 |
87 |
88 |
94 |
96 |
102 |
103 |
104 |
105 |
107 |
108 |
111 |
112 |
113 |
--------------------------------------------------------------------------------
/iOS/ZhihuDaily/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 |
--------------------------------------------------------------------------------
/iOS/ZhihuDaily/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 "RCTRootView.h"
13 |
14 | @implementation AppDelegate
15 |
16 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
17 | {
18 | NSURL *jsCodeLocation;
19 |
20 | /**
21 | * Loading JavaScript code - uncomment the one you want.
22 | *
23 | * OPTION 1
24 | * Load from development server. Start the server from the repository root:
25 | *
26 | * $ npm start
27 | *
28 | * To run on device, change `localhost` to the IP address of your computer
29 | * (you can get this by typing `ifconfig` into the terminal and selecting the
30 | * `inet` value under `en0:`) and make sure your computer and iOS device are
31 | * on the same Wi-Fi network.
32 | */
33 |
34 | jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle"];
35 |
36 | /**
37 | * OPTION 2
38 | * Load from pre-bundled file on disk. To re-generate the static bundle
39 | * from the root of your project directory, run
40 | *
41 | * $ react-native bundle --minify
42 | *
43 | * see http://facebook.github.io/react-native/docs/runningondevice.html
44 | */
45 |
46 | // jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
47 |
48 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
49 | moduleName:@"ZhihuDaily"
50 | launchOptions:launchOptions];
51 |
52 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
53 | UIViewController *rootViewController = [[UIViewController alloc] init];
54 | rootViewController.view = rootView;
55 | self.window.rootViewController = rootViewController;
56 | [self.window makeKeyAndVisible];
57 | return YES;
58 | }
59 |
60 | @end
61 |
--------------------------------------------------------------------------------
/iOS/ZhihuDaily/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 |
--------------------------------------------------------------------------------
/iOS/ZhihuDaily/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 | }
--------------------------------------------------------------------------------
/iOS/ZhihuDaily/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 | NSAllowsArbitraryLoads
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/iOS/ZhihuDaily/main.jsbundle:
--------------------------------------------------------------------------------
1 | // Offline JS
2 | // To re-generate the offline bundle, run this from the root of your project:
3 | //
4 | // $ react-native bundle --minify
5 | //
6 | // See http://facebook.github.io/react-native/docs/runningondevice.html for more details.
7 |
8 | throw new Error('Offline JS file is empty. See iOS/main.jsbundle for instructions');
9 |
--------------------------------------------------------------------------------
/iOS/ZhihuDaily/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 |
--------------------------------------------------------------------------------
/iOS/ZhihuDailyTests/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 |
--------------------------------------------------------------------------------
/iOS/ZhihuDailyTests/ZhihuDailyTests.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 "RCTAssert.h"
14 | #import "RCTRedBox.h"
15 | #import "RCTRootView.h"
16 |
17 | #define TIMEOUT_SECONDS 240
18 | #define TEXT_TO_LOOK_FOR @"Welcome to React Native!"
19 |
20 | @interface ZhihuDailyTests : XCTestCase
21 |
22 | @end
23 |
24 | @implementation ZhihuDailyTests
25 |
26 |
27 | - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test
28 | {
29 | if (test(view)) {
30 | return YES;
31 | }
32 | for (UIView *subview in [view subviews]) {
33 | if ([self findSubviewInView:subview matching:test]) {
34 | return YES;
35 | }
36 | }
37 | return NO;
38 | }
39 |
40 | - (void)testRendersWelcomeScreen {
41 | UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
42 | NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];
43 | BOOL foundElement = NO;
44 | NSString *redboxError = nil;
45 |
46 | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {
47 | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
48 | [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
49 |
50 | redboxError = [[RCTRedBox sharedInstance] currentErrorMessage];
51 |
52 | foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) {
53 | if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {
54 | return YES;
55 | }
56 | return NO;
57 | }];
58 | }
59 |
60 | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError);
61 | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);
62 | }
63 |
64 |
65 | @end
66 |
--------------------------------------------------------------------------------
/index.ios.js:
--------------------------------------------------------------------------------
1 | /**
2 | * ZhihuDaily
3 | * - author: Fantasy Shao
4 | * - create: 2015-09-14
5 | */
6 |
7 | 'use strict';
8 |
9 | var React = require('react-native');
10 |
11 | var {
12 | AppRegistry,
13 | StyleSheet,
14 | NavigatorIOS
15 | } = React;
16 |
17 | var ListView = require('./App/Views/List');
18 |
19 | var ZhihuDaily = React.createClass({
20 | render: function() {
21 | return (
22 |
30 | );
31 | }
32 | });
33 |
34 | var styles = StyleSheet.create({
35 | container: {
36 | flex: 1,
37 | backgroundColor: '#008bed'
38 | }
39 | });
40 |
41 | AppRegistry.registerComponent('ZhihuDaily', () => ZhihuDaily);
42 |
--------------------------------------------------------------------------------
/list_screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SFantasy/ZhihuDaily/5666c2e8c66a1a14d4bd9b847bbd6c12bbe2ec26/list_screenshot.png
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ZhihuDaily",
3 | "version": "0.0.1",
4 | "description": "Zhihu Daily iOS app build with React Native",
5 | "license": "MIT",
6 | "repository": "git@github.com:Fantasy0/ZhihuDaily.git",
7 | "scripts": {
8 | "start": "node_modules/react-native/packager/packager.sh"
9 | },
10 | "dependencies": {
11 | "react-native": "^0.10.1",
12 | "react-native-htmlview": "^0.2.0",
13 | "react-native-swiper": "^1.3.0",
14 | "react-timer-mixin": "^0.13.3"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------