如何删除Unity Hub的下载缓存

时隔三年,又重新检回Unity。

用Unity Hub下载Unity,中途遇到网络错误,再次重启Unity Hub,发现无法找到下载项了(做的啥啊全是bug)。

想着下了那么多了结果想取消想继续都不行,得把已下载的缓存删掉吧,于是Google一下。

open $TMPDIR

打开缓存目录,删除/unityhub-xxxxxxx/

来源:

https://forum.unity.com/threads/which-temp-folder-unity-hub-downloads-the-install-files-on-mac.543710/

Word 无法打开现有共用模板 (Normal.dotm) 解决办法

最近mac上的word不知怎了启动时报Word 无法打开现有共用模板 (Normal.dotm),关闭时也疯狂弹窗。遂百度了一下,解决办法是:

在finder中搜索Normal.dotm,删除。

世界清静了。

https://www.feng.com/post/10206026

MacBook Pro 开机巨慢无比解决办法

由于平时不常关机,没发现此问题。最近经常切到windows系统,再重新开机启动macOS时,发现启动巨慢无比,估计有2-3分钟。在网上搜没找到解决方案。最后抱着试试看的态度用CleanMyMac X清理了一下,问题解决!

具体方法如下:

安装该软件,打开后点击 速度 -> 优化 -> 查看项目

登录项里能关就关了,启动代理中也是,如果没什么用的甚至可以删除。

重启发现速度果然回归正常了!

但是再次打开CleanMyMac发现有的启动代理又开启了,不知道会不会又拖慢节奏了。

不得不说这软件挺好,其中还有清理系统缓存的功能,貌似也还不错,不过没敢清理,怕清理之后丢失数据了。

再次重启归来,速度依然很快!不戳。

升级Android Studio到4.2遇到的坑

升级到Android Studio 4.2后,遇到一些坑,记录一下。

代理无法修改问题

首先是代理配置问题。每次启动时都跳出来窗口让配置代理,和平时在preference里配置代理的界面不同。每次都跳,索性就点了不再提醒还是什么按钮。结果代理就一直生效,无法修改了。

解决办法是修改user/.gradle/gradle.properties,将其中的代理配置去掉。

代码报错标红,但是能编译通过

解决办法是关闭Android Studio,删除项目的.gradle、.idea文件夹,重启进项目。

近期iOS开发心得

AVAudioEngine + AVAudioPlayerNode时间不准问题

使用AVAudioEngine + AVAudioPlayerNode开发metronome过程中,偶然一次突然发现节拍不准了,经过与之前的代码对比,发现是AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)导致的。参数应该设为playAndRecord。

AVAudioPlayerNode stop()导致界面卡死问题

测试过程中,反复开始、暂停会导致界面卡死。原来以为是start导致的,经过逐行打log,发现是stop导致的。对AVAudioPlayerNode的其他操作的代码逐行打log发现,每次卡死的原因是stop之后又对AVAudioPlayerNode操作导致。解决办法是每次调用前,看flag是否是已经stop。

objc_sync_enter objc_sync_exit导致死锁问题

代码中需要对一个数组加锁,当操作数组时候加锁,操作完毕时候解锁。在网上搜寻一圈发现使用objc_sync_enter和objc_sync_exit可实现。遂objc_sync_enter(arr)这样使用,结果发现时长发生死锁。逐行打log发现,可能是arr操作后就改变导致锁无法释放。遂改为objc_sync_enter(self)。

关于在defer里解锁的思考:

考虑到代码执行过程中可能会发生异常,导致未执行解锁代码,如果在java中可以使用try catch finally在finally中解锁。搜索发现swift有defer关键字,在方法执行结束前执行defer中的代码。遂在加锁后面加了defer,defer中解锁。但是马上考虑到不应这样操作,因为需要解锁的地方不是在方法结束时,如果在方法结束时强制解锁,会造成错误解锁。遂暂未使用defer。希望解锁前不会发生崩溃叭。

Flutter如何在Xcode端指定main.dart运行

查看Build Phases中的Run Script发现,运行时调用xcode_backend.sh脚本build,打开此shell脚本,发现如果指定临时环境变量FLUTTER_TARGET的话,就会对该环境变量指定的文件作为main编译dart。所以如果想在xcode端指定main.dart的话,在原build语句前,增加临时环境变量,对FLUTTER_TARGET赋值即可。

export FLUTTER_TARGET="lib/main_for_metronome_test.dart"
/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build

Android接入USB设备后重新调用onCreate问题

给一个Android显示屏开发程序,发现接入usb扫码枪后,页面就重新加载,将Activity设为android:launchMode=”singleInstance”也没用。

经过网上查找资料,解决办法为在Manifest里该Activity增加

android:configChanges="screenSize|keyboard|keyboardHidden|navigation"

然后在java代码中增加

    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

参考:

https://blog.csdn.net/ansondroider/article/details/88238322

2021.3.31更新:

上线后,发现问题依然出现。由于采用DroidPlugin作为宿主自动更新程序,所以才想问题出现在宿主上。经过测试果然,程序正常运行没有问题,但是宿主安装后运行则会出现问题:插拔usb设备导致页面重新onCreate。

解决办法:修改DroidPlugin中manifests的所有activity声明,增加configChanges如前文所述。

修改后,经测试,不再出现问题。

关于Flutter控件在build时什么情况会重新加载

开发过程中,发现有的控件在父节点控件build时会重新调用initState()。经过测试发现,如果GlobalKey发生变化,则控件会重新加载,即调用initState(),如果GlobalKey不变,则直接调用build。

Xcode11 LaunchScreen国际化问题

新的项目是使用Xcode11开发的。使用之前的版本开发时,开屏国际化可以通过国际化的InfoPlist.string文件配置UILaunchStoryboardName = “LaunchScreenEn”,不同的语言指定不同的Storyboard文件,来实现开屏国际化。

然鹅到了Xcode11,不好用了,配置好了以后,在iOS12上启动白屏。在iOS13中启动可以显示,但是在进入APP主页面之前,会跳到在TARGET的Info中配置的Launch screen interface file base name所指定的开屏文件,然后再跳到APP主页面。

Xcode11新增对资源的国际化(比如图片),如果开屏不指定本地化的开屏Storyboard文件,所有语言都是用同一个Storyboard,只在图片资源做本地化区分,依然无效。在iOS12上依然白屏,在iOS13设备上,先白屏,再跳到TARGET的Info中配置的Launch screen interface file base name所指定的开屏文件。

似乎无论怎么配置,在iOS13上期间都会跳转到TARGET的Info中配置的Launch screen interface file base name所指定的开屏文件。

也就是iOS13启动过程中,页面显示顺序是:

①InfoPlist.string指定的UILaunchStoryboardName -> ②TARGET的Info指定的Launch screen interface file base name -> ③APP起始页面

如果①中使用的图片是国际化的,那么将无法展示。

所以可以将①中的图片使用非国际化的,②中的图片使用国际化的,这样①和②显示的就是一样的。

在iOS12中全显示白屏。

iOS12只有一种情况不会白屏,那就是仅在TARGET的Info中指定开屏文件,开屏可以显示。但是这样就无法国际化了。

要么使用国际化开屏,这样iOS13上可以显示,但是iOS12上无法显示开屏;要么不使用国际化开屏,这样iOS13、12都可以显示开屏,但是无法国际化。难以抉择。

查了一下,截止2020年6月17日,iOS 13 占比为81%。

考虑到13占比会越来越大,暂时舍弃12的开屏吧,12只能显示全白开屏了

后续:

上传至TestFlight,iOS12手机安装后竟然展示开屏了,所以看起来这个方法可行。

总结:

为每个语言创建开屏storyboard,使用的图片不是本地化图片;

创建一个为所有语言的开屏storyboard,用的是本地化图片;

将第一个的文件名,设为本地化InfoPlist.string的UILaunchStoryboardName;

将第二个的文件名,设为TARGET的Info的Launch screen interface file base name。

Flutter flavors

https://medium.com/@salvatoregiordanoo/flavoring-flutter-392aaa875f36

大致总结就是分别设置Android的productFlavors和iOS的schema,dart端无法设置flavor,可以通过指定main函数所在dart文件的方式实现flavor。感觉确实不方便,希望以后flutter可以完善这方面叭。

追加:注意设置Configuration,如果不设置的话在Android Studio这边运行时flutter会提示设置,按照提示的步骤设置即可。(升级flutter后似乎不设置也可)

Release崩溃问题

打包上传TestFlight运行发现APP启动崩溃,在工程里设置Run为Release,运行也崩溃,Debug则不崩溃。崩溃信息为

dyld: Library not loaded: @rpath/AudioKit.framework/AudioKit

Referenced from: xxx
Reason: image not found

修改Podfile,新增TARGET,复制Runner的配置。重新pod install。可以运行了。