Just My Life & My Work

Posts tagged ‘teach’

[Xcode] 各尺寸畫面即時預覽

Apple今年推出的iPhone 6iPhone 6+螢幕大小為4.7吋5.5吋,這對開發者來說無疑是個新的考驗,因為先前我們只要在3.5吋和4吋做設計,如今一次多了兩款大小!以為一個專案要同時為四種大小做設計,事實上也是如此⋯⋯不過呢~Xcode也隨著iPhone進化,我們只要透過新的功能特性,即可簡化設計不同螢幕大小的程序!

寫程式同時也在設計(所以才叫做程式設計師),界面最好能夠直接在電腦螢幕上預覽,比起一維的程式碼,二維的畫面更加直覺!在新的專案中,我開始使用「自動佈局(Auto Layout)」技術,設定好後在四種螢幕大小顯示效果相當好,Xcode的各尺寸畫面即時預覽做得相當棒,且看一下我的一個畫面吧!

Xcode 3.5%22 Xcode 4%22 Xcode 4.7%22 Xcode 5.5%22

看得出來由上而下,分別是3.5吋、4吋、4.7吋、5.5吋嗎?我只是做切換預覽的動作,元件就依照我所設定來「自動佈局」!不太需要跑各種螢幕大小的實機模擬器囉~當然如果是用code寫自動佈局,還是要編譯執行跑結果啦:P~

參考:iPhone 4/5/6 手指觸及範圍[寫真] iPhone 5C[寫真] iPhone 6 與 iPhone 6+

[iOS] Navigation拋出View Controller次數

原生的Navigation只有實作拋出一次View Controller拋出所有View Controller,但是我想要拋出兩次(或是三次、四次等等)View Controller,該怎麼做呢?

查了Stack Over Flow才覺得非常簡單,其實每個人都想得到XD~

// in UINavigationController+popTwice.h

#import <UIKit/UIKit.h>
@interface UINavigationController (popTwice)

- (void) popTwoViewControllersAnimated:(BOOL)animated;

@end

// in UINavigationController+popTwice.m

#import "UINavigationController+popTwice.h"

@implementation UINavigationController (popTwice)

- (void) popTwoViewControllersAnimated:(BOOL)animated{
    [self popViewControllerAnimated:NO];
    [self popViewControllerAnimated:animated];
}
@end

我們可以多實作一個pop兩次View Controller的方法,將第一個pop設定無動畫,第二個pop設定有動畫,效果就如同我們期待的那樣!當然想要pop三次、四次以上也可以依此類推做到呢!

使用方法為:

#import “UINavigationController+popTwice.h"

[self.navigationController popTwoViewControllersAnimated:YES];

參考:How do I pop two views at once from a navigation controller?

[iOS] 影像旋轉 (Image Rotation)

原以為伺服器吐回來給我的會是「直向」的圖,那麼我就可以不去旋轉它,但事與願違,我還是得處理「橫向」的圖⋯⋯好在吐回來的圖像資料,除了有URL外,還有Orientation,那麼我就根據後者去判斷是否該旋轉90度

把以下的code貼到想要使用的.m檔內即可:)~

/**
 Theme: Image Rotation
 IDE: Xcode 6
 Language: Objective C
 Date: 103/10/02
 Author: HappyMan
 Blog: https://cg2010studio.wordpress.com/
 */
@interface UIImage (RotationMethods)
- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees;
@end

@implementation UIImage (RotationMethods)

static CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;};

- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees
{
    // calculate the size of the rotated view's containing box for our drawing space
    UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)];
    CGAffineTransform t = CGAffineTransformMakeRotation(DegreesToRadians(degrees));
    rotatedViewBox.transform = t;
    CGSize rotatedSize = rotatedViewBox.frame.size;
    
    // Create the bitmap context
    UIGraphicsBeginImageContextWithOptions(rotatedSize, NO, 2.0);
    CGContextRef bitmap = UIGraphicsGetCurrentContext();
    
    // Move the origin to the middle of the image so we will rotate and scale around the center.
    CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);
    
    // Rotate the image context
    CGContextRotateCTM(bitmap, DegreesToRadians(degrees));
    
    // Now, draw the rotated/scaled image into the context
    CGContextScaleCTM(bitmap, 1.0, -1.0);
    CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), [self CGImage]);
    
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}
@end

使用方式相當簡單,只要以UIImage的實體來呼叫此方法,然後它處理完會吐回UIImage。

UIImage *rotatedImage = [happyImage imageRotatedByDegrees:90.0];

如此就可以旋轉90度囉~當然你想轉180度、246度等等也是可以!

要注意的是,這裡不是UIImageView的做法喔!因為我想要直接轉存成檔案,所以是用UIImage來做到。

參考:StackOverFlow – How to rotate an image 90 degrees on iOS?

[iOS] 不合法的伺服器憑證問題

這是個很奇妙的議題,明明是用去年人家寫的案子呼叫API的程式碼,連第三方套件也一模一樣,所帶入的方法參數一模一樣,但是卻跑不出相同的結果⋯⋯

不知怎麼命名這篇文章,暫且以不合法的伺服器憑證問題為名吧!似乎跟http和https有關聯?還有什麼SSL?

然後就跑出這幾行訊息:

The certificate for this server is invalid. You might be connecting to a server that is pretending to be “xxx.ooo.com.tw” which could put your confidential information at risk.

查了網路前人的解法,原來只要在兩個delegate改成這樣⋯⋯

- (BOOL)connection:(NSURLConnection *)connection
canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

起初還想要請負責server端的人改安全性程度,不過既然去年的project都可以成功跑出結果,還是由我app端來處理問題吧!

寫了以上的code,還是不太明白意義⋯⋯知道的人請跟我說一下><;

參考:How to use NSURLConnection to connect with SSL for an untrusted cert?NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813) iOS

[iOS] iOS 8 定位服務規則

iOS 8已經在9/18釋出,所有使用者只要有符合的機型,都可以選擇是否要升級!身為開發者的我,當然要及時讓身旁的測試機更新作業系統,因為想來測試iOS 8 定位服務規則

現在詢問的文字可以客制化,如較小字體的就是我設定的呢!

現在詢問的文字可以客制化,如較小字體的就是我設定的呢!

話說,昨晚更新我親愛的The New iPad,花了將近一小時的時間完成升級,但畫面卻顯示要我連結iTunes,我也跟著指示做⋯⋯iTunes居然要我回復iPad,也就是裡頭App的資料都會消失殆盡⋯⋯「×!」當下真的很不爽,不過想想裡頭也沒什麼特別的資料,很多重要的資料都儲存在雲端,我只要登入各大小App,就能取回我大部份的資料囉~

(繼續閱讀…)

[iOS] 11項被退件的主要原因

最近Apple公佈11項被退件的主要原因,仔細看這些原因,發生在我身上的不禁令我會心一笑,看來大多數的App也有同樣的問題,所以我並不孤單XD~

crash debug

(繼續閱讀…)

[iOS] 模仿iPhone密碼鎖

由於專案需求,一個App同時要給管理者使用者使用,那我們有些功能就要設定權限,比如只有知道密碼的人才能使用該功能!

若有時間的話,我也想自己刻一個iPhone密碼鎖,不過礙於時間有限,找第三方套件直接套用就可以啦~

iphone locker

很幸運地找到一個方便使用的Library,拿Demo用的View Controller來改就完成了大半!設定密碼、修改密碼、刪除密碼三個功能一次滿足!再搭配上將密碼存到KeyChain中的Library,新的功能就在兩小時內完成~

此外,我們還能修改密碼鎖的外觀,比如背景顏色、按鈕(不按和按)顏色、文字顏色、文字內容等等。

這個模仿套件iPhone密碼鎖,用起來跟Apple內建的一模一樣!

話說,這個專案已經四個月沒有動了呢⋯⋯

參考:GitHub – ABPadLockScreen

[iOS] 將密碼儲存於KeyChain

為了安全地儲存使用者的密碼,建議將密碼儲存於KeyChain中。哈~要不是資深工程師提點,不然我真的還是會儲存在User Defaults中呢!

Keychain

KeyChain是iOS提供的一種安全保存私密資料的方式,整個系統的keychain被保存在隱秘的位置(/private/var/Keychains/keychain-2.db),其中保存的資料是經過加密的。

KeyChain優點:

  • 每個組( keychain-access-groups )之間資料存取隔離,沒有權限的app無法讀取他人資料,保證資料的安全
  • 全域性統一儲存,即使刪除app,keychain中的資料依然存在,下次重新安裝app還能存取
  • 存儲後的資料會加密
  • 同一個組的app可以共享keychain中的資料

KeyChain缺點:

  • 刪除app後不會清除keychain裡的資料,如果儲存密碼等敏感性資料有一定的風險。(越獄後keychain能被導出來)

(繼續閱讀…)

[iOS] 使用 SymbolicateCrash 分析崩潰紀錄

一直以來我都只看IDE中的crash log,沒想到這次要查看蘋果審查委員給的crash log檔案,這時候麻煩可大了,如果沒有弄清楚crash在哪,審委是不會讓我上架的⋯⋯看了它給的檔案,僅知道是IAP(應用內購買)程序有問題,儘管我怎麼測都沒有發生過!之後我陸續送了兩個版本,審委依然給我同樣的回覆,讓我不得不去找辦法轉譯crash log檔!

crash debug

很幸運地我總算學會SymbolicateCrash來分析崩潰紀錄啦~

(繼續閱讀…)

[iOS] 使用 CocoaPods 管理第三方套件

專案越做越多、越做越大,肯定會使用到第三方套件,因為我們不想重新打造「輪子」,如此能夠加快開發速度,更能專注在專案核心需求上!

cocoapods13

於是我們想要有效率地使用第三方套件,就可以考慮使用CocoaPods這個工具。

(繼續閱讀…)

標籤雲