CHAPTER 15 / MOBILE

手機 App:
iOS + Android 全包

網站做完不夠。客戶會問「能不能上 App Store?」這章三條路全教:React Native(一份 code 兩平台)、Kotlin(Android 原生)、Swift(iOS 原生)。 了解每條路的取捨,你才能跟客戶報出對的價、做出對的選擇。

  • 看懂 RN / Kotlin / Swift 三條路的取捨
  • 會用 Expo 寫 RN,做出能上架的 App
  • 會原生 Android / iOS 基本架構
  • 會處理推播、相機、定位、IAP
  • 會把 App 上架 Play Store 與 App Store
LESSON 15.1

三條路怎麼選

React Native (Expo)Kotlin(Android 原生)Swift(iOS 原生)
學習會 React 就能寫新語言新工具新語言新工具
平台iOS + Android(一份 code)只有 Android只有 iOS
效能好(80% 場景夠)
UI跨平台一致原生原生
適合MVP、新創、跨平台大公司、效能要求高大公司、效能要求高
市場新創 70% 用大公司 Android team大公司 iOS team

還有 Flutter(Dart)、Capacitor(Web 包成 App)、Tauri(桌面為主)。但接案 / 個人最強組合是會 RN + 略懂 Kotlin/Swift

建議學習順序:(1) 先 RN/Expo 上架你的第一個 App;(2) 接案接到「客戶要原生效能」時再學 Kotlin(市佔較高);(3) iOS 客戶多再學 Swift。

LESSON 15.2

React Native + Expo

npx create-expo-app my-app
cd my-app
npx expo start
# 手機裝 Expo Go App,掃 QR 直接看
// app/index.tsx(Expo Router)
import { View, Text, Button, FlatList } from 'react-native';
import { useState } from 'react';

export default function Home() {
  const [todos, setTodos] = useState([]);

  return (
    <View style={{ padding: 20 }}>
      <Text style={{ fontSize: 24 }}>待辦事項</Text>
      <FlatList
        data={todos}
        keyExtractor={item => item.id}
        renderItem={({ item }) => <Text>{item.text}</Text>}
      />
      <Button title="新增" onPress={() => setTodos([...todos, { id: Date.now(), text: '新事項' }])} />
    </View>
  );
}

跟 Web React 差在哪

常用套件

上架

# 用 EAS Build(Expo 雲端打包)
npx eas-cli build --platform ios
npx eas-cli build --platform android
npx eas-cli submit

不用 Mac 也能 build iOS。

Apple 開發者帳號 $99/年,Google Play 一次性 $25。Apple 審核嚴,常被拒;Google 審核較鬆但會用機器掃。第一次上架預留 1~2 週。

LESSON 15.3

Android 原生:Kotlin + Jetpack Compose

Kotlin = Google 官方欽定的 Android 開發語言(取代 Java)。Jetpack Compose = 現代宣告式 UI(類似 React)。

裝 Android Studio

到 developer.android.com 下載 Android Studio。內含 Kotlin compiler、emulator、SDK。

// MainActivity.kt
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            CounterScreen()
        }
    }
}

@Composable
fun CounterScreen() {
    var count by remember { mutableStateOf(0) }
    Column(modifier = Modifier.padding(24.dp)) {
        Text("計數: $count", fontSize = 24.sp)
        Button(onClick = { count++ }) {
            Text("+")
        }
    }
}

Android 生態關鍵字

權限

AndroidManifest.xml 宣告 + runtime 申請(Android 6+):

val launcher = rememberLauncherForActivityResult(
    ActivityResultContracts.RequestPermission()
) { granted -> if (granted) openCamera() }
launcher.launch(Manifest.permission.CAMERA)

上架 Play Store

  1. 產 release AAB(Android App Bundle)
  2. 簽名(Play App Signing)
  3. 到 Play Console 上傳
  4. 填店面資訊、隱私權政策、目標年齡
  5. 送審(通常幾小時~幾天)
LESSON 15.4

iOS 原生:Swift + SwiftUI

Swift = Apple 官方語言。SwiftUI = 跟 Compose 對標的宣告式 UI。需要 Mac(Apple 沒給 Windows / Linux 開發 iOS 的選擇)。

import SwiftUI

struct ContentView: View {
    @State var count = 0

    var body: some View {
        VStack(spacing: 20) {
            Text("計數: \(count)")
                .font(.title)
            Button("+") {
                count += 1
            }
        }
        .padding()
    }
}

iOS 生態關鍵字

上架 App Store

  1. App Store Connect 建立 App record
  2. Xcode → Archive → 上傳
  3. 填店面資訊、隱私標籤(很嚴)
  4. 送審(1~3 天,可能被退)

Apple 審核會被退的常見原因:UI 寫得像 Web(不像 iOS)、隱私政策不全、有「測試」字樣、用了第三方支付規避抽成(除遊戲外允許 EU)。

LESSON 15.5

共通:推播、IAP、深度連結

推播(Push Notifications)

IAP(In-App Purchase)

Deep Link / Universal Link

https://example.com/post/42 在裝有 App 時打開 App。

LESSON 15.6

App 設計建議

練習:用 Expo 做你的第一個 App

  1. 把第 6 章的 To-Do List 用 Expo + React Native 重做
  2. 加入:相機拍照當待辦封面(expo-image-picker
  3. 加入:本地推播提醒
  4. 用 EAS Build 出 APK,安裝到自己手機
  5. 選擇性:上架到 Google Play 內測

常見卡關 FAQ

// App 學員最常問的問題
沒 Mac 能寫 iOS App 嗎?
RN/Expo 用 EAS Build 可以雲端編譯 iOS。但要 debug iOS 特定問題、用 Xcode、上 TestFlight 還是要 Mac(或租 MacinCloud)。長期想做 iOS 投資 Mac mini 划算。
RN 跟 Flutter 哪個好?
會 React 用 RN(無痛延伸)。沒前端基礎且看重效能用 Flutter(Dart 學習曲線稍陡但 UI 一致性極好)。台灣接案 RN 機會略多(共用前端工程師)。
Capacitor / Cordova 還能用嗎?
能但效能差、體驗弱。只在「公司已經有 Web App、想最低成本上架」勉強用。新專案不推薦。
App 上架被拒怎麼辦?
看拒絕信,照建議改、回信說明、再送。不要重複送同樣版本。Apple 客服較嚴但講道理。Google 多是機器掃,可以 appeal。
App 怎麼賺錢?
三招:(1) 訂閱(最穩,用 RevenueCat)、(2) 一次買斷、(3) 廣告(AdMob)。新 App 建議走訂閱 + 7 天試用。台灣使用者願意付的 App 比預期多。
← 上一章
15 行銷