[iOS] 應用內連結到App Store
先前知道可以實作連結到App Store,在App中觸發事件來開啟App Store,並顯示特定App畫面,這時候發現有另一種選擇,就是不用開啟App Store,就能顯示該App在App Store顯示的樣子。這麼做的好處是讓使用者體驗更好,因為我發現自己在使用App時,被導出App時都會很不耐煩XD~因為看完之後,還要按Home鍵來回到原來的App。
先前知道可以實作連結到App Store,在App中觸發事件來開啟App Store,並顯示特定App畫面,這時候發現有另一種選擇,就是不用開啟App Store,就能顯示該App在App Store顯示的樣子。這麼做的好處是讓使用者體驗更好,因為我發現自己在使用App時,被導出App時都會很不耐煩XD~因為看完之後,還要按Home鍵來回到原來的App。
有時候我們想要傳遞複雜的物件,比如影像(image)、特性字串(AttributedString)放到Dictionary中以Key/Value儲存,我們就能隨意帶著Dictionary到處趴趴走~這時候可以打包物件 (Archive Object)。
就如同我們所想的那樣,需要封裝(Archive)與解開(Unarchive)。
/**
Theme: Archive Object
IDE: Xcode 6
Language: Objective C
Date: 104/04/23
Author: HappyMan
Blog: https://cg2010studio.wordpress.com/
*/
- (void)viewDidLoad {
[super viewDidLoad];
#pragma mark - 這裡只是準備複雜特性的字串
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"Happy World ^_^"];
NSRange range = NSMakeRange(0,string.length);
UIFont *markerFeltWide = [UIFont fontWithName:@"Arial" size:20.0f];
//字型
[string addAttribute:NSFontAttributeName value:markerFeltWide range:range];
//前景顏色
[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:range];
//背景顏色
[string addAttribute:NSBackgroundColorAttributeName value:[UIColor lightGrayColor] range:range];
//底線
[string addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInt:1] range:range];
//字間距
[string addAttribute:NSKernAttributeName value:[NSNumber numberWithInt:5] range:range];
//陰影
NSShadow *shadowDic=[[NSShadow alloc] init];
[shadowDic setShadowBlurRadius:3.0]; //0 ~ ? 清晰~模糊
[shadowDic setShadowColor:[UIColor blackColor]];
[shadowDic setShadowOffset:CGSizeMake(3, 3)];
[string addAttribute:NSShadowAttributeName value:shadowDic range:range];
//描邊顏色
[string addAttribute:NSStrokeColorAttributeName value:[UIColor orangeColor] range:range];
//描邊線條粗細 正數描邊 負數描邊加填滿
[string addAttribute:NSStrokeWidthAttributeName value:[NSNumber numberWithInt:-3.0] range:range];
#pragma mark - 封裝
NSMutableDictionary *happyInfo = [NSMutableDictionary new];
UIImage *image = [UIImage imageNamed:@"HappyMan.jpg"];
NSData *imageData1 = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0f)];
happyInfo[@"imageKey"] = [NSKeyedArchiver archivedDataWithRootObject: imageData1];
NSAttributedString *myString = string;
happyInfo[@"stringKey"] = [NSKeyedArchiver archivedDataWithRootObject: myString];
#pragma mark - 解開
NSData *archiveImageData = happyInfo[@"imageKey"];
NSData *imageData = [NSKeyedUnarchiver unarchiveObjectWithData: archiveImageData];
UIImage *happyImage = [UIImage imageWithData:imageData];
NSData *stringData = happyInfo[@"stringKey"];
NSAttributedString *happyString = [NSKeyedUnarchiver unarchiveObjectWithData: stringData];
[self.happyImageView setImage:happyImage];
[self.happyTextView setAttributedText:happyString];
}
這裡需要注意的是,影像必須要先轉成Data再來封裝,而一般字串類資料可以直接封裝,這還有道理XD~
範例中的特性字串含有者些訊息:
Happy World ^_^{
NSBackgroundColor = “UIDeviceWhiteColorSpace 0.666667 1″;
NSColor = “UIDeviceRGBColorSpace 0 1 0 1″;
NSFont = " font-family: \"Arial\"; font-weight: normal; font-style: normal; font-size: 20.00pt";
NSKern = 5;
NSShadow = “NSShadow {3, 3} blur = 3 color = {UIDeviceWhiteColorSpace 0 1}";
NSStrokeColor = “UIDeviceRGBColorSpace 1 0.5 0 1″;
NSStrokeWidth = “-3″;
NSUnderline = 1;
}
如此就能在有限制情況下傳遞資料囉~這可以用在Watch App和iOS App上的溝通呢!
不知怎麼稱呼,就先叫做動態框架 (Dynamic Frame)吧!描述一下我想達到的效果,簡單來說就是根據文字多寡,來讓顯示的界面可以跟著調整,最後所想要呈現的字不會被介面擋到。
因為很多時候是不知道字數的多寡,通常是在運行的時候才會知道,特別是從網路上取得的資料,此時我們會想要做這件事。
實在不知道怎麼翻TextField Inset,我會把它描述為「留邊」。因為TextField沒有ContentInset這個property,所以要另找技巧來實現。
可以見到舊密碼和密碼確認的Placeholder緊靠著左側,設定過後如新密碼,向右邊位移一段距離。
在瞭解Watch App目標架構後,我們想進一步瞭解:
包含兩部分:Watch app和WatchKit extension。Watch app在Watch上運行,只包含Storyboard和Resource;WatchKit extension在iPhone上運行,與對應的iPhone App在一起。當使用者點擊Watch App後,與Watch配對的iPhone會啟動WatchKit extension,然後與Watch建立連接,於是兩者可以溝通(如獲取資料等)。
還記得把新版本垃圾管家送審,當天馬上就有奇妙的現象,因為我埋下Flurry追蹤使用者行為,查看Flurry後台,發現有好幾台裝置安裝且執行,不過僅止於「啟動」,就沒有其它行為。猜想這些裝置就是Apple審委所用的裝置,而且都分布於北美,後台還能顯示這六台是不同型號的iPhone與iPad。
可以觀察到,Apple下載後開啟垃圾管家App,就再也沒有動靜:P~
看了設備清單,Apple可真是一點都不馬乎,任何現行的裝置都要拿來審核我們的App呢!
有時候我們需要從網頁中獲得回傳資料,比如使用WebView來輸入帳密,成功登入後會回傳token,之後我們需要此token來呼叫相關API,以取得此帳密的相關資訊。
這麼做是想提高安全性,所輸入的帳密不想給App知曉,透過Web輸入後回傳字面上沒啥意義的token給App,而這個token是有效期限,一段時間過後便需要再取得一次,下次取得的token跟上次不一樣,以保護真實帳密資訊。
開發Watch App時,所要注意的角色有三個,因為Watch App無法獨自運行,需要透過iOS App來啟動與操作它,而彼此溝通的橋樑則是WatchKit Extension。我們可以很清楚地從下圖得知三個角色的關係:
使用Xcode 6.2開發Watch App時,原本的專案就是iOS App,操作順序:New->Target->Apple Watch->WatchKit App,便會同時產生WatchKit App與WatchKit Extension到專案中。WatchKit App僅含Storyboards與Resources,WatchKit Extension則含WatchKit Code與Resource。
據知未來Watch App可獨立運行,就讓我們拭目以待吧!
參考:Apple Watch开发初探。
隨著時間發展,iOS App已經變得更加複雜且龐大,使用使用 CocoaPods 管理第三方套件已成為必要之事,然而這樣還是不夠,因為我們一個專案 (Project)中不再只是一個目標 (Target),這些目標都需要同一個函式庫 (Library),但是可可豆莢 (Cocoapods)預設只為最初的那個目標,我們該怎麼下指令才能讓所有目標都能引用同一函式庫呢?
原來只要多加link_with關鍵字,後頭接上目標的名稱即可!
/** Theme: Podfile with Multiple Targets IDE: Xcode 6 Language: Objective C Date: 104/04/01 Author: HappyMan Blog: https://cg2010studio.wordpress.com/ */ source 'https://github.com/CocoaPods/Specs.git' platform :ios, '6.0' link_with 'HappyCan', 'HappyCan Today', 'HappyCan WatchKit Extension' pod 'AFNetworking' pod 'ZBarSDK' pod 'Toast', '~> 2.4' pod 'LineKit', '~> 1.4.1' pod 'MBProgressHUD' pod 'OpenSSL-Universal', '1.0.1.k’
以上範例表示我專案中有三個目標(HappyCan、HappyCan Today、HappyCan WatchKit Extension),都需要引用相同的函式庫。
曾經以為TextField和TextView裡的字只能統一屬性來顯示,從iOS 6開始它們都有了attributedText這個屬性,之後可以在字體間顯示不同的效果。
@property(nonatomic,copy) NSAttributedString *attributedText NS_AVAILABLE_IOS(6_0); // default is nil
現在我們想更進一步知道,如何將HTML的CSS轉為NSAttributedString,之後看到網頁排版漂亮,就可直接拿來套用!
這是html呈現的字樣~
此外,可參考先前介紹的文章:多重文字屬性 (Multiple Text Attribute)、LABEL裡的行距、LABEL裡的字距。
HappyMan・迴響