2014年10月16日星期四

“Redundant Binary Upload” Issue on iTunesConnect

如果遇到已經上傳了一個版本的 binary 到 itunesconnect, 相同版本會無法上傳, 解法也很簡單, 修改掉 build 的版號, 並在 xcode 裡重新 archive 一次後, 重新 Validate... 再 Distribute... 一次即可.

如果你進一個新版本都是有管理的話, 建議先上 itunesconnect, 增加一個版號後, 再到 xcode 裡重新 archive 一次後, 重新 Validate... 再 Distribute... 一次即可.


2014年10月12日星期日

iOS console log configuration utility iTools

今天才知道 iTools 這麼神奇, 居然可以看到我在程式碼裡寫的 console log, 真是太方便了, 不用進 xcode 也可以 debug..., 缺點是其他App 的 log 也一直在輸出.




檔案下載:

http://www.itools.cn/

Hokila Jan的iOS考題整理

在網路上亂晃, 發現一個厲害的人, Hokila Jan 分享 iOS 徵人時的題目, 似乎滿實用的, 我應該先來找答案, 以後去別家公司面試時, 也許就可以派上用場.

資料來源: 

http://josihokila.blogspot.tw/2013/12/ios.html


  • 1.什麼是MVC、MVC的好處?
  • 2.什麼是delegate?舉例?
  • 3.什麼是KVO?寫個範例
  • 4.實作callback的時候怎麼決定要用block還是delegate
  • 5.thread之間要怎麼溝通?NSOperationQueue跟GCD的差別是?
  • 6.objc裡面可不可以用try catch?為什麼不常看到?
  • 7.請問HIG裡面說一個button最小的大小是多少?
  • 8.在iOS6跟iOS7分別要怎麼樣客製化UIAlertView
  • 9.MapView裡面要怎樣customized pin,有哪幾種作法? 除了原生mapKit還用過哪些圖資?
  • 10.請實作singleton 
  • 11.請實作一個factory 物件
  • 12.請寫出view lifecycle
  • 13. arc的壞處?
  • 14.演算法題:都差不多,寫個小function或者給function要寫出output。
    14.1 給一串string吐回inverse
    14.2 把河內塔用push pop代替recursive寫一遍。
    14.3 或者ACM抄來的。

下面這幾題跟objC無關,但是寫iOS一定要知道,筆試不會考,都是我在面試時被問或問對方的:


  • 1.有一天推播突然不能用了,有哪幾種可能?
  • 2.要怎麼看 dsym
  • 3.xib要怎麼和storyboard混用
  • 4.storyboard上要怎麼用用客製化的view,xib上要怎麼用用客製化的view。
  • 5.什麼是hash什麼是加密?各舉兩個例子。


相關文章:

開始作乾濕分離
http://josihokila.blogspot.tw/2014/01/blog-post.html
不管是web、iOS、Android還是Windows,基本功一定是刻UI,就iOS來說,在創建一個UI的時候,有三種方式:用code寫、xib或storyboard。storyboard在頁面很少功能不多的時候是神兵利器,但是隨著案子慢慢變大,就會發現越來越多的功能需要用xib或code才做得到,再繼續用storyboard只是會越難維護而已

2014年9月22日星期一

Privacy Policy

送審的 App 被 Apple 退件了, 原因是 17.5: Apps that include account registration or access a user’s existing account must include a privacy policy or they will be rejected.
url: https://developer.apple.com/app-store/review/guidelines/#privacy



解法1: 來產生一組隱私權宣告:

http://www.freeprivacypolicy.com/free-privacy-policy-generator.php

按了一堆 "Next" 發現還真麻煩.


解法2: copy from 類似產品的宣告.

ex: https://www.dropbox.com/privacy


2014年9月17日星期三

iOS VLC https live streaming - TLS client session handshake error

google 了半天,居然都沒有遇到相同的問題,真怪,難道大家VLC的版本都超級舊,或是都沒有去存取 TLS 憑存不合法的網站資料?結論是,問題居然找到原因而且出在官方的bug. @_@;

要解這個bug, 首先你要能夠build VLC ios 的 code.


下圖我遇到的問題,Error message: Your input can't be opened, VLC is unable to open the MRL ...


[175d1fc4] core tls session error: TLS client session handshake error
[175d19b4] http access error: cannot establish HTTP/TLS session
[175cead4] core input error: open of `https://yourname.com.tw/v1/streaming/607ab61f-0b00-418e-87ec-f76fcea684ec?token=b93da454bb0f40a6bc69b95f2c6d8786' failed


網路上的人說: 0.9.0以上版本的VLC都不支持TLS證書合法性驗證的開關。
0.9.0之後的版本,VLC去掉了--no-tls-check-tls命令


before 0.9.0 舊的解法:
=======================
    [MyOptionsArray addObject:@"--no-tls-check-cert"];

    [MyOptionsArray addObject:@"--no-tls-check-hostname"];


new error message, after 0.9.0:
=======================
vlc: unknown option or missing mandatory argument `--xxxx'
Try `vlc --help' for more information.



神人同事Lyle.Wang 在 trace 了 VLC source code 後,發現是 VLC 的 bug, 他們寫錯。

ios ▸ ImportedSources ▸ VLCKit ▸ MobileVLCKit ▸ ImportedSources ▸ vlc ▸ securetransport.c

把上面的 answer == 2 修改為  answer==1 後功能就正常了。還有在 run /buildMobileVLCKit.sh -n
這裡請加上一個 -n, 如果不加的話,每次build code 都會重新把 vlc clone 下來,git server 上的 code 是錯的。



目前VLC 官方用的 2014-09-15 的版本還是有問題:
http://nightlies.videolan.org/build/ios/MobileVLCKit-UniversalBinary-20140915-0616.zip

2014年9月10日星期三

iOS screen resolutions (with iPhone6 & iPhone6 plus)

其實 3.5" 的 iPhone 現在買不到了, 理論上不太需要支援, 而且在 xCode 裡寫, 設為 full screen 時, 大多數的情況下, 3.5" 和 4" 在 UI 控制和調整上不會差太多. iPad mini / iPad2 / iPad retina 其實在開發時沒有特別的感覺, 因為位置是一樣的, xCode 都自己做掉. 這次 iPhone 6 & iPhone 6 plus 的解析度是滿怪的, 但很合理, 這麼做是必然的, 和 Android 在開發上有相同的問題, 下面紅色圈圈是目前用到的, 需要下載新版的 xCode 6.0 來看看 iOS 8 裡怎麼處理 iPhone 6 的解析度.



2014年9月9日星期二

nsstring trim space begin end

奇怪,trim space 不是很常用嗎?為什麼 objective-C 裡寫起來這麼麻煩。

解法1:
NSString *string = @" this text has spaces before and after ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                                  [NSCharacterSet whitespaceCharacterSet]];

解法2:
UPDATE: A quick benchmark showed that Matt's own adaption, based on Max' & mine, performs best.
@implementation NSString (TrimmingAdditions)

- (NSString *)stringByTrimmingLeadingCharactersInSet:(NSCharacterSet *)characterSet {
    NSUInteger location = 0;
    NSUInteger length = [self length];
    unichar charBuffer[length];    
    [self getCharacters:charBuffer];

    for (location; location < length; location++) {
        if (![characterSet characterIsMember:charBuffer[location]]) {
            break;
        }
    }

    return [self substringWithRange:NSMakeRange(location, length - location)];
}

- (NSString *)stringByTrimmingTrailingCharactersInSet:(NSCharacterSet *)characterSet {
    NSUInteger location = 0;
    NSUInteger length = [self length];
    unichar charBuffer[length];    
    [self getCharacters:charBuffer];

    for (length; length > 0; length--) {
        if (![characterSet characterIsMember:charBuffer[length - 1]]) {
            break;
        }
    }

    return [self substringWithRange:NSMakeRange(location, length - location)];
}

@end
and then:
NSString *trimmedString = [yourString stringByTrimmingTrailingCharactersInSet:[NSCharacterset whitespaceAndNewlineCharacterSet]];
or for leading whitespace:
NSString *trimmedString = [yourString stringByTrimmingLeadingCharactersInSet:[NSCharacterset whitespaceAndNewlineCharacterSet]];
It's implemented in an abstract fashion so you can use it with any possible NSCharacterSetwhitespaceAndNewlineCharacterSet being just one of them.
For convenience you might want to add these wrapper methods:
- (NSString *)stringByTrimmingLeadingWhitespace {
    return [self stringByTrimmingLeadingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
}

- (NSString *)stringByTrimmingTrailingWhitespace {
    return [self stringByTrimmingTrailingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
}

- (NSString *)stringByTrimmingLeadingWhitespaceAndNewline {
    return [self stringByTrimmingLeadingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

- (NSString *)stringByTrimmingTrailingWhitespaceAndNewline {
    return [self stringByTrimmingTrailingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
Edit: reverted back to initial version using charBuffer for better performance.

Facebook 留言