2017年2月23日 星期四

iOS tips - ERROR-ITMS-90087 solution

最近把project的third party從cocoapod改成Carthage來管理,當專案不是一個人在搞的時候cocoapod有時真的很難一起協作。用Carthage之後基本上就是多加一個framework,日後要單獨update一個特定的library也是比較方便。但就像往常一樣,天底下沒有白吃的午餐,也絕對沒有一試就沒有bug的tool。當小弟準備Archive要上傳到itunes connect的時候,出現了 ERROR-ITMS-90087,跟google大神拜了三個響頭之後,得到下面解答,基本上就是在build phase裡加上這個script就能解掉這個error了...太神了。
(P.S. 因為我的third party library是cocoapod跟carthage都有使用,跟只有用carthage的script會不太一樣)

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info $FRAMEWORK_EXECUTABLE_PATH)

FRAMEWORK_TMP_PATH="$FRAMEWORK_EXECUTABLE_PATH-tmp"

# remove simulator's archs if location is not simulator's directory
case "${TARGET_BUILD_DIR}" in
*"iphonesimulator")
    echo "No need to remove archs"
    ;;
*)
    if $(lipo $FRAMEWORK_EXECUTABLE_PATH -verify_arch "i386") ; then
    lipo -output $FRAMEWORK_TMP_PATH -remove "i386" $FRAMEWORK_EXECUTABLE_PATH
    echo "i386 architecture removed"
    rm $FRAMEWORK_EXECUTABLE_PATH
    mv $FRAMEWORK_TMP_PATH $FRAMEWORK_EXECUTABLE_PATH
    fi
    if $(lipo $FRAMEWORK_EXECUTABLE_PATH -verify_arch "x86_64") ; then
    lipo -output $FRAMEWORK_TMP_PATH -remove "x86_64" $FRAMEWORK_EXECUTABLE_PATH
    echo "x86_64 architecture removed"
    rm $FRAMEWORK_EXECUTABLE_PATH
    mv $FRAMEWORK_TMP_PATH $FRAMEWORK_EXECUTABLE_PATH
    fi
    ;;
esac

echo "Completed for executable $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info $FRAMEWORK_EXECUTABLE_PATH)

done
參考出處:
http://stackoverflow.com/questions/30547283/submit-to-app-store-issues

2017年2月6日 星期一

iOS tips - Run app from cold start

最近測試從外部的URL來開啟app,但卻不太明白要怎麼測試app not running狀態下的情況。Stakeoverflow後找到了Xcode設定的方法

首先點選目前Target的圖示,再點選Edit scheme


找到Run section的radio button,把"Automatically"改成"Wait for execution to be launched"



這樣compile完之後就不會自動開啟,會等到手動開啟app,或從外部link開啟app才會執行debugging了。

2016年11月17日 星期四

iOS tips - Xcode 8 compile very slow

更新到Xcode 8之後,把project全改成swift 3相當痛苦。但不止如此,在把app透過USB裝到手機上時發現compile速度超慢,一次可能需要個5分鐘以上...(這是以前在寫BIOS的時代嗎? build個code可以先去上廁所買個飲料這樣) 在stackoverflow上發現了有個解法,真的不知道這些神人是怎麼發現的,或許是apple的engineer自己上來回覆的吧,不然怎麼會知道加這參數就能改善了

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
在build setting中加上以上的參數後,compile and install的速度就正常了,爽

2016年9月30日 星期五

iOS tips - Get IP Address

在swift中似乎沒有get ip address的function可以直接call,stackoverflow一下後看到了這一篇Get IP Address,其中重點為在swift專案中的objective-c header include一個標頭檔

2016年9月12日 星期一

iOS tips - CocoaAsyncSocket + Swift tutorial

UDP or TCP/IP socket傳送是許多開發者經常會用到的protocol,當想要用iPhone device跟其他在同網域下的device溝通時,這是我們一定會碰到的課題,網路上有許多好的tutorial以及example,google一下就能找到很多英文的教學,我是用了CocoaAsyncSocket這個library,只不過裡面的demo code是objective-c的,小弟照著寫了個UDP swift版本的,有興趣的可以參考,也歡迎提出指正。

2016年9月7日 星期三

iOS tips - 'No UICollectionViewLayoutAttributes instance for -layoutAttributesForItemAtIndexPath' crash

工作寫的app中的collection view使用了custom collection view layout。最近為了一個分享的需求所以需要在開啟外部url link後捲到指定的位置,透過collectionview的function scrollToItemAtIndexPath使得collectionview跑到指定的位置。


2016年8月17日 星期三

iOS tips - Image Exif

因為工作的需要,必須處理image的exif資訊。在iOS上從來沒考慮過這檔事,所以花了些時間研究了一下。
首先了解到的是,原來UIImage不會帶著原始image file的額外資訊,所以假設從網路或者是手機內部資料夾得到的原始檔案轉成UIImage的話,那怎麼讀也不會有exif資訊的,因為這個類別把哪些資訊都去掉了,只留下生成影像的data而已。因此如果要讀取或修改exif資訊的話只能從原始的data下手