React Native&iOS CodePush集成

React Native CodePush集成

author: ImL1s

email: ImL1s@outlook.com

github: 專案

參考

版本

  • react-native-cli: 2.0.1
  • react-native: 0.53.0
  • code-push: 2.1.6

前置作業(yè)

註冊(cè)CodePush

  1. 安裝CodePush CLI

     > npm install -g code-push-cli
     > code-push -v
     2.1.6 // 有顯示版本號(hào)代表安裝成功
    
  2. 向CodePush註冊(cè)App

     > code-push app add CodePushIntergradation ios react-native
     ┌────────────┬──────────────────────────────────────────────────────────────────┐
     │ Name       │ Deployment Key                                                   │
     ├────────────┼──────────────────────────────────────────────────────────────────┤
     │ Production │ xxxxs2KwnRds65xxxxbp2GpYF78h3bxxxx1f-xxxx-xxxx-bba3-5a79beaxxxxd │
     ├────────────┼──────────────────────────────────────────────────────────────────┤
     │ Staging    │ xxxxgs9s-QBRsxxxxGxxxxGGxxhxxxx467xf-xxx3-430a-bba3-5a7xxxx95xxx │
     └────────────┴──────────────────────────────────────────────────────────────────┘
    

公有雲(yún)的CodePush集成到新的iOS專案(OC)

  1. 新建一個(gè)React Native專案

     react-native init codePushIntergradation
    
  2. 在新建的React Native目錄下,使用npm安裝CodePush

     npm install --save react-native-code-push
    
  3. 再run一次安裝

     npm install
    
  4. 執(zhí)行以下指令,會(huì)打開(kāi)瀏覽器訪問(wèn)M$的app center,按照步驟登入或是註冊(cè)

     > code-push register
    
  5. 上面的步驟完畢,在瀏覽器中可以得到一串金鑰

     fxxxdd9caxxxxxxadxxxc3xxxc9904xxxd5xxx1x
    
  6. 將金鑰輸入到終端機(jī)中,他會(huì)將session文件存在~/.code-push.config

     Successfully logged-in. 
     Your session file was written to /Users/userName/.code-push.config. 
     You can run the code-push logout command at any time to delete this file and terminate your session.
    
  7. 接著輸入以下指令,證明你已經(jīng)登入了

     > code-push login
     [Error]  You are already logged in from this machine.
    
  8. 接著安裝幫原生的iOS/Android專案安裝CodePush的lib,deployment key先不用輸入,按Enter就好

    > react-native link react-native-code-push
    
    Scanning folders for symlinks in /Users/UserName/Project/IOS/CodePushIntergradation/node_modules (18ms)
    ? What is your CodePush deployment key for Android (hit <ENTER> to ignore) 
    rnpm-install info Linking react-native-code-push android dependency 
    rnpm-install info Android module react-native-code-push has been successfully linked 
    rnpm-install info Linking react-native-code-push ios dependency 
    rnpm-install info iOS module react-native-code-push has been successfully linked 
    Running ios postlink script
    ? What is your CodePush deployment key for iOS (hit <ENTER> to ignore) 
    Running android postlink script
  1. 在iOS專案中,使用Source Code方式打開(kāi)info.plist,在裡面新增or更改CodePushDeploymentKey這個(gè)key的值為向CodePush註冊(cè)的Staging key(在上面前置作業(yè)申請(qǐng)的)

     <?xml version="1.0" encoding="UTF-8"?>
     <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
     <plist version="1.0">
     <dict>
         ...
         ...
         <key>CodePushDeploymentKey</key>
         <string>iGexxx9s-Qxxx1xxxGkxxxGxxxhF3xxx67xx-xxxx-43xx-xxxx-xxxxxxx9xxxd</string>
     </dict>
     </plist>
    
  2. 接著打開(kāi)AppDelegate.m,可以看到以下程式碼,cli工具已經(jīng)幫我們把RCTRootView(React Native JS的運(yùn)行容器)更新的Code都寫(xiě)好了

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        ...
        ...
        #ifdef DEBUG
            jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
        #else
            jsCodeLocation = [CodePush bundleURL];
        #endif
        RCTRootView *rootView = 
        [[RCTRootView alloc] 
        initWithBundleURL:jsCodeLocation
            moduleName:@"codePushIntergradation"
            initialProperties:nil
            launchOptions:launchOptions];
       ...
       ...
    }
    
  3. 接著我們還要設(shè)定iOS的http訪問(wèn)權(quán)限,打開(kāi)info.plist,把CodePush的Url加入進(jìn)去

    <plist version="1.0">
      <dict>
        <!-- ...other configs... -->
    
        <key>NSAppTransportSecurity</key>
        <dict>
          <key>NSExceptionDomains</key>
          <dict>
            <key>codepush.azurewebsites.net</key>
            <dict><!-- read the ATS Apple Docs for available options --></dict>
          </dict>
        </dict>
    
        <!-- ...other configs... -->
      </dict>
    </plist>
    
  4. 將React Native的index.js改成以下

    import { AppRegistry } from 'react-native';
    import App from './App';
    
    import codePush from "react-native-code-push";
    
    AppRegistry.registerComponent('codePushIntergradation', () => codePush(App));
    
  5. 接著用Release模式Run,一定要Release喔,不然他只會(huì)讀local的js

  1. xcode怎麼找到最新的React Native js的呢?因?yàn)閄code裡,react-native cli工具幫我們配置了一個(gè)run script,可以切到以下地方,找到一個(gè).sh的script,這個(gè)script會(huì)在Copy Bundle Resources之後將打包好的js放到ipa中(可以參考開(kāi)頭參考的連結(jié))

    點(diǎn)擊項(xiàng)目 -> TARGETS -> {{porject name}} -> BuildPhases ->Bundle React Native code and images
    
  2. 接著修改React Native的app.js

    export default class App extends Component<Props> {
      render() {
        return (
          <View style={styles.container}>
            <Text style={styles.welcome}>
             Hello code push!!
            </Text>
            <Text style={styles.instructions}>
              To get started, edit App.js
            </Text>
            <Text style={styles.instructions}>
              {instructions}
            </Text>
          </View>
        );
      }
    }
    
  3. 接著要把React Native專案下的package.json版本號(hào)更新,不然不給上傳

    {
      "name": "codePushIntergradation",
      "version": "0.0.2",
      "private": true,
      "scripts": {
        "start": "node node_modules/react-native/local-cli/cli.js start",
        "test": "jest"
      },
      "dependencies": {
        "react": "16.2.0",
        "react-native": "0.53.0",
        "react-native-code-push": "^5.2.1"
      },
      "devDependencies": {
        "babel-jest": "22.2.0",
        "babel-preset-react-native": "4.0.0",
        "jest": "22.2.1",
        "react-test-renderer": "16.2.0"
      },
      "jest": {
        "preset": "react-native"
      }
    }
    
  4. 接著將寫(xiě)好的js打包,並且發(fā)布到遠(yuǎn)端Server上,這句command做兩個(gè)動(dòng)作,打包React Native專案並且上傳到Code push

    > code-push release-react {{Your project name}} ios 
    
  5. 重新打開(kāi)app兩次(滑掉重開(kāi)),然後可就可以看到更新,至於為什麼要兩次呢...?我猜是為了用戶體驗(yàn),第一次檢查到更新先存著,等到下一次再更新

常用指令

初始化階段:
1:npm install -g code-push-cli 安裝客戶端
2:code-push -v 查看是否安裝成功
3:code-push register 在codepush注冊(cè)賬號(hào)
4:code-push login
5:code-push app add <appName> <android/ios> react-native 添加app
例如
code-push app add test android react-native

6:code-push app list 列出app列表
code-push deployment ls <appName> -k 查看APP的key
code-push deployment history <appName> Porduction/Staging
例如:
code-push deployment history test Production

7:yarn add react-native-code-push 在rn項(xiàng)目下安裝codepush
8:react-native link react-native-code-push 鏈接codepush
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末裆熙,一起剝皮案震驚了整個(gè)濱河市肛搬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌臀玄,老刑警劉巖渊额,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件况木,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡旬迹,警方通過(guò)查閱死者的電腦和手機(jī)火惊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奔垦,“玉大人屹耐,你說(shuō)我怎么就攤上這事〈涣裕” “怎么了惶岭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)犯眠。 經(jīng)常有香客問(wèn)我按灶,道長(zhǎng),這世上最難降的妖魔是什么筐咧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任鸯旁,我火速辦了婚禮,結(jié)果婚禮上量蕊,老公的妹妹穿的比我還像新娘铺罢。我一直安慰自己,他們只是感情好危融,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布畏铆。 她就那樣靜靜地躺著雷袋,像睡著了一般吉殃。 火紅的嫁衣襯著肌膚如雪辞居。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天蛋勺,我揣著相機(jī)與錄音瓦灶,去河邊找鬼。 笑死抱完,一個(gè)胖子當(dāng)著我的面吹牛贼陶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巧娱,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼碉怔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了禁添?” 一聲冷哼從身側(cè)響起撮胧,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎老翘,沒(méi)想到半個(gè)月后芹啥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铺峭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年墓怀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卫键。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡傀履,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莉炉,到底是詐尸還是另有隱情啤呼,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布呢袱,位于F島的核電站官扣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏羞福。R本人自食惡果不足惜惕蹄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望治专。 院中可真熱鬧卖陵,春花似錦、人聲如沸张峰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)喘批。三九已至撩荣,卻和暖如春铣揉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背餐曹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工逛拱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人台猴。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓朽合,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親饱狂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子曹步,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容