Posted on 八月 31, 2021
如何删除Unity Hub的下载缓存
时隔三年,又重新检回Unity。
用Unity Hub下载Unity,中途遇到网络错误,再次重启Unity Hub,发现无法找到下载项了(做的啥啊全是bug)。
想着下了那么多了结果想取消想继续都不行,得把已下载的缓存删掉吧,于是Google一下。
open $TMPDIR
打开缓存目录,删除/unityhub-xxxxxxx/
来源:
Posted on 八月 31, 2021
Word 无法打开现有共用模板 (Normal.dotm) 解决办法
最近mac上的word不知怎了启动时报Word 无法打开现有共用模板 (Normal.dotm),关闭时也疯狂弹窗。遂百度了一下,解决办法是:
在finder中搜索Normal.dotm,删除。
世界清静了。
Updated on 八月 31, 2021
MacBook Pro 开机巨慢无比解决办法
由于平时不常关机,没发现此问题。最近经常切到windows系统,再重新开机启动macOS时,发现启动巨慢无比,估计有2-3分钟。在网上搜没找到解决方案。最后抱着试试看的态度用CleanMyMac X清理了一下,问题解决!
具体方法如下:
安装该软件,打开后点击 速度 -> 优化 -> 查看项目
登录项里能关就关了,启动代理中也是,如果没什么用的甚至可以删除。
重启发现速度果然回归正常了!
但是再次打开CleanMyMac发现有的启动代理又开启了,不知道会不会又拖慢节奏了。
不得不说这软件挺好,其中还有清理系统缓存的功能,貌似也还不错,不过没敢清理,怕清理之后丢失数据了。
再次重启归来,速度依然很快!不戳。
Updated on 八月 31, 2021
升级Android Studio到4.2遇到的坑
升级到Android Studio 4.2后,遇到一些坑,记录一下。
代理无法修改问题
首先是代理配置问题。每次启动时都跳出来窗口让配置代理,和平时在preference里配置代理的界面不同。每次都跳,索性就点了不再提醒还是什么按钮。结果代理就一直生效,无法修改了。
解决办法是修改user/.gradle/gradle.properties,将其中的代理配置去掉。
代码报错标红,但是能编译通过
解决办法是关闭Android Studio,删除项目的.gradle、.idea文件夹,重启进项目。
Posted on 十二月 7, 2020
近期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。希望解锁前不会发生崩溃叭。
Posted on 十一月 25, 2020
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
Updated on 三月 31, 2021
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如前文所述。
修改后,经测试,不再出现问题。
Posted on 九月 7, 2020
关于Flutter控件在build时什么情况会重新加载
开发过程中,发现有的控件在父节点控件build时会重新调用initState()。经过测试发现,如果GlobalKey发生变化,则控件会重新加载,即调用initState(),如果GlobalKey不变,则直接调用build。
Updated on 七月 30, 2020
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。
Updated on 七月 30, 2020
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。可以运行了。