iOS Yahoo APIs

如果有人需要使用Yahoo Weather, GEO location api可以直接拿來使用,由於剛好需要使用,就順便寫了,使用方式非常的簡單

歡迎順手取用 - https://github.com/IskenHuang/YahooLibrary


Reference
YQL Console - http://developer.yahoo.com/yql/console/#h=select%20*%20from%20weather.forecast%20where%20woeid%3D2502265
Yahoo Place Finder - http://developer.yahoo.com/geo/placefinder/

iOS6 AddressBook list

使用iOS6 Addressbook的Sample,使用前別忘了先
"#import <AddressBook/Addressbook.h>"



Reference: here: http://stackoverflow.com/a/12648938/480415

iOS Multiple target in the same project

如果新增Target在同一專案下可利用以下方式來區隔Target,避免需要維護兩份Code的成本

選擇 target -> Build Settings -> 搜尋 "preprocessor Macros"

*此範例為新增一個lite的版本
*Debug & Release 兩個版本都要加入

完成後在需要判斷是否為pro或lite版本方式


ios project build build number auto increase

xcode自動增加build number

Step1. Add Run Script


Step2. Input Script


如果是增加數字(1, 2, 3, ...... 9, 10, 11, 12, ...)
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

如果為16進位(1, 2, 3, ...... 9, A, B, C, ...)
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

完成後每次Build就會自動增加Build number

ios tableView cell accessory

TableViewCell的右邊常常會看到個「>」或者其他符號,常見的幾個當然系統內建就有可以參考如下

UITableViewCellAccessoryDisclosureIndicator

UITableViewCellAccessoryDetailDisclosureButton

UITableViewCellAccessoryCheckmark

當然,如果都不需要顯示使用
UITableViewCellAccessoryNone

使用方式如下
[cell setAccessoryType:XXXX]


參考資料
iOS Developer Library - UITableViewCell

Objective C 字串補0

在連續檔案時常常需要用上,例如連續圖片的動畫,用這方法就非常的重要,例如需要一串png圖檔「a0001.png」~「a0100.png」,這時候就相當重要好用

就已上面這例子在Objective C當中產出這100個檔名來
for(int i = 1; i <= 100; i++){ [NSString stringWithFormat:@"%04d", i]; }


格式「%nd」 n:需要補滿至幾位數
sample %2d
1
2
3
...
10
11
12

格式「%0nd」0:用0補滿至n位數
sample %02d
01
02
03
...
10
11
12

NSLocalizedString 多國語系字串

要使用這方式首先要新增檔案


檔案命名為"Localizable.strings"


設定字串KEY VALUE方式如下(行末別忘了加上分號)
"YOUR_KEY" = "YOUR VALUE";

使用字串方式如下
NSLocalizedString("KEY", nil)


但是有些時候會有個問題,在使用NSString 自定Format的同時會變得很醜,以及不同語言表示方式不同的問題,真的按照上面的方式硬幹當然可以,只是組出來很醜,如下範例
[NSString stringWithFormat:@"你想要吃什麼? %@ / %@", NSLocalizedString("KEY_A", nil), NSLocalizedString("KEY_B", nil)]

或許上面這範例還算簡單的狀況,如果前後還有加上其他字串等光組個字串眼睛都累了,Objective-C當然考量到了這點,就上面這範例可以修改為以下方式:

Localizable.strings
"YOUR_KEY" = "你想要吃什麼? %@ / %@";

code
[NSString stringWithFormat:NSLocalizedString(@"YOUR_KEY",nil), VALUE_A,VALUE_B ]



iOS get info.plist value

App中需要取得info.plist內容可使用下面這方式
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"PLIST_KEY_STRING"];

sample: App顯示名稱
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"];

MACOS Fix Duplicate or Old Items on "Open With" Menu

Mac上常常會有看到在"open with"列表中相當東重複或舊的應用程式,下圖為正常狀況,但是常會有很多相同的應用程式混於其中,以下只需要兩個步驟解決此問題。


Step 1. 打開終端機,然後輸入以下這串指令
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/\
LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain local\
-domain system -domain user

Step 2. 重新啟動Finder(Command+option+esc),點選重新啟動Finder


完成後就可以體驗乾乾淨淨的open with menu了~

iOS simulator memory warning on device


平常在simulator上可以使用從"Hardware -> Simulator Memory Warning",Device上可以使用以下這串code來模擬

[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];

iOS _OBJC_CLASS_$_CALAYER error

一般開發中應該比較不會遇上這問題,應該是在copy別的code使用時比較會遇上...或者寫的很順就忘記去import framework
_OBJC_CLASS_$_CALAYER

解決方式只要把"QuartzCore.framework"加入即可

Nodejs file upload

在server端需要加入,主要為上傳到暫存資料夾,然後刪除再將檔案移動至想要的資料夾中


html使用form方式加入,使用bootstrap的CSS將畫面美化


相關連結
Twitter Bootstrap
Nodejs

Android WebView with load ProgressBar

It usually difficulty internet environment on mobile device. Sometimes angry for don't know the loading status. Maybe device be like angry bird fly on air. The feedback is very very important.

How to get WebView status Sample as below
webView = (WebView) findViewById(R.id.index_webview);
webView.loadUrl("YOUR_URL");
webView.setWebChromeClient(new WebChromeClient(){
public void onProgressChanged(WebView view, int progress) {
//Make the bar disappear after URL is loaded, and changes string to Loading...
if(newProgress <= 10){ //TODO something } // Return the app name after finish loading if(progress == 100){ //TODO something } } });

Reference
Android Developer
Android Developer - WebView

iOS UIWebView scrollview unrecognized

先前寫過一篇「iOS Webview scroll bounces」,能夠把webView的scrollView的反彈移除,在目前持有的手機版本iOS 5.1中相當的正常,但在iOS 4.3.3中卻會出現錯誤訊息如下:
[UIWebView scrollView]: unrecognized selector sent to instance

由於無法直接access到UIWebview 的scrollView,但scrollView確實是webView的subview,解決方式如下:
NSArray *webViewSubViews = [NSArray arrayWithArray:[webView subviews]];
UIScrollView *webScroller = (UIScrollView *)[webViewSubViews objectAtIndex:0];
webScroller.bounces = NO;

將WebView的ScrollView取出,再將其進行設定即可。

相關連結
iOS Developer Library
iOS Developer Library - WebView
iOS Webview scroll bounces

iOS Location service 定位服務

取得所在位置是行動裝置的一大特色,在地化、導航、語言、文化都跟這服務脫離不了關係,在iOS中使用這服務需要先import一個framework如下
CoreLocation.framework

加入framework後還必須加入CoreLocation的Delegate,以及因為下面範例中使用者如果將定位服務關閉彈出Alert詢問使用者是否將開啟定位服務,需要加入的Delegate如下(在.h檔中)
CLLocationManagerDelegate, UIAlertViewDelegate

加入後應該會看到錯誤,因為CoreLocation這framework還沒被import,必須在.h檔上方先import這行
#import <CoreLocation/CoreLocation.h>


使用的方式如下(.m檔)
//初始化LocationService
-(void) openLocationService{
//location
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
[locationManager startUpdatingLocation];
}

//給地址、經緯度後直接開啟Google map導航
-(void)navivationToTheAddress:(NSString *)address myLatitude:(double)latitude myLongitude:(double)longitude{
NSString* urlString = [NSString stringWithFormat:@"http://maps.google.com/maps?f=d&source=s_d&saddr=%f,%f&daddr=%@", latitude, longitude, address];
NSString *escaped = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:escaped]];
}

//location Delegate
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
NSString *address = [self.myWebView stringByEvaluatingJavaScriptFromString:@"naviAddress"];
[self navivationToTheAddress:address myLatitude:manager.location.coordinate.latitude myLongitude:manager.location.coordinate.longitude];

[manager stopUpdatingLocation];
}

//錯誤發生時回報方式
-(void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
//NSLog(@"didFailWithError = %@", error);
NSString *errorString;
[manager stopUpdatingLocation];
NSLog(@"Error: %@",[error localizedDescription]);
switch([error code]) {
case kCLErrorDenied:
errorString = @"您已關閉定位服務無法順利導航,是否立即開啟服務?";
break;
case kCLErrorLocationUnknown:
errorString = @"無法順利取得您的位置";
break;
default:
errorString = @"無法順利取得您的位置";
break;
}

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Golf球場指南" message:errorString delegate:self cancelButtonTitle:@"收後啟用" otherButtonTitles:@"立即啟用", nil];
[alert show];
}

-(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
NSLog(@"clickedButtonAtIndex buttonIndex = %d", buttonIndex);
if(buttonIndex == 1){
//點選"立即開啟"後打開設定中的定位服務開啟畫面
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=LOCATION_SERVICES"]];
}
}


相關連結
iOS Developer Library
iOS Developer Library - CoreLocation Framework

iOS WebView Javascript send value to native objective-c

iOS因為每次送審必須花上幾天的審核時間,所以很多需要經常變動的頁面常會使用web的方式來進行設計,但iOS因為WebView沒開放Nitro,所以速度上比起原生的差了不少,然而部分還是可以透過些小技巧來加速,畢竟如Google+ ,Facebook等為了常變更timeline也都會採用此方式。

原生的SDK就有提供Native(Objective-C)直接來呼叫Javascript的function或變數,也可以一並取得function、變數的值,方法很簡單,就下面這一行:
[webView stringByEvaluatingJavaScriptFromString:@"YOUR_FUNCTION_NAME"]

這方式相當的好用,甚至可以直接將Javascript需要另外執行的function等東西直接用這方式塞入html中,可以方變得改變webview所呈現的內容,但如果光靠這種方式還是不太夠的,畢竟這是單向的由Native(Objective-C)來監看webview的狀態,使用個timer在背景掃描也會造成系統的負載,畢竟在Mobile上能省電就省電,一個太耗效能的App沒多久就會被使用者發現,然後就被刪除,所以必須有方法來由Javascript用Event的概念直接將值傳回Native(Objective-C),原理很簡單,就是使用URL scheme的方式來傳,詳細的問題點下面會再說明,先直接來看作法:


首先Html Javascript這邊的準備如下:
sendToNative('哈哈哈哈哈哈');

function sendToNative(msg){
document.location = 'YOUR_SCHEME://myText='+encodeURIComponent(msg);
};

乍看之下不就是把當前的URL改掉,按照正常的WebView不就會直接的轉跳到其他頁面去,但是在webView的Delegate是可以避免掉這問題,方法如下

//init webview
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
NSString *path = [[NSBundle mainBundle] pathForResource:@"YOUR_FILE_NAME" ofType:@"html" inDirectory:@"YOUR_FOLDER_NAME"];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]]];
[webView setDelegate:self];
[self.view addSubview:webView];;


//webView delegate
-(BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
//取得Scheme
NSString *scheme = [[[request URL] scheme] lowercaseString];

//如果scheme與自己定義的相同
if([scheme isEqualToString:@"YOUR_SCHEME"]) {
NSString *url = [NSString stringWithFormat:@"%@", [request URL]];
NSDictionary *myDic = [self urlToDictionaryWithURL:url scheme:scheme];

return NO;
}
return YES;
}

//將所有參數轉為Dictionary
-(NSMutableDictionary *) urlToDictionaryWithURL:(NSString *)url scheme:(NSString *)scheme{
NSArray *tempArray = [[url substringFromIndex:scheme.length+3] componentsSeparatedByString:@"&"] ;
NSMutableDictionary *myDic = [NSMutableDictionary new];

for (int i = 0; i < [tempArray count]; i++) { NSString *myString = [[tempArray objectAtIndex:i] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSArray *temp = [myString componentsSeparatedByString:@"="]; [myDic setValue:[[temp objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] forKey:[temp objectAtIndex:0]]; } return myDic; }

webView的Delegate 當return為YES時會允許webview的url作他該做的動作,NO時則不會進行,但還是可以順利取得當時的url來運用,上面範例中的"urlToDictionaryWithURL"為將URL參數轉為Dictionary方便使用,URL參數格式如下,也就是GET的格式,使用"&"來做區隔。
YOUR_SCHEME://a=11111&b=22222&c=33333


但使用URL來傳值也是會有些限制,在字數、部分符號上都會造成問題,根據"LinkedIn for iPad: The Native/Web Messaging Bridge and WebSockets"這篇文章所提還是會建議使用URL方式來呼叫Native(Objective-C),再用"stringByEvaluatingJavaScriptFromString"來取得Javascript參數,可以避免URL的限制,文章中也提到使用WebSocket來進行傳送,是效率最高,但相同也會有些其他問題,最好的方式應該還是混合使用。



相關連結
LinkedIn for iPad: The Native/Web Messaging Bridge and WebSockets
iOS Developer Library
iOS Developer Library - WebView

iOS UIWebView video auto play

iOS使用WebView來作為MediaPlayer相當的方便,不但可以播放Youtube,也可以播放local的影音檔案,但在iOS使用html5的autoplay 功能卻會無法正常使用必須在Native(objective-c)這端加上這段
[webView setMediaPlaybackRequiresUserAction:NO];

而html這邊設定自動播放方式如下:
<video src="YOURFILEPATH" autoplay ></video>

光是使用video tag來播放還是會遇上些播放狀態的問題,由於autoplay會直接進行全螢幕播放,在Native SDK可以取得進入全螢幕、離開全螢幕事件,只要放在Init webview之後,使用Notification Center方式來傳送訊號
//進入全螢幕
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youTubeStarted:) name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil];
//離開全螢幕
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youTubeFinished:) name:@"UIMoviePlayerControllerDidExitFullscreenNotification" object:nil];

而取得這些Notification的function如下
-(void)youTubeStarted:(NSNotification *)notification{
// your code here
NSLog(@"ENTER!!!");
}

-(void)youTubeFinished:(NSNotification *)notification{
// your code here
NSLog(@"EXIT!!!!!");
}


如果有需要使用javascript來控制影片的播放,如暫停、播放、播放完畢、目前播放秒數...等資訊也是相當簡單,以下為使用jQuery為例
//播放完畢
$("video").bind("ended", function() {
//end
});

//暫停
$('video').bind("pause",function(e){
//pause
});

//播放
$('video').bind("play",function(e){
//play
});

//目前播放時間(秒)
$('video').bind("timeupdate",function(e){
//timeupdate
});


其中播放完畢後預設為停在結束畫面並不會自動關閉播放模式,必須使用下面這行來進行離開全螢幕播放模式
$('video').get(0).webkitExitFullScreen();


如果要使用Javascript取得目前是否全螢幕瀏覽可使用下面方式判斷,回復為true為全螢幕,若為false為離開全螢幕
$('video').get(0).webkitDisplayingFullscreen;


相關連結
Opera Dev - Introduction to HTML5 video
iOS Developer Library
iOS Developer Library - WebView

iOS Webview scroll bounces

iOS使用Webview在上下滑到底的同時通常還可多滑出一段,也就是與UIScrollView一樣的反彈,來告知使用者已經滑到底,我覺得是個相當好的回饋,但如果自己已經有做好另外的回饋,也是可以將這個效果關閉,只需要在UIWebView加上下面這行就會關閉。

webView.scrollView.bounces = NO;

相關連結
iOS Developer Library
iOS Developer Library - WebView
iOS UIWebView scrollview unrecognized

iOS Web App hide button bar

iOS使用Safari瀏覽同時下方有一個按鈕列相當的佔版面,但如果你的服務預設就已經是全螢幕,這時候就會覺得這很討厭,使用方式如前一篇所寫"Add to Home Screen"方式,加到桌面,然後記得在head中加入下面這行

<meta name="apple-mobile-web-app-capable" content="yes" />

相關連結
iOS Mobile web app add to home screen icon

iOS Mobile web app add to home screen icon

iOS開發WebApp是常見的事,尤其iOS內建的Safari有個特殊功能是"Add to Home Screen",加入後的icon其實就跟常見的App沒兩樣,可以參考下圖說明:

1.打開Safari,會發現下方的按鈕列正中將有個Export的icon


2.按下去後會談出一堆按鈕,其中由上數下來第三個即為"Add to Home Screen"


3.點擊後會讓你輸入名稱,也就是之後的App名稱


4.加入完成,在畫面中就會多出個App icon,點下去後就是直接開啟這頁面的快速鍵。



當然到這裡有人會想問幹嘛不寫個App就好了,幹嘛這麼麻煩?Web App與Native app的優缺點在這就不作說明,隨便Google一下應該就會有很多大師給您開示,會想用這的一大原因是iOS的Safari有Nitro加速,比起Native的WebView快上很多很多,也是facebook一直被幹焦效能不好的原因,其實用Mobile Web版本的Facebook速度整個快超多的,就是因為Nitro,不過本篇重點是該如何設定icon,這邊就趕快進入主題。


你的html的head加入以下這一段再記得把icon放到路徑中,在加入時就會出現,但是會有光澤反射
<link rel="apple-touch-icon" sizes="57x57" href="ICONNAME.png">

拿掉光澤反射方法如下在"rel"改為apple-touch-icon-precomposed
<link rel="apple-touch-icon-precomposed" sizes="57x57" href="ICONNAME.png" />

sizes就是使用ios預設尺寸,記得依照不同Device作設置
iPhone = 57x57(pixels)
iPhone Retina = 114x114(pixels)
iPad = 72x72(pixels)
iPad Retina = 144x144(pixels)

只要都放對就會有漂亮的icon出現啦,再依照需求看是否需要反光的光澤。

Android Webview disable link click highlight

Android平常開啟時常會有討厭的預設的邊框,相當的顯眼,對於使用者來說這是個不錯的回饋,但對於已經有設定好另外的回饋來說這就變得有點多餘,只需要在css中加上以下一行即可消除預設的框框。

-webkit-tap-highlight-color: rgba(0, 0, 0, 0);


Android Webview hide scrollbar

scrollbar很重要,可以讓使用者清楚的知道現在的位置,但是在不該出現的時候跑出來就很討厭,下面這行可以把非必要時的scrollbar隱藏起來。

webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);


Android webView get javascript web value

用法很簡單,功能上也比起iOS所能提供得支援強大,廢話不多說往下看。

JS呼叫Android

JS
function androidResponse() {
window.YOURNAME.FUNCTIONNAME("I am being sent to Android.");
}

Android
final class IJavascriptHandler {
IJavascriptHandler() {}
public void FUNCTIONNAME(String text) {
// this is called from JS with passed value
Toast t = Toast.makeText(getApplicationContext(), text, 2000);
t.show();
}
}


WebView記得要去設定一下
webView.addJavascriptInterface(new IJavascriptHandler(), "YOURNAME");




Android呼叫JS

JS
funcrion androidResponse(string){
alert(string)
}

Android
webView.loadUrl("javascript:androidResponse();");

webView記得去把JS enable
webview.getSettings().setJavaScriptEnabled(true);
或用
WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);



update 2012-08-16
熊熊發現到Android Developer官方就有篇教學
http://developer.android.com/guide/webapps/webview.html

相關連結
Android Developer
Android Developer - WebView

Javascript back previous page/ next page

常用到,但是也常常忘,記錄一下

上一頁
history.go(-1)

上一頁在超連結中
<a href="javascript:history.go(-1)">Back</a>

下一頁
history.go(1)

下一頁在超連結中
<a href="javascript:history.go(1)">Forward</a>

Android WebView Enable Javascript

Android webView預設Javascript是不允許使用的,以下方法為開啟Javascript:
WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);


相關資訊
Android Developer

iOS class without ARC compiler

相信很多人在網路上看過很多很棒的framework, class,但礙於iOS5後很多專案使用ARC,加上很多後進的開發者一開始就使用ARC,以致想用些以前好用的framework會無法正常使用,以下的方法為使用ARC的專案,將部分檔案使用非ARC的方式來compiler

其實只需要加上這一行如下
-fno-objc-arc

放置的位置可參考下圖


相關連結
iOS Developer Library

iOS NSUserDefaults save and load

iOS app中常常會需要作些儲存設定,這邊先寫一種最簡單的NSUserDefaults,如果有稍微多一點資料需要儲存建議使用plist,真的有超大量要儲存建議使用coreData或sqlite。


儲存
NSString *saveSetting = @"save value";
[[NSUserDefaults standardUserDefaults] setObject:saveSetting forKey:@"YOURKEY"];


讀取
NSString *loadSetting = [[NSUserDefaults standardUserDefaults] stringForKey:@"YOURKEY"];



相關連結
iOS Developer Library
iOS Developer Library - NSUserDefault

jQueryMobile listView add/delete row

jQueryMobile是個很好用的mobile web framework,尤其在做prototype更是方便!ListView是Mobile上相當常用的呈現方式,當然必須常常來做些增減內容,以下說明增加的方式:

關鍵就是下面這行
$('#listView').append(output).listview('refresh');

output就直接把字串組合進去即可,例如使用ul、il的架構來說:
<li><h3>title</h3></li>


如果有需要刪除某一行可以使用下面這方式(感覺有點笨,不過目前還找不到更好的方式,有人有找到記得告訴我:))
$('#listView').empty().append(output).listview('refresh');


相關連結
jQuery Mobile - http://jquerymobile.com/
jQuery Mobile Demo - http://jquerymobile.com/demos/

TestFlight Client tutorial

TestFlight 是一套提供iOS測試使用相當方變得工具,不然過去因為憑證的關係都需要特別到現場接著電腦來build,此工具可以有效解決這問題並且同步發送給所有測試、開發人員,並且記錄每個版本的更新記錄等資訊。

Step1. 首先需要取的Deviece ID(UDID)交給開發者,取的Device ID(UDID)方式為打開iTunes後點選需要安裝的Device(如畫面中紅色框),再看畫面右邊紅框所顯示內容即為Device ID(UDID),如果顯示非Device ID(UDID)就在Device ID(UDID)上面滑鼠多點幾下即可。


Step2.將Device連結至此裝置中,可以使用以下QRCode快速掃描,或直接連結此頁面 https://testflightapp.com/

Step3.連到網頁後點選右上角的Login

Step4. 輸入帳號密碼後按下「GO」,若沒有帳號密碼請先申請

Step5. 按下「Register Device」

Step6. 接下來會自動跳到「設定」,並出現以下畫面,請按下「Install」

Step7. 按下「Install Now」

Step8. 輸入手機上的密碼

Step9. 等待系統處理一下

Step10. 等待過程中如果有開啟Notification Center會收到一封mail

Step11. 按下「Down」

Step12. 畫面會切回網頁,畫面中會顯示安裝完成

Step13. 切回Home頁面會出現這個新的icon

Step14. 點進去後就會出現這個畫面,點選需要安裝的App

Step15. 選擇想要的App後滑動到最下方就會出現「Install」

Step16. 接著就會跳出是否確認安裝App然後選擇「Install」

Step17. 點選Install 後會切回畫面中開始進行安裝,安裝前預設icon會是testflight的icon,安裝完後就會變成App的icon

相關連結
TestFlight - https://testflightapp.com/

iOS launch image full screen(no static bar)

只需要在"Info.plist"中的"Status bar is initially hidden"設定為YES,在啟動App同時就可以有沒有狀態列的啟動畫面

iOS 使用libxml2 framework

若有使用上此Framework需要在Project setting內的"Header Search Paths"加入以下這段,否則將會出現錯誤無法順利build

iphoneos/usr/include/libxml2/**

可參考一下圖片

iOS error message

當出現以下錯誤訊息同時有可能是因為build的檔案發現重複,檢查Project中的檔案是否有重複或其他錯誤後即可解決,詳細可參考下圖。

Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang failed with exit code 1