0%

Windows下安装黑苹果并配置Flutter环境

之前尝试过在 VMWare 上安装黑苹果来运行 FlutterIOS 端,但是卡在了安装 XCode 这一步。这次 Flutter 端在接入 IOSNotification Service Extension 时遇到很多问题,于是就想自己配置一个 MacOs 环境来协助他解决这个问题。下面是全部的安装过程。

系统安装

之前安装的 MacOS 版本是 11.6.6 的,这次选择了 10.15.5,因为搜索出来的安装教程中大多使用的都是这个版本。

Windows 安装 MacOS 10.15 虚拟机调试 Flutter iOS 应用 这篇博客中有详细的安装步骤,包括各种需要的资源都有,我这里就不再赘述了。

dmg镜像转cdr

在下载系统镜像时,下载的镜像后缀是 dmg 类型的,而 vmware 需要的镜像类型是 cdr 的,因此需要对下载下来的镜像进行处理。

找到了一篇文章:windows系统下,如何将dmg文件转化为cdr文件

选择 Tools 菜单,点击 create disk image

选择转换后 cdr 文件存储位置,注意文件名要自己修改,后缀设置为 cdr

等待转换完成即可

转换成功

分辨率调整(优化系统卡顿)

在安装完 VMWare Tools 后,发现系统异常的卡顿,完全不能正常操作。于是尝试将 VMWare Tools 卸载,卡顿感大大降低,已经不影响正常使用了。但是 VMWare Tools 是必不可少的,所以这么做只能算拆东墙补西墙。

针对这个问题,我猜测是与我的电脑配置有关,我的电脑分辨率是 2k 的,查看安装了 VMWare Tools 后的 MacOs,发现分辨率也是 2k。但是 MacOS 的显存只有 128M,显然不足以带动这么高的分辨率。于是猜测,是否可以通过调整虚拟机的分辨率,来优化系统运行速度。

在虚拟机的设置中找到了这个配置,如下:

将其调整后,重新运行虚拟机,卡顿感大大减轻!

安装 XCode

正常的安装 XCode 是直接在 AppStore 中安装就可以了,但是由于安装的 MacOs 版本比较老,AppStore 中无法直接下载,会报下面的提示:

因此只能通过手动下载安装包的方式来安装,前往 XCode 下载地址,找支持当前系统版本的 XCode,我的 MacOS 版本是 10.15.5,下载的 XCode 版本是 12.1注:如果之后需要安装 Flutter,需要首先确定对应的 Flutter 版本支持的最低版本 XCode,我在这里就踩了个坑,开始选择的 XCode 版本是 11.7,之后安装的 Flutter 版本是 2.8.1,在执行 flutter doctor 时被提示 XCode 版本过低,最低支持 12.0.1 版本的,导致我又重新安装了一遍):

安装完毕之后打开 XCode,检查一下下面的配置是否配置,如果不配置的话,之后执行 flutter doctor 将找不到已安装的 XCode

pod install 卡住

是在执行红框中的命令时卡住的,原因是这个项目太大了

可以通过下面的链接查看这个项目的大小:链接。这是github的api,打开之后显示一串json,是项目的相关信息,在里面找size,即是项目大小。换算下来是 965.9M,所以下载肯定是需要一定时间的。

但是这么一直干等也不是办法,在 Mac 系统中可以通过 活动监视器 来查看当前的下载进程,如下:

clone 下来后安装步骤继续执行,之后报了一个错误,MobileVlcKit 依赖安装失败:

目前发现这个错误对项目的运行并没有影响,所以暂时没有处理。

Java 环境配置

首先下载 JDKJDK8 - MacOS 下载地址

下载安装完毕后,需要配置 Java 环境,打开

Mac电脑Java环境安装

SVN 安装

首先需要安装 HomeBrew 工具,Homebrew 是一款 MacOS 平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。安装命令如下:

1
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

接着使用下面的命令安装 SVN

1
brew install subversion

之后可以安装一些 SVN 的客户端,由于我之后会使用 Android Studio,里面已经集成了 SVN 的一些基本功能,所以这里就不再安装第三方客户端了。

使用 SVN 将代码拉取下来:

1
svn checkout [仓库地址] 

Android Studio 安装

官网下载:地址

安装成功后,打开 Android Studio。安装 FlutterDart 插件,如下:

Android Studio 上找不到真机设备

如下,将设备连接到电脑上时,Android Studio 中没有显示对应的设备

VMWare 的虚拟机选项中可以找到设备的连接信息,如下:

这个问题也与虚拟机设置有关,调整虚拟机设置中的 USB 选项即可,如下:

之后重启虚拟机,连接设备,成功找到

扩展 MacOS 的磁盘空间

Android StuioBuild 项目时,发现磁盘空间已经不够了,需要对磁盘空间进行拓展。

这篇博客中有完整的拓展磁盘空间的方法:MacOS 10.15 VMware 虚拟机扩展磁盘

使用 XCode 构建时报错找不到依赖

错误信息如下,报错的位置是 GeneratedPluginRegistrant.m 文件:

GeneratedPluginRegistrant.m Module not found. 这篇讨论中有好多种解决办法,尝试了其中的几种,最终我的处理办法如下:

  1. 首先将原先 ios 目录下 pod 生成的几个文件和文件夹全部移除,接着执行 flutter clean 命令
  2. 然后执行 flutter pub get
  3. 之后运行 flutter build ios,初次运行可能会报错,其中某些依赖找不到,这时需要修改 Podfile 文件,增加如下配置:参考文章
    1
    2
    source 'https://github.com/aliyun/aliyun-specs.git'
    source 'https://github.com/CocoaPods/Specs.git'
    然后还有可能报错 curl: (60) SSL certificate problem: certificate has expired,可以在命令行执行下面的命令:参考文章
    1
    echo insecure >> ~/.curlrc
  4. 之后再运行 flutter build ios 就可以了(可能需要等待一段时间)

上面的第3步在与 flutter 端同事沟通后,得知他的解决办法是直接修改 Podfile 文件,他的 Podfile 文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'

# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
source 'https://github.com/aliyun/aliyun-specs.git'
source 'https://github.com/CocoaPods/Specs.git'

ENV['COCOAPODS_DISABLE_STATS'] = 'true'

project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}

def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end

File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end

require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)

flutter_ios_podfile_setup

target 'Runner' do
use_frameworks!
use_modular_headers!
# pod 'AlipaySDK-iOS'
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',
## dart: PermissionGroup.calendar
'PERMISSION_EVENTS=1',

## dart: PermissionGroup.reminders
# 'PERMISSION_REMINDERS=1',

## dart: PermissionGroup.contacts
'PERMISSION_CONTACTS=1',

## dart: PermissionGroup.camera
'PERMISSION_CAMERA=1',

## dart: PermissionGroup.microphone
'PERMISSION_MICROPHONE=1',

## dart: PermissionGroup.speech
# 'PERMISSION_SPEECH_RECOGNIZER=1',

## dart: PermissionGroup.photos
'PERMISSION_PHOTOS=1',

# dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
'PERMISSION_LOCATION=1',

## dart: PermissionGroup.notification
'PERMISSION_NOTIFICATIONS=1',

## dart: PermissionGroup.mediaLibrary
'PERMISSION_MEDIA_LIBRARY=1',

## dart: PermissionGroup.sensors
# 'PERMISSION_SENSORS=1',

## dart: PermissionGroup.bluetooth
'PERMISSION_BLUETOOTH=1',

## dart: PermissionGroup.appTrackingTransparency
# 'PERMISSION_APP_TRACKING_TRANSPARENCY=1',

## dart: PermissionGroup.criticalAlerts
'PERMISSION_CRITICAL_ALERTS=1',
]
end
end
end

修改 Podfile 后执行 flutter build ios ,发现还有报错:

这里搜遍了各种博客都没找到解决办法,与 App 端同事的配置进行了对比也没有差异。执行了清除本地依赖然后重新拉取的操作也无济于事,目前只能猜测是我的 XCode 版本比较低:12.1。最后无奈之下只能将这两处报错的代码注释掉,项目才运行起来。

构建App时报错

报错信息如下

App 端同事提示可以直接在 XCode Run 也可以,尝试了一下,Build Successed,但是在安装时出现了下面的提示:

Google 上搜索了一下,发现可能是 XCode 版本过低导致的,我的设备是 Apple 11,对应的系统是 IOS 15.4XCode 版本只有 12.1,在 StackOverflow 上有人给了一个 XCodeIOS 版本的对应关系表:

这个问题目前只能通过升级 XCode 来解决,但是当前版本的系统不支持更高版本的 XCode 了,因此目前这个问题没法解决。真机调试也就没法继续了,目前只能将 App 运行在虚拟机上进行测试,之后尝试一下安装更高版本的 MacOs

解决构建时的报错(2022-10-12)

无意间发现了一篇文章:Could not locate device support files,可以解决 Xcode 版本过低但 IOS 版本过高,导致不能进行真机调试的问题。

这个处理办法是添加一个适配指定 IOS 版本的包到 XCode 安装目录,之后就可以进行真机调试了。先从 适配包下载地址 下载指定版本的包,比如我的 IOS 设备版本是 15.5,就下载 15.5 版本的包,然后按照 Could not locate device support files 这个里面的教程,将下载下来的包放入 XCode 的指定目录下:

之后重启 XCode,重新构建项目,报了下面的错误,与之前不一样:

按照 iPhone not connected. Xcode will continue when iPhone is connected 给的解决办法处理一下即可:

解决之后进入 Xcodewindow -> Devices and Simulators 菜单,应该没有报错信息:

之后重新构建,成功触发了安装进程,但是又报了错误:

The code signature version is no longer supported 找到了解决办法:

XCode 中添加如下配置即可:

之后重新进行构建,可以在下面的 Tag 中查看构建进程

等待一段时间后,安装成功!

通过 Flutter 安装 release

上面通过 Xcode 安装的 App 必须插上数据线才能运行,数据线一旦断开 App 将无法运行。解决办法就是通过 Flutter 安装 release 版。

注:虽然安装的是 release 版,但对应的 Api 服务地址还是线下的,如果使用线上的 Api 地址,推送将无法送达。

直接在 Android Studioterminal 中执行命令:flutter run --release。之前运行这个命令时是会报错的,无法安装成功。

等待一段时间后,安装成功!