2014年9月30日 星期二

iOS 8 Location 定位 失效

一,先在Info.plist加入這二個Key(value是string,你可以不加,也可以加上Location is required to find out where you are之類的文字
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription

二,在啟用location update之前加入這段,來要求權限
// Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
        if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
//要求權限:前景背景都允許使用定位
            [_locationManager requestAlwaysAuthorization];
        }
        if ([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
//要求權限:只有在前景允許使用定位
            [_locationManager requestWhenInUseAuthorization];

        }

取得iAP的receipt

//取得iAPreceipt
+(NSData *) getReceiptData:(SKPaymentTransaction *)transaction{
    NSData *receiptData = nil;
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
        receiptData = transaction.transactionReceipt;
    }
    else {
        NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[[NSBundle mainBundle] appStoreReceiptURL]];
        NSError *error = nil;
        receiptData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&error];
    }
    return receiptData;

}

2014年9月29日 星期一

UUID保存在KeyChain裡面

用這個方式將第一次取得的Vender UUID存到KeyChain內,
之後換新App就可以取得之前UUID來充當UDID使用。

https://github.com/ObjColumnist/MCSMKeychainItem

單獨reload一個section

[tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationNone];

2014年9月25日 星期四

navigationController在push新view前,把tabBar隱藏起來

有時候我們會想要用navigation bar來push一個新的view,但又不想要下面看到原本的tab bar,但限於navigation controller在 tabbar controller的階層下。又不想用present modal view的方式破壞原本的結構。

這時候我們可以在push前把tab bar隱藏起來,在pop的時候記得要解開隱藏。
程式碼:
        AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        appDelegate.rootTabBarController.tabBar.hidden = YES;

        [self.navViewController pushViewController:main animated:YES];

2014年9月24日 星期三

繼承自managed object的class不能用object method存取

因為xcode中自動產生的managed object,很容易因為修改db,而重新產生,
所以習慣上,我會再寫一個managed object去繼承自動生成的來使用,
然而今天發現用自己寫的class創建object仍然會被視為自動產生的那個class,造成object method無法被呼叫而發出例外。

解決方式有兩種:
一種是把object method寫進自動生成的managed object,但降子就背離了原來用繼承的原意,所以我採用第二種。
第二種是把object method全部寫成class method。

2014年9月22日 星期一

[轉錄]plist解說

本文轉錄自
http://iphone4.tw/forums/showthread.php?t=195508
kes729的文章

1. Application does not run in background(鍵名:UIApplicationExistsOnSuspend)自從iOS4.0之後,當你在應用程式執行的時候按下Home鍵,應用程式並不會中斷目前的執行,而是躲到背景去了。因此希望使用者在按下Home鍵之後就要中斷目前程式的執行,請勾選這個選項。

2. Application requires iPhone environment(鍵名:LSRequiresIPhoneOS)iOS的家族繫***ㄧ誒主要包含了iPhoneiPadiPod Touch這三種設備。因此如果你的應用程式只能在iPhone環境下使用的話,請勾選這選項。

3. Application supports iTunes file sharing(鍵名:UIFileSharingEnabled)iTunes9.1之後的版本增加了一個檔案共享的功能,只要打開info.plist裡面的這個選項,然後把你要共享的檔案儲存在Documents目錄裡面,就可以在iTunes裡面的應用程式標籤頁看到這份文件。

4. Application uses Wi-Fi(鍵名:UIRequiresPersistentWiFi)如果你的應用程式需要使用的WiFi來連線的話,那麼你可以開啓這個功能。當使用者在執行這個應用程式的時候並未開啓WiFi,那麼在畫面上會自動跳出對話框要求開啓WiFi

5. Bundle creator OS Type code (鍵名:CFBundleSignature)CFBundleSignature是一個四個字母長度的字串,用以表示開發者對於應用程式的標識。例如:在一個文字編輯的應用程式,你可以標識為”ttext”

6. Bundle display name(鍵名:CFBundleDisplayName)應用程式本土化的顯示名稱,預設值為${PRODUCT_NAME}。這個變數可以在雙敲擊Targets後出現的專案設定畫面中修改,找到”Product Name”後修改為你的產品名稱就可以了,編譯後的.app也會以這個名稱命名。

7. Bundle identifier(鍵名:CFBundleIdentifier)用來標示應用程式的唯一ID,通常是以反向的DNS方式命名的,例如:com.myCompany.myApp,這個名稱應該在iTunes Connect裡面新增的應用程式ID一致。

8. Bundle name(鍵名:CFBundleName)應用程式的短名稱,通常就是你的應用程式名稱。

9. Bundle OS Type code(鍵名:CFBundlePackageType)用來標識整個封包的(bundle)的類型。在Mac裡面,一個封包可能是一個檔案或目錄,其目的在於將軟體使用到的資源包在一起。例如應用程式應標識為APPL

10. Bundle version(鍵名:CFBundleVersion)用以標識編譯版本(Bundle number),你可以使用任何字串格式來表示這個版本。例如使用一個數字來表示編譯次數。

11. Bundle version string,short (鍵名:CFBundleShortVersionString)應用程式的版本,通常是以三個數字來表示版本號,例如:1.0.1

12. Executable architectures(鍵名:LSExcutableArchitectures)為一個陣列形態的設定值。用以設*****绦袚蹩梢赃\行的架構環境,例如:i386ppcppc64x86_64

13. Executable file(鍵名:CFBundleExecutable)執行檔的名稱。

14. Fonts provide by application(鍵名:UIAppFonts)為一個陣列形態的設定值。用來指定應用程式所使用的外部字型。你可以在應用程式內使用自己的字型檔,只要將字型檔案加入到專案內,在設定值指定字型檔名稱就可以在程式碼裡面使用到這些字型了。

15. Get Info string (鍵名:CFBundleGetInfoString)用於MacFinder上的應用程式的描述。

16. Icon already includes gloss effects(鍵名:UIPrerenderedIcon)指定應用程式的圖示是否加上光暈效果,如果不希望加上光暈效果,那麼勾選此選項。

17. Icon file(鍵名:CFBundleIconFile)用來設定應用程式的圖示檔,如果沒有指定的話,則使用預設值Default.png,依照Apple的規定,這個圖是必須是57x57的圖形檔。

18. Icon files(鍵名:CFBundleIconFiles)由於iPhoneiPad的開發工具以及SDK都是相同的,因此同一個應用程式也可以同時在兩個設備上使用,只不過兩著的圖是不太一樣。這個鍵值是一個陣列類型的設定值,用來指定iPhoneiPad的應用程式圖示,你只要給兩個圖示檔名,其中iPhone的圖示為57x57 pixeliPad則為72x72 pixel,系統會自動依照圖示大小判斷該圖示是使用在哪種設備上。

19. Info dictionary version(鍵名:CFBundleInfoDictionaryVersion)info.plist格式的版本。一般來說,我們不會變動這個數值。

20. Initial interface orientateon(鍵名:UIInterfaceOrientation)指定應用程式初始時的方向。

21. Laumch image(鍵名:UILaunchImageFile)用以指定應用程式啓動時的圖檔。

22. Localization native development region(鍵名:CFBundleDevelopmentRegion)應用程式原始的語系版本。

23. Localizations(鍵名:CFBundleLocalizations)用以指定應用程式所支援的語系。

24. Localized resources can be mixed(鍵名:CFBundleAllowedMimxedLocalizations)是否允許應用程式可以取得框架庫內的語系檔。

25. Main nib file base name(鍵名:NSMainNibFile)主要的Nib檔案名稱,預設值為MainWindow

26. Renders with edge antialisasing(鍵名:UIViewEdgeAntialiasing)設定core animation的圖層是否開啓抗鋸齒功能。

27. Renders with group opacity(鍵名:UIViewGroupOpacity)設定core animation的圖層使否繼承上一層透明度。

28. Required background modes(鍵名:UIBackgroundModes)設定當應用程式進入背景執行後,哪些動作要繼續在背景執行。這個鍵值是一個陣列類型的設定,可設定動作包括:audiolocateonvoip

29. Required device capabilities(鍵名:UIRequiredDeviceCapabilities)設定應用程式需要使用到的硬體,如此可以確定應用程式在該設備上執行時不會發生錯誤。

30. Status bar is initially hidden(鍵名:UIStatusBarHidden)設定狀態列是否一開始隱藏。

31. Status bar style(UIStatusBarStyle)設定狀態列的顯示類型。

32. Supported external accessory protocols(鍵名:UISupportedExternalAccessoryProtocols)指定應用程式與外界硬體配件間支援的通訊協定,這個鍵值是一個陣列設定,可以指定多個通訊協定。

33. Supported interface orientateons(鍵名:UISupportedInterfaceOrientations)設定應用程式所支援的顯示模式(肖像模式或風景模式),這個鍵值是一個陣列,可以支援多個不同的顯示模式。

34. Supported interface orientateons(鍵名:UIUpgradeOtherBundleIdentifier)設定應用程式所支援的顯示模式(肖像或是風景模式),這個鍵值可以支援多個不同的顯示模式。