Ионный проект: создание и настройка
Скачайте и установите Node.js:
Установите Ionic и Cordova:
sudo npm install -g ionic cordova -d
в терминале.Проверьте версии Ionic и Cordova:
cordova -v
и ionic -v
.Обновите Ionic и Cordova до последних версий:
sudo npm update -g cordova -d
.Обновите платформы Android и iOS:
sudo ionic platform update android
.sudo ionic platform update ios
.Настройте среду разработки для Android:
ANDROID_HOME
со значением C:\Program Files (x86)\Android\android-sdk
.ANDROID_PLATFORM_TOOLS
равным C:\Program Files (x86)\Android\android-sdk\platform-tools
.ANDROID_SDK_HOME
, равное C:\Program Files (x86)\Android\android-sdk
.ANDROID_TOOLS
, равное C:\Program Files (x86)\Android\android-sdk\tools
.ANT_HOME
: C:\apache-ant-1.9.4
.JAVA_HOME
: C:\Program Files\Java\jdk1.8.0_20
.PATH
: C:\ProgramData\Oracle\Java\javapath;C:\nodejs\;%ANDROID_HOME%;%JAVA_HOME%\bin;%ANT_HOME%\bin;%ANDROID_PLATFORM_TOOLS%
.Настройте среду разработки для Mac:
.bash_profile
с помощью редактора vi
.ANDROID_HOME
, равной пути к папке ~/android-sdk
.PATH
.source ~/.bash_profile
, чтобы применить изменения.Создайте новый проект:
sudo ionic start -a 猪猪笑话 -i com.livexy.joke jokeApp blank
.cd jokeApp
.Добавьте поддержку платформ:
sudo ionic platform add android
и sudo ionic platform add ios
.Скомпилируйте проект:
sudo ionic build android
.sudo ionic build ios
.Установите плагины:
sudo cordova plugin add [имя плагина]
.Внесите изменения в код:
www_code/js/services/config.js
добавьте или измените код, который соответствует вашим требованиям.Сгенерируйте иконки и заставки:
./resources.sh
.Соберите и скомпилируйте файлы:
./www.sh
../www.sh b
.Сформируйте APK-файл для Android:
./android-release.sh
../android-release.sb b
.Загрузите приложение в магазин приложений:
В целом, данный фрагмент кода может быть связан с разработкой мобильных приложений с использованием фреймворка Cordova. Он может содержать изменения в коде, связанные с обновлением приложения или изменением его функциональности. Toast.LENGTH_LONG).show(); CopyFilesTask task = new CopyFilesTask(); task.execute(); } else { //Toast.makeText(this, getFilesDir().toString() + "/www 存在 直接显示", Toast.LENGTH_LONG).show(); loadUrl("file://" + getFilesDir().toString() + "/www/index.html"); } }
class CopyFilesTask extends AsyncTask<Void, Integer, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(Void... params) {
try {
MainActivity.unZip(MainActivity.this, "www.zip", getFilesDir().toString());
} catch (IOException e) {
e.printStackTrace();
//Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show();
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
//Toast.makeText(MainActivity.this, getFilesDir().toString() + "/www 解压成功 加载", Toast.LENGTH_LONG).show();
loadUrl("file://" + getFilesDir().toString() + "/www/index.html");
}
}
public static void unZip(Context context, String assetName,String outputDirectory) throws IOException {
//创建解压目标目录
File file = new File(outputDirectory);
//如果目标目录不存在,则创建
if (!file.exists()) {
file.mkdirs();
}
InputStream inputStream = null;
//打开压缩文件
inputStream = context.getAssets().open(assetName);
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
//读取一个进入点
ZipEntry zipEntry = zipInputStream.getNextEntry();
//使用1Mbuffer
byte[] buffer = new byte[1024 * 1024];
//解压时字节计数
int count = 0;
//如果进入点为空说明已经遍历完所有压缩包中文件和目录
int num = 0;
while (zipEntry != null) {
//如果是一个目录
if (zipEntry.isDirectory()) {
//String name = zipEntry.getName();
//name = name.substring(0, name.length() - 1);
file = new File(outputDirectory + File.separator + zipEntry.getName());
file.mkdir();
} else {
//如果是文件
file = new File(outputDirectory + File.separator
+ zipEntry.getName());
//创建该文件
file.createNewFile();
FileOutputStream fileOutputStream = new FileOutputStream(file);
while ((count = zipInputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, count);
}
fileOutputStream.close();
}
//定位到下一个文件入口
zipEntry = zipInputStream.getNextEntry();
num++;
System.out.println("正在解压---》第" + num + "个文件。");
}
zipInputStream.close();
}
}
IOS老版本更新:platforms/ios/CordovaLib/Classes/CDVViewController.m
261 行增加: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadWebView:) name:@"loadWebView" object:nil]; 494 行增加: /* *接收更新UI通知 执行重新加载 */
(void)loadWebView:(NSNotification *)notification { NSURL *appURL = [self appUrl]; NSLog(@"appURL------接收到更新时的地址------>%@",appURL);
[CDVUserAgentUtil acquireLock:^(NSInteger lockToken) { _userAgentLockToken = lockToken; [CDVUserAgentUtil setUserAgent:self.userAgent lockToken:lockToken]; if (appURL) { NSURLRequest* appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0]; [self.webView loadRequest:appReq]; } else { NSString* loadErr = [NSString stringWithFormat:@"ERROR: Start Page at '%@/%@' was not found.", self.wwwFolderName, self.startPage]; NSLog(@"%@", loadErr);
NSURL* errorUrl = ```
// Если есть загрузка обновления, получаем путь после обновления if ([self readRootPathStatus]) { return [self readRootPathStatus]; } else { // Иначе получаем исходный путь
...
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )