2014年9月4日 星期四

[TestFlight][Xcode]在沒有企業版帳號的情況下如何簡單的將軟體發布給他人。

 

其實這不算甚麼新鮮事,有人的地方就有恩怨,有恩怨的地方就會有江湖,
有寫出來的APP就會有要測試的人。

如果是在本地端,對,我就是說那種可以樂呵呵得走到你的開發機旁邊,用傳輸線接上你的電腦的那個叫作在本地端的人。那自然是沒甚麼問題,頂多在Xcode內的Window->Organizer
螢幕截圖 2014-09-04 23.22.07

的Device分頁下,按個Add to MemberCenter,選選有付錢的開發者帳號。
然後就可以在手機上恣意玩弄你開發的程式了。

但是,人生總是會有一個BUT!

如果這傢伙的位置,正好不是在短時間物理上可以走到的地方的地點的話要怎麼辦呢?

當然,如果你正好有一個企業版權限和https的空間當然是沒問題。

如果沒有呢,這邊有一個稍微簡化過的方式可以參考看看,也就是本文的主角,TestFlight

由於自己也是第一次用,所以進階的功能先不提。(看上去很強大啊,怪不得會被Apple買下來。 XD)
(手邊沒有圖,下次再補,這次先以文字描述。  XD)
首先呢,我們假設你的APP開發已經建立好了APP ID
(題外話,在Apple Developer的網站建議你用Safari開,如果你一直在等loading等不到結束,那換Safari通常可以解決你的問題。)
然後呢,把遠方那個需要測試的機器的UDID加到你的Device裡面。

1. 請在Provisioning Profiles建立一個你這個APP要用的Provision,這邊就把它想像成在還沒發布上去時,你這個APP可以允許在哪些機器上跑的設定檔,過程中會要你勾選Device,請把要測試的那個也選上。設定完之後把這個Provision download下來。

2. 打開Xcode 點選要發布的Project,點選Build Settings,選自己的帳號和剛剛建立的Provision (一般正常來說現在再有網路的狀況可以直接用選的,或者直接點兩下剛剛下載的Provision也可以。)


3. 插上隨便一台實機,把環境指向他,選Product->Archive(不插上機器會呈現反白),然後就會開始builde程式,稍待片刻後,會跳到Organizer - Archive 的頁面,選好你想做成.ipa的版本,按下Distribute..。

4. 選擇中間的save for Enterprise or Ad Hoc Deployment –>Next->選擇自己的開發者帳號(剛剛建立Provision的那個)->Next->儲存.ipa檔。

5. 登入TestFligtht,按左上角的+ 選擇Upload a build,然後把剛剛的.ipa放上去。

6. 上傳完成後。點下Permissions ,在
Anonymous Devices In The Provisioning Profile 底下勾選要被測試的機器的UDID,按下Update

7. 然後在Share This Build下會有一個Link,把這個 Link傳給要裝這個App的機器。

8. 用要測試的機器打開這個Link,會被要求安裝TestFlight的憑證,安裝完成後就可以看到INSTALL的按鈕了。

9. 安裝完成,測試看看好不容易裝起來的APP吧。

話說這個一點都不簡單啊,沒特地抓圖也花了半小時寫。 XD

2014年7月24日 星期四

[Objective-C]將自製物件轉成 NSData 與從NSData轉回原物件

由於最近工作需求有用到NSUserDefaults來做資料的儲存,
本來以為把平常用的NSMutableArray轉成NSArray就可以騙過她塞進去,想不到出現錯誤訊息。
說我自製的物件是non-property的,所以不給存。 囧rz

survey了一些資料後發現,如果想存的話,通常是建議先轉成NSData,
當然(NSData *)這招我try過了,當然不行。 XD

從結果來看是因為,要轉成NSData 轉的過程要讓xcode知道要用甚麼方式轉,反之亦然,從NSData轉回來時要隻到對應的型態是什麼才有辦法encode回來。

簡單來說,必須要在自定義的物件設定decode與encode的方式。
實作:
-(void) encodeWithCoder: (NSCoder *)coder{

  //self.property 換成你自定義的property的名字,例如Name,UserID
  [coder encodeObject: self.property forKey: @”property”];
  //其它的property以此類推
}
可以讓妳的物件成功傳成NSData

如果還要轉回來的話(有人不轉回來的嗎。XD)
就必須實作
- (id)initWithCoder: (NSCoder *)decoder{
  if(self = [super init]){
    self.property = [decoder decodeObjectForKey: @“property”];
    //以此類推。
  }
}

看到沒有中文的資料,就順便做個筆記,有問題也歡迎大家多多指教。 xD

2014年7月1日 星期二

[Swift]Objective-C 和swift混合模式(mix)

swift問世後,想要改寫swift但是又礙於很多慣用的工具和class都是Objective-C版的,
重寫又太麻煩,幸好有一種叫混合模式的東西。

可以讓你沿用原本寫的工具,然後透過bridge自動變成swift的格式使用。
(在這裡不討論怎麼轉的,提供怎麼實作的簡單教學。)


1. 首先,開一個swift專案 (或者沿用舊的專案也無妨)
image

2. 把你要使用的Objective-C檔案的.h 和.m檔拉到專案中,除了會問你要不要複製到專案中外,還會多跳一個視窗。
簡單來說問你要不要建一個bridge header,選YES
_W__芸_ 2014-07-01 15.38.56

3. 然後可以注意到在 supporting files裡面多了一個檔案
螢幕截圖 2014-07-01 16.14.49

4. 修改bridging-Header.h檔案內容,import 要用的.h檔
螢幕截圖 2014-07-01 16.17.17

5. 然後就可以在swift裡面使用這個class了
螢幕截圖 2014-07-01 16.19.25

缺點:
針對DataSource/Delegate的部分,@protocol的func的自動補完好像有點怪怪的,有的時候可以靠按ESC跳出來,有的時候則否。
原因還在研究中。

不過一些功能的,就算是objective-c的一樣可以使用,可以節省不少開發時間。

2014年6月25日 星期三

[Xcode 6 beta 2]swift 的智慧輸入無法正常出現的問題解決方式


終於有空回頭練習swift,之前一直很困擾我不會自動補code的小問題(對不起我實在不想練習打字,而且一直回頭看method name好麻煩 XD),後來survey了一下。
其實滿好解決的,
產生的程式碼不是都會有開頭的註解。


//
// ViewController.swift
// CitizenMission
//
// Created by Thor Lin on 2014/6/24.
// Copyright (c) 2014年 Thor Lin. All rights reserved.
//


把"年"刪掉就可以解決這個問題了...(眼神死)
當然,如果你註解中有用到中文,從那個註解之後也沒辦法用智慧自動補齊了。
可惜我沒寫過plugin,不然應該可以解決吧。 XD

#xcode #swift #智慧輸入補code

2014年6月23日 星期一

[Xcode]府城運動地圖(OpenSource)


https://github.com/coolthor/TainanSport

2014台南黑客松作品。(桂圓貓)

用時約 20 hrs,因為沒體力其實後面都在睡覺和放空。

雖然只是拙作,但是我想也許在一些componemt的元件應用上算是可參考的範例,歡迎大家批評指教。 XD

這個範例主要應用是在Mapkit/UISearchbar/NSString的Parse的部份比較多。UITabelView/UICollectionView的應用也在裡面,如果是新手的話,也許可以參考這些部分。

這兩天很好玩,但是現在正在和偷懶的心情對抗中。
(心:我這兩天這麼努力應該可以休息一下吧。
腦:不行,你還有帳單和swift要處理。 =_=)

以下為作品DEMO



‪#‎hack4Tainan‬‪#‎台南黑客松‬

2014年6月4日 星期三

[osx] osx 10.10 降級回 10.9.3的方式



玩了一兩天OS X 10.10,由於還有很多bug,而且嚴重影響到工作效率。(例如safari 網址列輸入會當機,Xcode用ctrl拉IBOUTLet會當機這種的。) XD

只好再把它downgrade,老實說有點麻煩,
因為沒有作備份,加上也沒有作OSX 10.9的安裝隨身碟。
只好老實的一步一步來。


網路環境是必備的。
1. 開機時按Command+R 選重新安裝OSX (會依照你買來的時候預載的系統,像我這台小白就是OSX 10.8 Lion)
2. 重新安裝,10.8,10.9,會花點時間就是了(因為要從網路上抓安裝系統的檔案。
如果遇到安裝好後,密碼怎麼打都不對,一樣開機時按Command+R ,然後選終端機。
輸入resetpassword,會跳出一個視窗讓你重新修改密碼。

#OSX #Downgrade

2014年5月12日 星期一

[Xcode]比較直觀的編輯超過螢幕長度的UIView的方法

在手繪設計階段的時候,一直覺得有scroll 上下拉動在手機裡面是極其正常的事情,
實際上撰寫的時候,發現的確可以拉一個很長的View 搭配scrollview做的出來。
但是就目前所學的部分看來,要維護這個View是有點棘手的事情。
因為在storyboard的部份,超出controller的View的部分是不會顯示的。
而且上下拉的時候會變動到View的大小,放在裡面的元件也是會被影響到。 事後的維護想到就讓我頭皮發麻。 囧rz 
好吧,那就用程式碼來控制位置吧,技術性上不是問題, 但是缺點實在有點不太直觀,畢竟要run後才能確認位置是不是和想的一樣,
也有點浪費時間。 運氣不錯的是,前天正好有玩到利用xib來自定義一個UITableViewCell, 既然Cell都可以這樣設計了,沒道理View不行啊。 在經過一些研究和失敗後,摸索出這樣的方式。

1. 建立一個xib,作為要顯示的介面。

2. 將想要設計的介面和元件在xib上安排妥當。

3. 在storyboard的主畫面上放上scrollView。

4. 引導入已經設計好的View。

大功告成!

以下是實作的方式和步驟:
1. 先拉個scrollView到Controller上。

clip_image002



2. 按著ctrl將ScrollView拉到程式碼裡面建一個link
clip_image004
3 . 在.m檔裡面建立相對硬的@synthesize
clip_image006
4. New files->選一個empty的View (或者是View也可以)
clip_image008
5. 建完後,依照選剛剛新增的.xib檔案,拉一個View近來。並且在simulates Meterics裡面將Size 改成Freedom(不修改的話會造成)View 大小無法改變(灰色無法修改)
clip_image010
6. 在這個View上安排你需要的布局。
clip_image012
7. 回到原本的程式碼,利用[NSbound mainBundle] loadNibName:@”{xib的名字}” owner:nil options:nil]
把我們需要的UIView產生出來。 XD
並且把他加到scrollView上。
clip_image014
8. 搞定,之後這個View只要修改這個xib 就可以對應到了,之後的維護也可以用比較直觀的方式來去設計和維護嚕。
附上git hub link:
https://github.com/coolthor/ScrollPractice

2014年5月4日 星期日

[Mac]雜事(About Exfat)

昨天狠下心把資料碟的資料備份出來,然後把它重新格式化成Mac 日誌式,再把資料倒回去。

這邊順便分享一下經驗,我這台小白是2011 later,手動把光碟改成硬碟,然後主硬碟改用美光M4 的ssd。當時考慮到bootcamp後要讓資料共用不那麼麻煩,所以資料碟格式化成ExFat,真心和大家講,千萬不要這樣做。 T_T

首先, exFat不能在不format下resize,加上不太支援自動修復,所以有的時候如果再硬碟大轉的時候突然關機,恭喜,上次開機就有很高機率找不到資料碟。(有的時候玩d3也會當機,沒選擇只能重開 囧)

(不過發生之後不用驚慌,用磁碟管理工具去做檢查和修復,多試幾次會回來的。 XD)

然後就是spotlight,這東西簡單來說就是搜尋電腦內的資料,但是速度超快一個好物。但是如果遇到Exfat格式的硬碟,好像在資料量大到一定程度的時候。嗯...他會瘋狂的重建索引,所以就會聽到小白發出狂暴的聲音,搞的好像要起飛了一樣。萬般無奈下只好先把spotlight關掉。 囧rz

所以,除非是外接硬碟或者是USB隨身碟,不建議固定的硬碟
format成exfat (話說仔細想想其實這機會也不多,新版的mbp ssd好像也是焊在上面了? XD

2014年4月12日 星期六

[Cocos2d]簡單的射擊遊戲 for cocos2d v3

本篇的圖片,程式主要來源來自:
http://www.raywenderlich.com/zh-hans/18163/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8cocos2d%E5%88%B6%E4%BD%9C%E4%B8%80%E6%AC%BE%E7%AE%80%E5%8D%95%E7%9A%84iphone%E6%B8%B8%E6%88%8F-1

well,也許會覺得很奇怪,這個人家不是寫好了嘛,照著做一次有什麼好寫的。(更何況他還有中文頁面。)

我一開始練習的時候也是這麼想。
然後傻呼呼的去抓了最新的cocos2d的版本(v3),想說,新版是能差多少(挖鼻孔)

然後一開始.....就碰壁了,
這兩天利用零碎的時間研究了一下,靠腰,cocos2d v2->v3你也變太多了吧,這根本就是欺負人!  XD
首先光是取得視窗大小的部分就不一樣,
原本
CGSize winSize = [[CCDirector sharedDirector] winSize];

在v3 裡面,已經沒看到winSize 這個屬性,所以只能改用viewSize或者viewSizeInPixels(在Mac 底下這兩個是一樣的,Definition裡面有講。)
螢幕快照 2014 04 13 上午12 14 46

CGSize winSize = [[CCDirector sharedDirector] viewSize];

然後會比較困擾的部份應該是原本的 action的部份
原本的寫法:
id actionMove =  [ CCMoveTo actionWithDuration : actualDuration position : ccp ( - target.contentSize.width / 2 , actualY ) ] ; id actionMoveDone =  [ CCCallFuncN actionWithTarget : self selector : @selector ( spriteMoveFinished : ) ] ; [ target runAction : [ CCSequence actions : actionMove, actionMoveDone, nil ] ] ;

在v3 裡面,CCMoveTo/CCCallFuncN/CCSequence已死,有事燒紙。
分別改成CCActionMoveTo/CCActionCallBlock(從程式碼也可以很明顯看得出來寫法改用^{Block}的方式取代原本的@selector,私心以為這是讓一些簡單的動作更為直觀吧?)/ 
CCActionSequence
// Create the actions 
CCActionMoveTo * actionMove =  [[CCActionMoveTo alloc]initWithDuration:actualDuration position:ccp(-target.contentSize.width/2, actualY)];   
CCActionCallBlock * actionCallBack = [[CCActionCallBlock alloc] initWithBlock:^{       
[ self removeChild : target cleanup : YES ] ;       
[_targets removeObject:target];   
}];  

CCActionSequence *action = [CCActionSequence actions:actionMove,actionCallBack, nil];  
[target runAction:action];

然後原本touch的event的部份
也從
-  ( void ) ccTouchesEnded : ( NSSet  * ) touches withEvent : ( UIEvent * ) event {}
換成
 -(void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event{} 
 (不過這部份我只能猜是原生的touch event就夠用了,所以就不再另外繼承這樣。)
 
然後播音樂的部份,
 現在v3 好像也沒
#import "SimpleAudioEngine.h"
這個檔案,
查了一下發現現在是用
[[OALSimpleAudio sharedInstance] playBg:@"bgm.mp3" loop:YES];  //背景音樂
[[OALSimpleAudio sharedInstance] playEffect:@"se.mp3”];  //音效
這個來代替。

不過目前測試這個方式好像沒辦法順利播放.caf的檔案,望大德解惑。 XD

附上Github 原始碼:
https://github.com/coolthor/PracticeProject/tree/master/helloworld