2012年9月19日 星期三

Disable Select TabBar Item

這邊假如希望Tabbar中,
某幾個項目不能選擇時,
只需將該項目setEnable:NO,
這樣就行了。
[[self.tabBarController.tabBar.items objectAtIndex:3] setEnabled:NO];

MAC系統中文輸入法標點符號

輸入發切換:
, , + option(control)
。 . + option(control)
、 \ + fn

UITabBarController 項目多於五個時

UITabBarController所包含的控制項目若大於五個,
iOS會自動將最右邊的按鈕變成moer,
並將剩下的項目顯示於一包含NavigationController的TableView。
該NavigationController預設有一個edit按鈕,
點選後能接由拖曳邊更TabBarItem的順序。
避免忘記,這邊記錄一下相關設定:
//關閉編輯功能
self.tabBarController.customizableViewControllers = nil;
//變更標題
self.tabBarController.moreNavigationController.navigationBar.topItem.title = @"自訂";
//改變顏色
self.tabBarController.moreNavigationController.navigationBar.tintColor = [UIColor blackColor];

2012年9月7日 星期五

ZXing 使用

使用ZXing來解讀Barcode

加入protocol
並實現以下兩個方法:
//成功解讀Barcode時 - (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result;
//Cancel 按鈕按下時 - (void)zxingControllerDidCancel:(ZXingWidgetController*)controller;

再來就是畫面的建立

//建立掃描畫面
ZXingWidgetController *widController = [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO];
[widController.overlayView setDisplayedMessage:@"請將條碼圖示置於框線內"];

//Barcode Reader
QRCodeReader* qrcodeReader = [[QRCodeReader alloc] init];
NSSet *readers = [[NSSet alloc ] initWithObjects:qrcodeReader,nil];
[qrcodeReader release];
widController.readers = readers;
[readers release];

//掃瞄完成時,聲音提示
NSBundle *mainBundle = [NSBundle mainBundle];
widController.soundToPlay =[NSURL fileURLWithPath:[mainBundle pathForResource:@"beep-beep" ofType:@"aiff"] isDirectory:NO];

//將描畫面加入主畫面
[self presentModalViewController:widController animated:YES];
[widController release];

ZXing 匯入方式

ZXing是一個Open Source的條碼讀取器
在匯入專案時常常發生問題
這邊記錄我遇到的問題

匯入步驟:
  1. 取得ZXing
  2. 加入ZXing到專案中
  3. 設定Build Phases
    1. Add Target Dependencies
    2. Add Link Binary With Libraries
  4. 設定Build Setting
  5. import ZXingWidgetController.h & QRCodeReader.h
1.取得ZXing
連至http://code.google.com/p/zxing/取得,目前版本為2.0,我這邊使用1.7

2.加入ZXing到專案中
ZXing支援很多平台,請依序點選進入資料夾中

zxing >iphone > ZXingWidget

將ZXingWidget.xcodeproj拖曳至專案中,如果出現提示,請注意請勿勾選複製選項,請以參考的方式加入。

3.設定Build Phases
選擇專案TAGETS,選擇Build Phases分頁
3.1 在Target Dependencies中,加入ZXingWidget (ZXingWidget)
3.2 在Link Binary With Libraries加入所需framework
  • libZXingWidget.a
  • libiconv.dylib
  • CoreVideo.framework
  • CoreMedia.framework
  • AVFoundation.framework
  • AudioToolbox.framework
  • AddressBook.framework
  • AddressBookUI.framework
4.設定Build Setting
在Build Setting中搜尋"Header Search Paths"
點選"+"號,增加搜尋路徑,這邊記得要提供完整路徑,
Full Path../zxing/cpp/core/src
Full Path../zxing/iphone/ZXingWidget/Classes
加入完成後要確定有被勾選才行

5.import
#import <ZXingWidgetController.h>
#import <QRCodeReader.h>

注意事項:
  1. 資料夾名稱請不要包含"空白",會導致XCode誤判。
  2. 因有使用到C++的編譯器,請記得將副檔名由.m變更為.mm。
  3. #import <qrcodereader.h>請寫在.mm中,不然編譯會錯誤。
  4. ZXingWidget.xcodeproj的Compiler要注意
  5. 目前不確定是否支援ARC與storybard,所以請不要使用該功能。

2012年8月30日 星期四

Storyboard 登入控制問題

在嘗試Storyboard功能時,遇到了說簡單,卻也可以說是很難的問題,
這個問題在昨天的讀書會之後,終於有了解答!

我的問題是使用Storyboard來進行畫面切換,
畫面是使用者登入的畫面,
當使用者輸入正確的登入資料時,
畫面才會跳轉到下一畫面,
若輸入資料錯誤則提示訊息。

部分程式碼如下:
- (IBAction)loginButtonPressed:(id)sender {

    NSLog(@"[userNameTextField text] = %@",[userNameTextField text]);
    NSLog(@"[passwordTextField text] = %@",[passwordTextField text]);
    
    if ([[userNameTextField text] isEqualToString:userName] && [[passwordTextField text] isEqualToString:password]) {
        
        [self performSegueWithIdentifier:@"loginSuccess" sender:self];
    } else {
        
        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Login Fail" message:@"Please Check Your User Name or Password.\n It's Wrong." delegate:self cancelButtonTitle:@"OK!" otherButtonTitles:nil, nil ];
        [alertView show];
    }
}
另外如果希望再切換畫面前在做某些事 可以實現以下Method
- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
  //寫上你想執行的...
}

2012年8月21日 星期二

AirPlay相關資訊

主管要求,希望我尋找AirPlay的相關資訊,
提供給另一位同事研究。
讓公司的產品,也支援AirPlay播放,
這邊記錄一下,方便日後資料的整理。

串流內容來源:
  • iPhone類似裝置要 iOS 4.3 或以上版本
  • MAC 則要iTunes 10.2 或以上版本
內容串流目的地:
  • Apple TV III 要Apple TV 軟體 5.0 或以上版本
  • Apple TV II 要Apple TV 軟體 4.2 或以上版本
  • AirPort Express 要AirPort 韌體 7.4.2 或以上版本
使用時要記得將裝置連接到同一個網路底下

參考網頁:
使用AirPlay
使用AirPlay鏡像輸出

2012年7月5日 星期四

MAC 輸入特殊字元

在Windows上已經很習慣新注音輸入特殊符號的方式,
換到Mac上真的有點水土不服,除了常用的標點符號之外,
其他的符號每次要用都要在那邊按來按去,
而且還不一定會會按對。

搜尋了一下只要按下
command + option + T


就會出現字元表,然後點選你要的就行啦!
雖然比不上直接輸入快,
但是比每次都要在那邊猜猜看好很多。

2012年7月4日 星期三

Facebook iOS Tutorial Step 5

能夠成功的登入、登出, 再來就是依功能要求不同的權限,
要求額外的權限方式也很簡單,
只要將你需要的權限加入NSArray中,
然後將個Array以參數的方式指定給facebook 這樣就行了。
NSArray *permissions = [[NSArray alloc] initWithObjects:
        @"user_likes", 
        @"read_stream",
        nil];
[facebook authorize:permissions];
[permissions release];
可以要求的權限不少,可以參考Permissions Reference
權限基本上分成兩大類:
  • User and Friends Permissions
    • 有關用戶與朋友的部分,這會在第一個授權畫面呈現
    • 例如:user_likes
  • Extended Permissions
    • 擴展功能的部分,這會在第二個授權畫面呈現
    • 例如:read_stream

2012年7月2日 星期一

Facebook iOS Tutorial Step 4

能成功登入之後,就是要能夠登出。
登出的方式也很簡單只,要呼叫:
[facebook logout];
就可以了!

另外記得登出時,會呼叫FBSessionDelegate中fbDidLogout,
要記得實作啊!

- (void) fbDidLogout {
    // Remove saved authorization information if it exists
    //這邊是將access_token存起來
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"]) {
        [defaults removeObjectForKey:@"FBAccessTokenKey"];
        [defaults removeObjectForKey:@"FBExpirationDateKey"];
        [defaults synchronize];
    }
}

Facebook iOS Tutorial Step 3

Step 3: Implementing Single Sign-On (SSO)
第三步就是要實現單一登入。

實現單一登入時,注意驗證方式有幾種不同的機制:
  1. 如果App支援多工,而且裝置上安裝了3.2.3 Facebook App
    • SDK會開啓App
  2. 如果App支援多工,但是裝置上沒有安裝了3.2.3 Facebook App
    • SDK會開啓一個Safari瀏覽器驗證對話框
  3. 如果App不支援多工
    • SDK使用彈出一個內嵌UIWebView的驗證對話框
Facebook Developer有建議使用者升級Facebook App,
所以感覺上應該是比較推薦第一種驗證方式吧!

另外如果你的專案是使用ARC的話記得要將SDK轉換
將SDK加入專案之後,再來就是要開始實作啦!
ViewController.h
#import "FBConnect.h"

@interface ViewController : UIViewController <FBSessionDelegate> {
    
    Facebook *facebook;
}
@property (nonatomic ,retain) Facebook *facebook;
@end
ViewController.m
@synthesize facebook;
//將facebook物件在適當的位置建立
facebook = [[Facebook alloc] initWithAppId:@"Your App ID" andDelegate:self];

//由User Default將access token取出
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"] 
    && [defaults objectForKey:@"FBExpirationDateKey"]) {
    facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
    facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
}

//判斷連線是否有效,如果是無效的,將需要的權限裝載在NSArray中,然後設定facebook授權。
if (![facebook isSessionValid]) {
        NSArray *permissions = [[NSArray alloc] initWithObjects:
                                @"user_likes", 
                                @"read_stream",
                                nil];
        [facebook authorize:permissions];
    }

//再來就是要加入fbDidLogin,用User Default將access token存起來
- (void)fbDidLogin {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];

}
AppDelegate.m
// Pre iOS 4.2 support,iOS 4.2之前執行
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return [facebook handleOpenURL:url]; 
}

// For iOS 4.2+ support,iOS 4.2之後執行
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [facebook handleOpenURL:url]; 
}
再來就是要修改property list file
開啟App的XXX-Info.plist 建立一筆URL types記錄,在記錄中依序添加 item, URL Schemes, 然後輸入數值fb[YOUR_APP_ID]。


這樣就完工啦!可以測測看啦!

Creating an iOS Facebook SDK Static Library

專案若是使用ARC的話,記得要將Facebook SDK轉換,
在下載回來的SDK裡,有提供轉換的工具, 工具在~/facebook-ios-sdk/scripts下,
在Terminal中執行./build_facebook_ios_sdk_static_lib.sh
或是直接執行下面這個指令。
% ~/facebook-ios-sdk/scripts/build_facebook_ios_sdk_static_lib.sh
執行結束之後畫面會出現
















接著將新產生的~/facebook-ios-sdk/lib/facebook-ios-sdk
加入專案中就可以了

Facebook iOS Tutorial Step 2

Step 2: Installing the iOS SDK
第二步也不難,而且可能你都已經做完啦!
這邊有三件事要做:
  1. 安裝XCode
  2. 安裝Git
  3. 在下載SDK

Facebook iOS Tutorial Step 1

在開始之前,你一定要先擁有Facebook的帳號,
而且帳號必須要先加入Facebook Developers才行噢。

Step 1: Registering your iOS App with Facebook
這邊是為你的APP註冊一個專屬的Facebook App ID,
只要照著提示走下去,很容易就完成了。

首先當你進入Developers畫面之後,選擇你要建立的APP類型,
或是直接選右上方的應用程式進入建立新的應用程式畫面。














輸入你的App Name,這邊要注意一下App Name的限制,
而且App Name不能跟其他的App重複,
如果有錯誤或是重複,系統會提示你。










當你完成輸入之後,他會有個驗證,
依畫面輸入正確的驗證碼,就能完成建立App ID了。
















2012年6月29日 星期五

Facebook API 筆記

雖然先前讀書會上有同學分享過Facebook API,
但是沒有真的去實作,還真的不真到哪邊有問題。

最近因為工作上的需要所以,要用到Facebook 分享,
所以開篇文章記錄一下,方便日後搜尋。

在Facebook Developers的iOS Tutorial中,
分成了以下幾個步驟:
相關網頁:

2012年6月22日 星期五

Time Stamp

為了方便時間的計算跟儲存,
我會將時間轉換為時間戳。
相關記錄如下:

  • 時間戳說明:
    • Unix時間戳(Unix timestamp),或稱Unix時間(Unix time)、POSIX時間(POSIX time),是一種時間表示方式,定義為從格林威治時間1970年01月01日00時00分00秒起至現在的總秒數。
    • Unix時間戳不僅被使用在Unix 系統、類Unix系統中,也在許多其他操作系統中被廣泛採用。
    • 目前相當一部分操作系統使用32位二進制數字表示時間。
    • 此類系統的Unix時間戳最多可以使用到格林威治時間2038年01月19日03時14分07秒(二進制:01111111 11111111 11111111 11111111)。其后一秒,二進制數字會變為10000000 00000000 00000000 00000000,發生溢出錯誤,造成系統將時間誤解為1901年12月13日20時45分52秒。這很可能會引起軟件故障,甚至是系統癱瘓。
    • 使用64位二進制數字表示時間的系統(最多可以使用到格林威治時間292,277,026,596年12月04日15時30分08秒)則基本不會遇到這類溢出問題。
參考網頁:
http://www.haogongju.net/art/633325
轉換方式如下:
//轉換時間日期 為標籤
NSDate *temp = date;
NSTimeInterval timeInterval = [temp timeIntervalSince1970];
NSString *converFinishDStamp = [NSString stringWithFormat:@"%f",timeInterval];
return converFinishDStamp;

//轉換時間標籤 為日期
NSTimeInterval time = [stamp doubleValue];
NSDate *convertDate = [NSDate dateWithTimeIntervalSince1970:time];
    
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"];
[dateFormatter stringFromDate:convertDate];
return convertDate;

NSString & NSData Swap

最近常用到NSData與NSString的轉換, 記錄一下。
//NSData to NSString
NSString *swapString = [[NSString alloc] initWithData:swapData encoding:NSASCIIStringEncoding];
//NSString to NSData
NSData *swapData = [swapString dataUsingEncoding: NSASCIIStringEncoding];
另外還有與char之間的轉換
參考網頁:
http://blog.sina.com.cn/s/blog_4adf31ea0100t4y7.html

2012年6月20日 星期三

Get APP Version

因應DQA需求,要知道目前的版本號,
所以將版本號存入User Default,
並在設定中增加一欄位,顯示目前APP版本號。

取得版本方式如下:
NSString *appVersionStr = 
[NSString stringWithFormat:@"Ver.%@ Build %@",
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"],
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:appVersionStr forKey:@"appversion"];

Write NSString to File

為了要釐清是Server傳入的資訊有錯,還是APP的問題,
我將Server回傳的JSON字串,存在本地資料夾中,
待有需要的時候將文件取出確認。

將NSString存入本地資料夾的方式如下:
NSError *error = nil;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *areaPath = [documentsDirectory stringByAppendingPathComponent:@"area.txt"];
[areaReturnStr writeToFile:areaPath atomically:YES encoding:NSUTF8StringEncoding error:&error];

2012年6月19日 星期二

Code hight light

一直想在部落格中放上整齊的Code,Google搜尋了一下,
雖然線上有很多轉換的工具,但是大多數都不支援Objective-C的,
必須使用 C 或 C++ 來取代。

可是也因為這樣,很多Objective-C或是Cococa就顯示不出來了,
針對這個問題在搜尋之後,蠻多人都推薦syntaxhighlighter這套工具的,
雖然原本的並不支援,但是有高手解決了這個問題。
使用方式如下:
標籤1

<pre class="brush: xml">
<tag1>XML標籤1</tag1>
</pre>
NSString
NSData

<pre class="brush: objc">
NSString
NSData
</pre>

這邊要注意的地方是<pre class="brush: xml">中,
"brush: xml"代表的是要展現的語言格式,
若設定錯誤,展現的格式就會有錯哦!

另外若是設定成為不存在的語言,
syntaxhighlighter出現提示訊息。

UITextField Set Content Alignment

UITextField 文字對齊的方式除了
[textField setTextAlignment:UITextAlignmentLeft];
[textField setTextAlignment:UITextAlignmentCenter];
[textField setTextAlignment:UITextAlignmentRight];
之外,還可以針對內容做水平或垂直對齊。

垂直
typedef enum {
UIControlContentVerticalAlignmentCenter  = 0,
UIControlContentVerticalAlignmentTop     = 1,
UIControlContentVerticalAlignmentBottom  = 2,
UIControlContentVerticalAlignmentFill    = 3,
} UIControlContentVerticalAlignment;
水平
typedef enum {
UIControlContentHorizontalAlignmentCenter = 0,
UIControlContentHorizontalAlignmentLeft   = 1,
UIControlContentHorizontalAlignmentRight  = 2,
UIControlContentHorizontalAlignmentFill   = 3,
} UIControlContentHorizontalAlignment;
使用方式如下:
//垂直
[textField setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom];
//水平
[textField setContentHorizontalAlignment:UIControlContentHorizontalAlignmentRight];

2012年5月28日 星期一

Google Youtube API Note_< entry > tag

若呼叫Google YouTube API若未限制回應數量,
Gdata Server預設會回傳25筆entry資料,
每一筆entry會有以下這些欄位,
每一筆entry代表一部影片資訊。

//YouTube API 請求添加或更新資料時,最根的標籤
tag:youtube.com,2008:video:d9NF2edxy-M
//feed entry編號
2012-01-06T06:43:30.000Z
//影片建立時間
2012-05-28T01:29:03.000Z
//feed或feed entry最後更新時間
















//影片分類

Somebody That I Used to Know - Walk off the Earth (Gotye - Cover) 

//影片標題






//相關連結


walkofftheearth
http://gdata.youtube.com/feeds/api/users/walkofftheearth
9PEibgWOqZ-1I1JdxRmr6g

//作者資訊









//用戶是否允許對影片評論




//影片評論連結


//高畫值影片,不一定會有。

//影片
 
Music



walkofftheearth



//影片說明&描述

walk off the earth, gotye, gotye cover, wote, somebody that I use to know, cover, gianni luminati, sarah blackwood, marshall, 4 guys 1 guitar, 5 guys 1 guitar, 3 guys 1 guitar, little comets
//影片標記

youtube
//Youtube 社群規範

 
//影片播放路徑

 //預設
 //中解析度
 //高解析度
  //影片開始截圖
 //影片中間截圖
 //影片結束截圖
//影片縮圖

Somebody That I Used to Know - Walk off the Earth (Gotye - Cover)
//影片標題

widescreen
//作者


//影片長度,單位是秒

2012-01-06T06:43:30.000Z
//影片上傳時間

9PEibgWOqZ-1I1JdxRmr6g
//上傳者ID

d9NF2edxy-M
//影片編號


 

//過時標籤,改用


//影片播放次數



//不喜歡 & 喜歡 計數

更新內容:
  1. 2012-06-18 更新文章排版,使用 SyntaxHighlighter。

2012年5月25日 星期五

YouTube Data API中文翻譯

YouTube Developer
  • YouTube Data API
    • Client Library Guides and Code 客戶端庫指南和守則
    • Developer's Guide (2.0)
      • Authentication 認證
        • OAuth 2.0
        • OAuth 1.0
        • AuthSub
        • ClientLogin
        • Flash Applications
      • Understanding Video Feeds and Entries 了解視頻供稿和條目
        • Displaying a List of Videos 顯示視頻列表
        • Identifying Related Feeds 確定相關的Feed
        • Displaying Video Information 顯示視頻信息
      • Retrieving and searching for videos 檢索和視頻搜索
        • Video Feed Types 視頻飼料類型
        • Browsing with Categories and Keywords 瀏覽類別和關鍵字
        • API Query Parameters API查詢參數
        • Retrieving Data for a Single Video 為一個單一的視頻數據檢索
      • Searching for channels 搜索頻道
      • Searching for playlists 搜索播放清單
      • Uploading Videos 上傳視頻

      • Updating and Deleting Video 更新和刪除視頻

      • Live Events (experimental) 現場活動(實驗)

      • Movies and Shows 電影和節目
      • Community Features 社區功能

      • Saving and Collecting Video 保存和收集視頻
      • Enabling User Interaction 啟用用戶交互

      • Using the Simple Update Protocol (SUP) 使用簡單的更新協議進行(SUP)
      • Using Batch Processing 使用批處理 
      • Partial Feeds (Experimental) 部分飼料(實驗)

      • Testing and Troubleshooting 測試和故障排除
      • retrieving insight data for a video 檢索視頻洞察力數據
      • Understanding API Error Responses 理解API錯誤響應
      • Revision History 修訂歷史
      • (Printable Version) (打印版本)
    • Reference Guide (2.0) 參考指南

    • Migration Guide (2.0) 遷移指南

    • Interactive Demo 互動展示
相關資訊: