mirror of
https://github.com/zhigang1992/react-native-code-push.git
synced 2026-06-11 08:04:23 +08:00
Instead of `#import "CodePush.h"`, use `#import "<CodePush/CodePush.h>` and export CodePush.h from our module. * [iOS][Build] Add `Headers` and `Copy Files` build phases Due to changes in new release of `react-native@0.40.0` there is `CodePush.h file not found` error occures. To fix it I've added `CodePush.h` header file in `Headers` and `Copy Files` build phases and changed `codePushHeaderImportStatement` variable value from `#import "CodePush.h"` to `#import <CodePush/CodePush.h>` in `postlink.js` file. Fix https://github.com/Microsoft/react-native-code-push/issues/662 * readme: update iOS manual plugin installation/usage documentation Due to changes in React Native v0.40.0 and changes in CodePush project Step 6. of iOS manual plugin installation (add “Header Search Paths”) is not needed anymore. Also changed path to `CodePush.h` file in `AppDelegate.m` to `#import <CodePush/CodePush.h>`
97 lines
3.6 KiB
JavaScript
97 lines
3.6 KiB
JavaScript
var fs = require("fs");
|
||
var glob = require("glob");
|
||
var inquirer = require('inquirer');
|
||
var path = require("path");
|
||
var plist = require("plist");
|
||
var package = require('../../../../../package.json');
|
||
|
||
var ignoreNodeModules = { ignore: "node_modules/**" };
|
||
var appDelegatePaths = glob.sync("**/AppDelegate.+(mm|m)", ignoreNodeModules);
|
||
|
||
// Fix for https://github.com/Microsoft/react-native-code-push/issues/477
|
||
// Typical location of AppDelegate.m for newer RN versions: $PROJECT_ROOT/ios/<project_name>/AppDelegate.m
|
||
// Let's try to find that path by filtering the whole array for any path containing <project_name>
|
||
// If we can't find it there, play dumb and pray it is the first path we find.
|
||
var appDelegatePath = findFileByAppName(appDelegatePaths, package ? package.name : null) || appDelegatePaths[0];
|
||
|
||
if (!appDelegatePath) {
|
||
console.log(`Couldn't find AppDelegate. You might need to update it manually \
|
||
Please refer to plugin configuration section for iOS at \
|
||
https://github.com/microsoft/react-native-code-push#plugin-configuration-ios`);
|
||
return;
|
||
}
|
||
|
||
var appDelegateContents = fs.readFileSync(appDelegatePath, "utf8");
|
||
|
||
// 1. Add the header import statement
|
||
var codePushHeaderImportStatement = `#import <CodePush/CodePush.h>`;
|
||
if (~appDelegateContents.indexOf(codePushHeaderImportStatement)) {
|
||
console.log(`"CodePush.h" header already imported.`);
|
||
} else {
|
||
var appDelegateHeaderImportStatement = `#import "AppDelegate.h"`;
|
||
appDelegateContents = appDelegateContents.replace(appDelegateHeaderImportStatement,
|
||
`${appDelegateHeaderImportStatement}\n${codePushHeaderImportStatement}`);
|
||
}
|
||
|
||
// 2. Modify jsCodeLocation value assignment
|
||
var oldJsCodeLocationAssignmentStatement = appDelegateContents.match(/(jsCodeLocation = .*)/)[1];
|
||
var newJsCodeLocationAssignmentStatement = "jsCodeLocation = [CodePush bundleURL];";
|
||
if (~appDelegateContents.indexOf(newJsCodeLocationAssignmentStatement)) {
|
||
console.log(`"jsCodeLocation" already pointing to "[CodePush bundleURL]".`);
|
||
} else {
|
||
var jsCodeLocationPatch = `
|
||
#ifdef DEBUG
|
||
${oldJsCodeLocationAssignmentStatement}
|
||
#else
|
||
${newJsCodeLocationAssignmentStatement}
|
||
#endif`;
|
||
appDelegateContents = appDelegateContents.replace(oldJsCodeLocationAssignmentStatement,
|
||
jsCodeLocationPatch);
|
||
}
|
||
|
||
var plistPath = glob.sync(`**/${package.name}/*Info.plist`, ignoreNodeModules)[0];
|
||
if (!plistPath) {
|
||
console.log("Couldn't find .plist file");
|
||
return;
|
||
}
|
||
|
||
var plistContents = fs.readFileSync(plistPath, "utf8");
|
||
|
||
// 3. Add CodePushDeploymentKey to plist file
|
||
var parsedInfoPlist = plist.parse(plistContents);
|
||
if (parsedInfoPlist.CodePushDeploymentKey) {
|
||
console.log(`"CodePushDeploymentKey" already specified in the plist file.`);
|
||
writePatches();
|
||
} else {
|
||
inquirer.prompt({
|
||
"type": "input",
|
||
"name": "iosDeploymentKey",
|
||
"message": "What is your CodePush deployment key for iOS (hit <ENTER> to ignore)"
|
||
}).then(function(answer) {
|
||
parsedInfoPlist.CodePushDeploymentKey = answer.iosDeploymentKey || "deployment-key-here";
|
||
plistContents = plist.build(parsedInfoPlist);
|
||
|
||
writePatches();
|
||
});
|
||
}
|
||
|
||
function writePatches() {
|
||
fs.writeFileSync(appDelegatePath, appDelegateContents);
|
||
fs.writeFileSync(plistPath, plistContents);
|
||
}
|
||
|
||
// Helper that filters an array with AppDelegate.m paths for a path with the app name inside it
|
||
// Should cover nearly all cases
|
||
function findFileByAppName(array, appName) {
|
||
if (array.length === 0 || !appName) return null;
|
||
|
||
for (var i = 0; i < array.length; i++) {
|
||
var path = array[i];
|
||
if (path && path.indexOf(appName) !== -1) {
|
||
return path;
|
||
}
|
||
}
|
||
|
||
return null;
|
||
}
|