ThinkPHP 5 是一个基于 PHP 的 Web 应用开发框架,它采用了 MVC 设计模式,具有高效、简洁、安全等特点。而打包 APP 则是将 Web 应用转化为移动应用的过程,使得用户可以在移动设备上以 APP 的形式使用。
ThinkPHP 5 打包 APP 的原理是将 Web 应用通过 WebView 控件嵌入到移动应用中,并使用 JavaScript 与原生代码进行交互。下面分别介绍打包 Android 和 iOS 应用的流程。
## 打包 Android 应用
### 第一步:创建 Android 项目
在 Android Studio 中创建一个新的项目,选择空白活动模板。在布局文件中添加一个 WebView 控件,并设置其宽高、位置等属性。
### 第二步:引入 ThinkPHP 5 项目
将 ThinkPHP 5 项目拷贝到 Android 项目的 assets 目录下。在 WebView 控件的 loadUrl() 方法中加载 ThinkPHP 5 项目的入口文件,例如 index.php。
```java
webView.loadUrl("file:///android_asset/index.php");
```
### 第三步:实现 JavaScript 与原生代码交互
在 Android 项目中实现一个继承自 WebViewClient 的类并重写 shouldOverrideUrlLoading() 方法,该方法用于拦截 WebView 加载的 URL。在 JavaScript 中通过 window.location.href = "custom://xxx" 调用原生代码。
```java
public class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("custom://")) {
// 处理 JavaScript 调用原生代码的逻辑
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
}
```
在 JavaScript 中通过 window.prompt() 方法将数据传递给原生代码。例如,将用户名和密码传递给原生代码。
```javascript
var username = "admin";
var password = "123456";
window.prompt("login", JSON.stringify({username: username, password: password}));
```
在原生代码中解析 JavaScript 传递的数据,并进行相应的处理。
```java
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("custom://")) {
String data = url.replace("custom://", "");
String[] arr = data.split("\\?");
String action = arr[0];
String params = arr[1];
if ("login".equals(action)) {
JSONObject jsonObject = new JSONObject(params);
String username = jsonObject.optString("username");
String password = jsonObject.optString("password");
// 处理登录逻辑
}
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
```
### 第四步:打包 APK
在 Android Studio 中生成签名证书,并使用该证书对应用进行签名。然后将应用打包为 APK 文件,并安装到 Android 设备上测试。
## 打包 iOS 应用
### 第一步:创建 iOS 项目
在 Xcode 中创建一个新的项目,选择 Single View App 模板。在 Main.storyboard 中添加一个 WebView 控件,并设置其约束等属性。
### 第二步:引入 ThinkPHP 5 项目
将 ThinkPHP 5 项目拷贝到 iOS 项目的资源目录下。在 WebView 控件的 loadRequest() 方法中加载 ThinkPHP 5 项目的入口文件,例如 index.php。
```objective-c
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"php"]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
```
### 第三步:实现 JavaScript 与原生代码交互
在 iOS 项目中实现一个继承自 UIWebViewDelegate 的类并重写 shouldStartLoadWithRequest() 方法,该方法用于拦截 WebView 加载的 URL。在 JavaScript 中通过 document.location.href = "custom://xxx" 调用原生代码。
```objective-c
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *url = request.URL.absoluteString;
if ([url hasPrefix:@"custom://"]) {
// 处理 JavaScript 调用原生代码的逻辑
return NO;
}
return YES;
}
```
在 JavaScript 中通过 window.prompt() 方法将数据传递给原生代码。例如,将用户名和密码传递给原生代码。
```javascript
var username = "admin";
var password = "123456";
window.prompt("login", JSON.stringify({username: username, password: password}));
```
在原生代码中解析 JavaScript 传递的数据,并进行相应的处理。
```objective-c
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *url = request.URL.absoluteString;
if ([url hasPrefix:@"custom://"]) {
NSString *data = [url stringByReplacingOccurrencesOfString:@"custom://" withString:@""];
NSArray *arr = [data componentsSeparatedByString:@"?"];
NSString *action = arr[0];
NSString *params = arr[1];
if ([action isEqualToString:@"login"]) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:[params dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
NSString *username = dict[@"username"];
NSString *password = dict[@"password"];
// 处理登录逻辑
}
return NO;
}
return YES;
}
```
### 第四步:打包 IPA
在 Xcode 中生成证书和描述文件,并使用该证书对应用进行签名。然后将应用打包为 IPA 文件,并安装到 iOS 设备上测试。
通过以上步骤,就可以将 ThinkPHP 5 项目打包为 Android 和 iOS 应用了。需要注意的是,在打包过程中需要保证应用的安全性,并且需要对应用进行测试和优化,以提高用户体验。