再也不做外包了!哎,真香!!

840 阅读4分钟

交待下背景,“小霸戈”五年Android开发经验,常年自愿加班、不要工资,本来是一个快乐、自在的猿~,自从一时糊涂当了房奴后,就想尽办法搞钱,这不朋友介绍了个App开发的活,客户是台湾的(需要繁体),开始周期一个半月。

要是阁以前我还是会会考虑做不做的,毕竟钱少事多,做外包什么的是最累的了,但是今时不同往日,搞钱的事不能马虎!!!

这里得感谢我的好哥们(无情的中间商)给我介绍的活儿~~

图片来自网络

先来个App的无码高清设计图:

功能倒不是很多的,就是有几个比较难搞的地方:

  • 要支持 iOS 和 Android
  • 接入Firebase
  • 在线播放音频
  • ...

好在后台不用我出马,不然又是一款杀手级应用!!

说干就干

啥要还要跨平台?可我只是个Android小开发,虽然之前用RN做过跨平台的应用,但按目前RN的发展用来做跨平台App还是有点招架不住,好在我常年利用上班时间,摸鱼、划水混迹于Android开发技术圈,记住了不少关键字。

现在最火的跨平台技术就就是Flutter吗? 闲鱼、哈啰出行等互联网公司搞的热火朝天的,虽然我不会,crtl+c搞不定吗?

搭建工程

老实说,我忘记了~~ 但是办法总比困难多,这难不到我的!

工程搭完了,最少节省两天的工作量,充分发挥没那条件就创建条件的精神~~

正式开干

先把Flutter环境安排上,这个我是完全参考flutter中文网来的,感谢社区大神的无私奉献。

flutterchina.club/

安装完flutter doctor下, 如下就配置好了:

接下来就是快乐的打代码时光了,利用周末、下班后2小时,效果非常明显,我居然会一点dart语法了,感觉上是java的表兄弟,除了加了一些高级语法外,感觉上没什么大的区别,那些高级语法我不用它不就是java了吗, 就这样利用业余时间每天弄几个页面,不会的就百度看flutter文档,不会的效果就直接pub.dev搜索,造轮子是不可能的,很快第一个版本就弄出来。

这里要安利下Flutter做App是真的快(前提是你有在下这么强,嘿嘿),没有Android那繁琐的xml配置Widget搞定所有布局!

首页

写UI的时候就碰到一个比较难点的侧滑的效果,其他的都不值一提,有兴趣的可以看看,给上链接感谢大佬提供的框架:

juejin.im/post/5bcd74…

心得体会: flutter组件挺全的,大部分不用自己造轮子。

Flutter 播放音乐

开始没做之前,我以为这个会花一些时间,甚至做了最坏的打算了,大不下写两个原生的插件支持下,万万没想到是google已经为flutter实现了音乐播放的插件,google大法好啊。

pub.dev/packages/au…

使用也非常简单,简单几步就行,先添加依赖:

dependencies:
  ...
  audioplayers: 0.19.1
  ...

然后再初始化下:

  void initAudioPlayer() {
    audioPlayer = new AudioPlayer();
    ...
  }

需要注意的是iOS后台播放的问题,需要特殊配置下:

<key>UIBackgroundModes</key>
<array>
  <string>audio</string>
  ...
</array>

Firebase 集成

firebase的集成也非常的简单,但是就是测试的时候很麻烦,因为是google的服务需要tizi,现在搞这玩意有点难啊。。。 。,办法总比困难多,努力下没什么是解决不了的,虽然我是请人吃了顿饭才解决。。。

总的来说集成还是很快的,先引用下依赖:

dependencies:
  ...
  firebase_core: 1.3.0
  firebase_auth: 1.4.1
  cloud_firestore: ^2.2.2
  firebase_messaging: ^10.0.2

然后初始化下,就搞定了,详细的就不解释了,毕竟时间就是金钱,你少看几个字,我少打几个字大家都有好处:


void main() async{
  await initFirebase();

  runApp(FlowApp());
}

Future initFirebase() async {
  FirebaseApp firebaseApp = await Firebase.initializeApp();
  await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
    alert: true,
    badge: true,
    sound: true,
  );
  FirebaseMessaging messaging = FirebaseMessaging.instance;

  NotificationSettings settings = await messaging.requestPermission(
    alert: true,
    announcement: false,
    badge: true,
    carPlay: false,
    criticalAlert: false,
    provisional: false,
    sound: true,
  );
  print('用户授予权限结果: ${settings.authorizationStatus}');
  return Future.value("");
}

class FlowApp extends StatefulWidget {
   @override
  State<StatefulWidget> createState() => FlowAppState();
}

class FlowAppState extends State<FlowApp>{

  FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;

  static const AndroidNotificationChannel channel =const AndroidNotificationChannel(
    'high_importance_channel', // id
    'High Importance Notifications', // title
    'This channel is used for important notifications.', // description
    importance: Importance.max,
  );

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    initialize();
  }

  void initialize() async {
    ...
  }

  ...
}

初始化代码有点多,有兴趣可以回复我获取demo代码。

总结

测试联调这一步是最花时间,也是最麻烦的了,有一个非常重要的问题,就是沟通问题,大家的工作时间都不统一,我是业余时间来做的,周末客户不上班,晚上他们已经下班,所以每次只能我晚上回来修改完代码,然后第二天发包给他们测试,然后测试问题我也不能改,只能晚上回去改,测试进度非常的慢,时间就是金钱啊。。。。

做外包的时间只有两个时间点是最快乐

  1. 缺钱的时候,有活可做
  2. 做完,收钱的时候

其他的时间都在后悔,再也不接外包了。。。。