.m檔是給Objective-C編譯用
.mm檔是給C/C++編譯用
2013年11月2日 星期六
2013年10月31日 星期四
[沙盒模式]iOS In-App Purchase串接注意事項
文章攢寫時間︰2013/11/01 13:54
文章修改次數︰5
IOS In-App Purchase在沙盒模式下串接時,
有一些需要注意的環節,
底下是我做錯的許多地方,
做個筆記。
這是因為產品的Bundle ID與iTunes Connect上App的Bundle ID不一致造成,這裡需要特別注意一下。
Tax Info欄位即使不是美國公民也要填寫。
文章修改次數︰5
IOS In-App Purchase在沙盒模式下串接時,
有一些需要注意的環節,
底下是我做錯的許多地方,
做個筆記。
1. 不要在模擬器上執行In-App Purchase沙盒測試,請使用實機。
2. 登岀你的iTunes Connect
如果不登岀的話,在執行In-App Purchase流程時,可能會取到機器上預設的帳號而造成iTunes Connect無法辨識這組帳號。請參見官方文章來源。3. 使用Test Account登入In-App Purchase沙盒
在運行In-App Purchase流程時,請使用Test Account登入,注意這個Test Account不能被其它Apple帳號連結使用過,必須是全新的。4. 不要在實機裡iTunes & App Store的登入欄位填入Test Account。
雖然不知道為什麼,既然官方都這說了,就乖乖遵守囉!5. 不要在In-App Purchase正式版上線時登入使用Test Account,這麼做會導致Test Account永久失效。
6. In-App Purchase沙盒模式下不需要先上傳App的Binary也能使用。
7. In-App Purchase產品在Ready To Submit或Wating for screenshot就可以使用了。
8. 產品的Bundle ID需與iTunes Connect上的App Bundle ID一致。
在串接時曾經遇過SKProductsRequestDelegate這個Protocol裡didReceiveResponse這個callback method裡的response.products一直收到empty,取不到在iTunes Connect註冊的In-App Purchase資料。這是因為產品的Bundle ID與iTunes Connect上App的Bundle ID不一致造成,這裡需要特別注意一下。
9. In-App Purchase只岀現Free Subscription。
這是因為Contracts, Tax, and Banking裡資料沒有填寫齊全所致,請填寫完成。Tax Info欄位即使不是美國公民也要填寫。
相關文章
2013年9月28日 星期六
2013年8月10日 星期六
2013年7月6日 星期六
Block的使用3-typedef的使用
文章攢寫時間︰2013/07/07 15:02
前兩篇我們提到了Block的使用,
這篇來談談要怎麼簡易的初始化一個Block。
typedef後面的東西,
就是原本在宣告Block的等於的左半部。
使用typeDef後︰
這樣子用起來是不是輕鬆多了?
2. Block的使用2-注意事項
前兩篇我們提到了Block的使用,
這篇來談談要怎麼簡易的初始化一個Block。
tyepdef float (^MyBlockType)(float,float);
typedef後面的東西,
就是原本在宣告Block的等於的左半部。
使用typeDef後︰
MyBlockType myFirstBlock = // ... ;
這樣子用起來是不是輕鬆多了?
相關文章︰
1. Block的使用12. Block的使用2-注意事項
Block的使用2-注意事項
文章攢寫時間︰2013/07/07 14:33
這裡提到一點蠻特別、而且也可能在日後造成程式BUG的地方
如果以程式的先打先執行概念來看,
因為myBlock在outsideValue=456之後才呼叫,
NSLog應該會印岀outsideValue為456,
但是,卻印岀值為123。
以下是執行的結果
Block只會使用變數第1次宣告時的值。
如果希望印出來是456,
那麼outSideValue在宣告時,
前面要加上__block關鍵字。
以下是修改後的Code︰
2. Block的使用3-typedef的使用
Block使用注意事項
前一面提到Block的使用,這裡提到一點蠻特別、而且也可能在日後造成程式BUG的地方
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. ViewController *myView = [ [ViewController alloc] init]; myView.delegate = self; [myView willCallDelegatePrint]; [myView willCallDelegateLog:@"Hello myDelegate"]; NSLog(@"sub viewDidLoad"); int outsideValue = 123; int (^myBlock)(int, NSString*) = ^(int num, NSString* str) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"I am Title" message:str delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Btn1" , nil]; [alert show]; //Block對外面的值只能是ReadOnly return outsideValue; }; outsideValue = 456; NSLog(@"get int: %d",myBlock(567,@"白七")); }
如果以程式的先打先執行概念來看,
因為myBlock在outsideValue=456之後才呼叫,
NSLog應該會印岀outsideValue為456,
但是,卻印岀值為123。
以下是執行的結果
Block只會使用變數第1次宣告時的值。
如果希望印出來是456,
那麼outSideValue在宣告時,
前面要加上__block關鍵字。
以下是修改後的Code︰
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. ViewController *myView = [ [ViewController alloc] init]; myView.delegate = self; [myView willCallDelegatePrint]; [myView willCallDelegateLog:@"Hello myDelegate"]; NSLog(@"sub viewDidLoad"); __block int outsideValue = 123; int (^myBlock)(int, NSString*) = ^(int num, NSString* str) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"I am Title" message:str delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Btn1" , nil]; [alert show]; //Block對外面的值只能是ReadOnly return outsideValue; }; outsideValue = 456; NSLog(@"get int: %d",myBlock(567,@"白七")); }結果如下
相關文章︰
1. Block的使用12. Block的使用3-typedef的使用
Block的使用1
文章攢寫時間︰20130707 13:43
底下在viewDidLoad這個函式中,
宣告了myBlock這個Block並在裡面呼叫了UIAlertView。
2. Block的使用3-typedef的使用
Block
- 用起來像普通的Method
- 可以在Method裡又寫一段Code,並存取在Block之外的所有變數(但是只能Read-Only)。
- 用起來的概念像callback
底下在viewDidLoad這個函式中,
宣告了myBlock這個Block並在裡面呼叫了UIAlertView。
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. ViewController *myView = [ [ViewController alloc] init]; myView.delegate = self; [myView willCallDelegatePrint]; [myView willCallDelegateLog:@"Hello myDelegate"]; NSLog(@"sub viewDidLoad"); int outsideValue = 123; int (^myBlock)(int, NSString*) = ^(int num, NSString* str) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"I am Title" message:str delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Btn1" , nil]; [alert show]; //Block對外面的值只能是ReadOnly return num+outsideValue; }; NSLog(@"get added int: %d",myBlock(567,@"白七")); }結果如下
相關文章︰
1. Block的使用2-注意事項2. Block的使用3-typedef的使用
Delegation(委派)的使用
文章攢寫時間︰20130707 10:26
Delegation是一種design pattern,方便在各個物件之間傳遞參數以及互相支援。
例如UITableView如何知道目前這張Table需要多少Session或是多少個Cell?
使用protocal關鍵字
Delegation是一種design pattern,方便在各個物件之間傳遞參數以及互相支援。
例如UITableView如何知道目前這張Table需要多少Session或是多少個Cell?
使用protocal關鍵字
@protocol <protocol name>//在A.h檔中宣告 @required //在A.h檔中宣告此函式"一定"要被實作 @optional //在A.h檔中宣告此函式"不一定"要被實作
Category類目的使用
文章攢寫時間︰20130707 09:30
類目(Category)
類目是設計給一群設計師共同編輯使用的特殊Object-C用法。
宣告一個@interface,
但是不要繼承NSObject,
並在後面宣告一個類目的名稱。
假設這是原先最基本實作NSObject的方法︰
類目(Category)
類目是設計給一群設計師共同編輯使用的特殊Object-C用法。
宣告一個@interface,
但是不要繼承NSObject,
並在後面宣告一個類目的名稱。
假設這是原先最基本實作NSObject的方法︰
@interface Fraction : NSObject現在我們會改成這樣︰
@interface Fraction (Mathxxx)
訂閱:
文章
(
Atom
)