

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>iOS &#8211; Max的程式語言筆記</title>
	<atom:link href="https://stackoverflow.max-everyday.com/tag/ios/feed/" rel="self" type="application/rss+xml" />
	<link>https://stackoverflow.max-everyday.com</link>
	<description>我要當一個豬頭，快樂過每一天</description>
	<lastBuildDate>Wed, 04 Nov 2020 10:34:47 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://stackoverflow.max-everyday.com/wp-content/uploads/2017/02/max-stackoverflow-256.png</url>
	<title>iOS &#8211; Max的程式語言筆記</title>
	<link>https://stackoverflow.max-everyday.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Charles的下載安裝及使用</title>
		<link>https://stackoverflow.max-everyday.com/2020/10/charles-proxy-android/</link>
					<comments>https://stackoverflow.max-everyday.com/2020/10/charles-proxy-android/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Thu, 29 Oct 2020 11:25:44 +0000</pubDate>
				<category><![CDATA[Android筆記]]></category>
		<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[SSL]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=3577</guid>

					<description><![CDATA[感謝Charles，讓Max解鎖中間人攻擊(Ma...]]></description>
										<content:encoded><![CDATA[
<p>感謝Charles，讓Max解鎖中間人攻擊(Man-in-the-middle attack，縮寫：MITM)的成就，終於可以讓 https 加密的世界重新回到 http 明碼的世界。</p>



<p>傳統的網路監聽(Sniffer)技術遇到的問題是SSL的出現，傳輸的封包被加密，無法直接監聽到封包裡的內容。使用Charles為我們便利地讓與遠端伺服器之間的傳輸 變的透明可以觀看其內容。</p>



<p>這篇文章要分享Max怎麼使用Charles查看https的封包內容。</p>



<p>Max測試情景是Charles用的是 macOS 的版本，在Android 手機的WiFi 裡設定 proxy 連到 macOS 的 Charles，並在 Android App 裡與遠端主機進行網路資料傳輸。</p>



<p>Max的環境：</p>



<ul class="wp-block-list"><li>作業系統：macOS 10.15.7</li><li>Charles: ver 4.5.6 </li><li>Android手機：Mi A1 (Android 9)</li></ul>



<p>另外有用一隻手機分享熱點，讓 macOS 和 Android 手機都在同一個 LAN 裡。</p>



<hr class="wp-block-separator"/>



<p>實作步驟如下：</p>



<h2 class="wp-block-heading">1：下載和安裝Charles</h2>



<p>官方版下載地址：<br><a href="https://www.charlesproxy.com/download/">https://www.charlesproxy.com/download/</a><br></p>



<p>附註：</p>



<ul class="wp-block-list"><li>官方版只有30天免費使用期限。</li><li>安裝完打開的過程中，會彈出一個彈窗，問你是否grant privilege，要點擊「grant privilege」按鈕，這一步是授權，願意讓Charles去監聽你的瀏覽器請求。</li></ul>



<h2 class="wp-block-heading">2：安裝Charles Root Certificates</h2>



<p>開啟 Charles 後，可以左欄很多的 unknown，點下去後可以看到  Notes：</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>SSL Proxying not enabled for this host</p></blockquote>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1012" height="856" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.06.59.png" alt="" class="wp-image-3581" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.06.59.png?v=1603969038 1012w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.06.59-600x508.png?v=1603969038 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.06.59-768x650.png?v=1603969038 768w" sizes="(max-width: 1012px) 100vw, 1012px" /></figure>



<p>解法，點 menubar -> Help -> SSL Proxying -> Install Charles Root Certificate</p>



<figure class="wp-block-image size-large"><img decoding="async" width="933" height="236" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.08.07.png" alt="" class="wp-image-3580" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.08.07.png?v=1603968977 933w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.08.07-600x152.png?v=1603968977 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.08.07-768x194.png?v=1603968977 768w" sizes="(max-width: 933px) 100vw, 933px" /></figure>



<p>接著使用 spotlight 去開啟 <em>Keychain Access</em> 的 App，會看到有一個紅色的X，點2下開啟。</p>



<figure class="wp-block-image size-large"><img decoding="async" width="989" height="705" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.08.23.png" alt="" class="wp-image-3582" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.08.23.png?v=1603969305 989w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.08.23-600x428.png?v=1603969305 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.08.23-768x547.png?v=1603969305 768w" sizes="(max-width: 989px) 100vw, 989px" /></figure>



<p>在第一個欄位選擇「Always Trust」</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="514" height="430" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.09.39.png" alt="" class="wp-image-3583"/></figure>



<p>這時候就會變色綠色了，沒有紅色X。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="989" height="705" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.10.25.png" alt="" class="wp-image-3584" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.10.25.png?v=1603969495 989w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.10.25-600x428.png?v=1603969495 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-15.10.25-768x547.png?v=1603969495 768w" sizes="(max-width: 989px) 100vw, 989px" /></figure>



<h2 class="wp-block-heading">3：設定 SSL Proxying setting</h2>



<p>在還沒設定 SSL Proxying setting 會顯示下面的Notes:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>SSL Proxying not enabled for this host: enable in Proxy Settings, SSL locations</p></blockquote>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1012" height="856" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-16.15.39a.png" alt="" class="wp-image-3585" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-16.15.39a.png?v=1603969805 1012w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-16.15.39a-600x508.png?v=1603969805 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-16.15.39a-768x650.png?v=1603969805 768w" sizes="(max-width: 1012px) 100vw, 1012px" /></figure>



<p>點 menubar -> Proxy -> SSL Proxying setting 裡按&#8221;Add&#8221; 按鈕，增加我們的domain：</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="616" height="467" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-16.37.55.png" alt="" class="wp-image-3574" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-16.37.55.png?v=1603966930 616w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-16.37.55-600x455.png?v=1603966930 600w" sizes="(max-width: 616px) 100vw, 616px" /></figure>



<h2 class="wp-block-heading">4：在Android / iOS 手機下載設定檔</h2>



<p>在手機的瀏覽器裡，連到下面網址，下載並安裝設定檔。<br><a href="http://charlesproxy.com/getssl">http://charlesproxy.com/getssl</a></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="576" height="1024" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screenshot_20201029-160449-576x1024.png?v=1603970297" alt="" class="wp-image-3587" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screenshot_20201029-160449-576x1024.png?v=1603970297 576w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screenshot_20201029-160449-338x600.png?v=1603970297 338w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screenshot_20201029-160449-768x1365.png?v=1603970297 768w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screenshot_20201029-160449-864x1536.png?v=1603970297 864w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screenshot_20201029-160449.png?v=1603970297 1080w" sizes="(max-width: 576px) 100vw, 576px" /></figure>



<p>接著在 Android 的 Wi-Fi 的設定的地方，去設定 proxy host 和 port 為 macOS 的 IP(主機名) 和 port(端口) 即可。</p>



<p>不知道 macOS 的 IP address 可以在 macOS 的 Charles 裡點 menubar -> Help -> Local IP Address.</p>



<p>port(端口) 預設值是  8888，想修改的話，在 Charles app 點 menubar -> Proxy -> Proxy Settings 就可以了。</p>



<p>以上 4個步驟就結束了，附上讓 https 變明碼的執行畫面：</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1012" height="856" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-16.38.44.png" alt="" class="wp-image-3588" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-16.38.44.png?v=1603970709 1012w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-16.38.44-600x508.png?v=1603970709 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2020/10/Screen-Shot-2020-10-29-at-16.38.44-768x650.png?v=1603970709 768w" sizes="(max-width: 1012px) 100vw, 1012px" /></figure>



<p>^_^)y 耶～ 明碼! </p>



<hr class="wp-block-separator"/>



<h2 class="wp-block-heading">相關文章</h2>



<p>Charles Proxy macOS setup guide<br><a href="https://medium.com/@yash3x/charles-proxy-macos-setup-guide-cfde50262b91">https://medium.com/@yash3x/charles-proxy-macos-setup-guide-cfde50262b91</a></p>



<p>Charles的下载安装及使用<br><a href="https://www.jianshu.com/p/912a9e15b174">https://www.jianshu.com/p/912a9e15b174</a></p>



<p>Charles on Windows + Android 查看https封包<br><a href="https://medium.com/@NorthBei/charles-on-windows-android-%E6%9F%A5%E7%9C%8Bhttps%E5%B0%81%E5%8C%85-fe6f2e6cc507">https://medium.com/@NorthBei/charles-on-windows-android-%E6%9F%A5%E7%9C%8Bhttps%E5%B0%81%E5%8C%85-fe6f2e6cc507</a></p>



<p>透過 Charles Proxy 工具，查看 SSL 連線的 Request 與 Response 資料<br><a href="https://jzchangmark.wordpress.com/2015/05/24/%E9%80%8F%E9%81%8E-charles-%E5%B7%A5%E5%85%B7%EF%BC%8C%E6%9F%A5%E7%9C%8B-ssl-%E9%80%A3%E7%B7%9A%E7%9A%84-request-%E8%88%87-response-%E8%B3%87%E6%96%99/">https://jzchangmark.wordpress.com/2015/05/24/%E9%80%8F%E9%81%8E-charles-%E5%B7%A5%E5%85%B7%EF%BC%8C%E6%9F%A5%E7%9C%8B-ssl-%E9%80%A3%E7%B7%9A%E7%9A%84-request-%E8%88%87-response-%E8%B3%87%E6%96%99/</a></p>



<p>Using Charles Proxy to Debug Android SSL Traffic<br><a href="https://medium.com/@hackupstate/using-charles-proxy-to-debug-android-ssl-traffic-e61fc38760f7">https://medium.com/@hackupstate/using-charles-proxy-to-debug-android-ssl-traffic-e61fc38760f7</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2020/10/charles-proxy-android/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>arabic 阿拉伯文</title>
		<link>https://stackoverflow.max-everyday.com/2019/04/arabic/</link>
					<comments>https://stackoverflow.max-everyday.com/2019/04/arabic/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Mon, 01 Apr 2019 15:51:26 +0000</pubDate>
				<category><![CDATA[Android筆記]]></category>
		<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[Python筆記]]></category>
		<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2677</guid>

					<description><![CDATA[我在處理阿拉伯文二天了，分享一些出乎意料之外的心...]]></description>
										<content:encoded><![CDATA[
<p>我在處理阿拉伯文二天了，分享一些出乎意料之外的心得。</p>



<p>首先如果想要macOS在 terminal 裡正確顯示  right-to-left (RTL or dextrosinistral) 可以服用下列指令：</p>



<ol class="wp-block-list"><li>Press&nbsp;<code>Command+Space</code>&nbsp;and type&nbsp;<strong><em>Terminal</em></strong>&nbsp;and press&nbsp;<strong><em>enter/return</em></strong>&nbsp;key.</li><li>Run in Terminal app:<br><code>ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" &lt; /dev/null 2&gt; /dev/null</code><br>and press&nbsp;<strong><em>enter/return</em></strong>&nbsp;key.&nbsp;<br>If the screen prompts you to enter a password, please enter your Mac&#8217;s user password to continue. When you type the password, it won&#8217;t be displayed on screen, but the system would accept it. So just type your password and press ENTER/RETURN key. Then wait for the command to finish.</li><li>Run:<br><code>brew install fribidi</code></li></ol>



<hr class="wp-block-separator"/>



<p>對<a href="https://zh.wikipedia.org/wiki/%E9%9B%99%E5%90%91%E6%96%87%E7%A8%BF">雙向文本</a>（Bi-directional text）的支援，小的文字編輯軟體可能只有支援一半，例如：sublime 這套軟體，在整份檔案都是 bidi 情況下，是可以支援，但交叉顯示時，顯示就會出錯，會相反顯示，我也因此花了很多冤枉的時間在除錯。</p>



<p>除了小編輯器會有問題，程式語言python 3在處理bidi 的字串也會有問題，做法很簡單，遇到 bidi text 自己手動反轉即可，附上字串反轉副程式：</p>



<pre class="wp-block-preformatted">def reverse_i(s):<br>    r = ''<br>    for c in s:<br>            r = c + r<br>    return r</pre>



<hr class="wp-block-separator"/>



<p>在sublime 上會發生一些「神奇的」錯誤，就是畫面上顯示的阿拉伯文是正確的，但copy/paste 到 xcode 或 browser 上看時，會是相反的字串，所以要知道自己有沒有處理正確，只要都使用大公司推出的文字編輯器就不會有問題。如果用不習慣大公司的文字編輯器，請記得最後要貼到瀏覽器上做驗證，例如：</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1024" height="201" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2019/04/Screen-Shot-2019-04-01-at-23.18.25-1024x201.jpg" alt="" class="wp-image-2679" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2019/04/Screen-Shot-2019-04-01-at-23.18.25.jpg 1024w, https://stackoverflow.max-everyday.com/wp-content/uploads/2019/04/Screen-Shot-2019-04-01-at-23.18.25-600x118.jpg 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2019/04/Screen-Shot-2019-04-01-at-23.18.25-768x151.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<hr class="wp-block-separator"/>



<p>Wiki：<br><a href="https://en.wikipedia.org/wiki/Bi-directional_text">https://en.wikipedia.org/wiki/Bi-directional_text</a></p>



<p>雙向文本<br><a href="https://zh.wikipedia.org/wiki/%E9%9B%99%E5%90%91%E6%96%87%E7%A8%BF">https://zh.wikipedia.org/wiki/%E9%9B%99%E5%90%91%E6%96%87%E7%A8%BF</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2019/04/arabic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[iOS] &#8216;NSLayoutConstraint for (null): Constraint must contain a first layout item&#8217;</title>
		<link>https://stackoverflow.max-everyday.com/2019/04/ios-nslayoutconstraint-for-null-constraint-must-contain-a-first-layout-item/</link>
					<comments>https://stackoverflow.max-everyday.com/2019/04/ios-nslayoutconstraint-for-null-constraint-must-contain-a-first-layout-item/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Sun, 31 Mar 2019 18:08:00 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[iOS]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2674</guid>

					<description><![CDATA[在套用 Google Admob 範例：http...]]></description>
										<content:encoded><![CDATA[
<p>在套用 Google Admob 範例：<br><a href="https://developers.google.com/admob/ios/banner">https://developers.google.com/admob/ios/banner</a></p>



<hr class="wp-block-separator"/>



<pre class="wp-block-preformatted"><strong>@import GoogleMobileAds;</strong><br><br>@interface ViewController ()<br><br><strong>@property(nonatomic, strong) GADBannerView *bannerView;</strong><br><br>@end<br><br>@implementation ViewController<br><br>- (void)viewDidLoad {<br>  [super viewDidLoad];<br>  <strong><br>  // In this case, we instantiate the banner with desired ad size.<br>  self.bannerView = [[GADBannerView alloc]<br>      initWithAdSize:kGADAdSizeBanner];<br><br>  [self addBannerViewToView:self.bannerView];<br>}<br><br>- (void)addBannerViewToView:(UIView *)bannerView {<br>  bannerView.translatesAutoresizingMaskIntoConstraints = NO;<br>  [self.view addSubview:bannerView];<br>  [self.view addConstraints:@[<br>    [NSLayoutConstraint constraintWithItem:bannerView<br>                               attribute:NSLayoutAttributeBottom<br>                               relatedBy:NSLayoutRelationEqual<br>                                  toItem:self.bottomLayoutGuide<br>                               attribute:NSLayoutAttributeTop<br>                              multiplier:1<br>                                constant:0],<br>    [NSLayoutConstraint constraintWithItem:bannerView<br>                               attribute:NSLayoutAttributeCenterX<br>                               relatedBy:NSLayoutRelationEqual<br>                                  toItem:self.view<br>                               attribute:NSLayoutAttributeCenterX<br>                              multiplier:1<br>                                constant:0]<br>                                ]];<br>}<br>  </strong><br><br>@end</pre>



<hr class="wp-block-separator"/>



<p>結果顯示錯誤訊息：</p>



<pre class="wp-block-preformatted">NSLayoutConstraint for (null): Constraint must contain a first layout item</pre>



<hr class="wp-block-separator"/>



<p>發生的原因是，直接套用了英文版裡的範例會出錯，改服用中文版裡的範例和指引就OK了。中文版的解法是：<br><a href="https://developers.google.com/mobile-ads-sdk/docs/admob/ios/quick-start?hl=zh-tw">https://developers.google.com/mobile-ads-sdk/docs/admob/ios/quick-start?hl=zh-tw</a></p>



<p>1：設定 Storyboard 裡的元件。</p>



<p>開啟 <code>Main.storyboard</code>。在右下角的 <strong>Object library</strong> (物件程式庫)中，搜尋 <code>UIView</code>，然後將 <code>UIView</code> 元素拖曳至檢視控制器。接著在右上角的 <strong>Identity inspector</strong> (身份偵測程式)中，將這個檢視設為自訂類別 <code>GADBannerView</code>。</p>



<p>2：不需要 create object 進 GADBannerView，直接做 adUnitID assign 和 loadRequest.</p>



<pre class="wp-block-preformatted">- (void)viewDidLoad {<br>&nbsp; [super viewDidLoad];<br><br>&nbsp; NSLog(@"Google Mobile Ads SDK version: %@", [GADRequest sdkVersion]);<br>&nbsp; self.bannerView.adUnitID = @"ca-app-pub-3940256099942544/2934735716";<br>&nbsp; self.bannerView.rootViewController = self;<br>&nbsp; [self.bannerView loadRequest:[GADRequest request]];<br>}</pre>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2019/04/ios-nslayoutconstraint-for-null-constraint-must-contain-a-first-layout-item/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>App 違反不當廣告政策</title>
		<link>https://stackoverflow.max-everyday.com/2018/06/max_ad_content_rating/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/06/max_ad_content_rating/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Tue, 05 Jun 2018 15:36:56 +0000</pubDate>
				<category><![CDATA[Android筆記]]></category>
		<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[admob]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[iOS]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2408</guid>

					<description><![CDATA[上架App 被退，原因是： 問題：違反不當廣告政...]]></description>
										<content:encoded><![CDATA[<p>上架App 被退，原因是：</p>
<blockquote><p><b>問題：違反不當廣告政策</b></p>
<p>您的應用程式內顯示的廣告除了必須符合我們的政策規定，<wbr />還必須針對目標對象提供適當內容。舉例來說，<wbr />如果應用程式的內容分級適用對象為未成年人，<wbr />則不可放送含有兒童不宜內容或服務的廣告。</p></blockquote>
<hr />
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2409" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/06/Screenshot-2018-06-05-23.03.19.jpg" alt="" width="1024" height="406" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/06/Screenshot-2018-06-05-23.03.19.jpg 1024w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/06/Screenshot-2018-06-05-23.03.19-600x238.jpg 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/06/Screenshot-2018-06-05-23.03.19-768x305.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<hr />
<p>解法：</p>
<p><a href="https://support.google.com/admob/answer/7562142?hl=zh-Hant&amp;ref_topic=7384665">https://support.google.com/admob/answer/7562142?hl=zh-Hant&amp;ref_topic=7384665</a></p>
<h2>數位內容標籤</h2>
<p>AdMob 會使用數位內容標籤，就廣告對不同目標對象的適合程度進行分級。這類標籤類似於其他機構組織為電影或電玩遊戲所設定的內容分級。</p>
<p>數位內容標籤依定義分為下列幾種：</p>
<ul class="spaced-list">
<li><strong>G</strong>：內容適合一般觀眾 (包括闔家皆宜的內容)</li>
<li><strong>PG</strong>：內容適合大多數的觀眾 (需有家長監護)</li>
<li><strong>T</strong>：內容適合青少年及較年長的觀眾</li>
<li><strong>MA</strong>：內容只適合成年觀眾</li>
</ul>
<p>Google Play 和 Apple App Store 各有專屬的分級和標籤套用方式，用以判定內容對不同年齡層的適合程度。請參閱下表，瞭解您應用程式目標對象所對應的數位內容標籤。</p>
<table class="borders spaced-table">
<thead>
<tr>
<th>數位內容標籤</th>
<th>Google Play (Android)</th>
<th>App Store (iOS)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="align-center">G</td>
<td class="align-center">3+</td>
<td class="align-center">4+</td>
</tr>
<tr>
<td class="align-center">PG</td>
<td class="align-center">7+</td>
<td class="align-center">9+</td>
</tr>
<tr>
<td class="align-center">T</td>
<td class="align-center">12+</td>
<td class="align-center">12+</td>
</tr>
<tr>
<td class="align-center">MA</td>
<td class="align-center">16+、18+</td>
<td class="align-center">17+</td>
</tr>
</tbody>
</table>
<hr />
<p>程式：<br />
provide targeting information to an ad request.</p>
<p><a href="https://developers.google.com/admob/android/targeting#child-directed_setting">https://developers.google.com/admob/android/targeting#child-directed_setting</a></p>
<blockquote>
<pre class="prettyprint"><span class="typ">Bundle</span><span class="pln"> extras </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Bundle</span><span class="pun">();</span><span class="pln">
extras</span><span class="pun">.</span><span class="pln">putString</span><span class="pun">(</span><span class="str">"max_ad_content_rating"</span><span class="pun">,</span> <span class="str">"MA"</span><span class="pun">);</span>

<span class="typ">AdRequest</span><span class="pln"> request </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">AdRequest</span><span class="pun">.</span><span class="typ">Builder</span><span class="pun">()</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">addNetworkExtrasBundle</span><span class="pun">(</span><span class="typ">AdMobAdapter</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">,</span><span class="pln"> extras</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">build</span><span class="pun">();</span></pre>
<p>&nbsp;</p></blockquote>
<hr />
<p>完整範例：<br />
<a href="https://github.com/googleads/googleads-mobile-android-examples/blob/master/java/advanced/APIDemo/app/src/main/java/com/google/android/gms/example/apidemo/AdMobAdTargetingFragment.java">https://github.com/googleads/googleads-mobile-android-examples/blob/master/java/advanced/APIDemo/app/src/main/java/com/google/android/gms/example/apidemo/AdMobAdTargetingFragment.java</a></p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/06/max_ad_content_rating/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How can we programmatically detect which iOS version is device running on?</title>
		<link>https://stackoverflow.max-everyday.com/2018/05/how-can-we-programmatically-detect-which-ios-version-is-device-running-on/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/05/how-can-we-programmatically-detect-which-ios-version-is-device-running-on/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Wed, 30 May 2018 08:42:03 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Swift]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2394</guid>

					<description><![CDATA[有些功能，需要新的版本 iOS 才能執行，所以需...]]></description>
										<content:encoded><![CDATA[<p>有些功能，需要新的版本 iOS 才能執行，所以需要判斷 iOS 版本。解法如下：</p>
<p>From iOS 8 we can use the new <code>isOperatingSystemAtLeastVersion</code> method on <code>NSProcessInfo</code></p>
<pre class="lang-c prettyprint prettyprinted"><code>   <span class="typ">NSOperatingSystemVersion</span><span class="pln"> ios8_0_1 </span><span class="pun">=</span> <span class="pun">(</span><span class="typ">NSOperatingSystemVersion</span><span class="pun">){</span><span class="lit">8</span><span class="pun">,</span> <span class="lit">0</span><span class="pun">,</span> <span class="lit">1</span><span class="pun">};</span>
   <span class="kwd">if</span> <span class="pun">([[</span><span class="typ">NSProcessInfo</span><span class="pln"> processInfo</span><span class="pun">]</span><span class="pln"> isOperatingSystemAtLeastVersion</span><span class="pun">:</span><span class="pln">ios8_0_1</span><span class="pun">])</span> <span class="pun">{</span>
      <span class="com">// iOS 8.0.1 and above logic</span>
   <span class="pun">}</span> <span class="kwd">else</span> <span class="pun">{</span>
      <span class="com">// iOS 8.0.0 and below logic</span>
   <span class="pun">}</span></code></pre>
<p>Beware that this will crash on iOS 7, as the API didn&#8217;t exist prior to iOS 8. If you&#8217;re supporting iOS 7 and below, you can safely perform the check with</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="kwd">if</span> <span class="pun">([</span><span class="typ">NSProcessInfo</span><span class="pln"> instancesRespondToSelector</span><span class="pun">:</span><span class="lit">@selector</span><span class="pun">(</span><span class="pln">isOperatingSystemAtLeastVersion</span><span class="pun">:)])</span> <span class="pun">{</span>
  <span class="com">// conditionally check for any version &gt;= iOS 8 using 'isOperatingSystemAtLeastVersion'</span>
<span class="pun">}</span> <span class="kwd">else</span> <span class="pun">{</span>
  <span class="com">// we're on iOS 7 or below</span>
<span class="pun">}</span></code></pre>
<hr />
<p>解法2號：</p>
<p><strong>Best current version</strong>, without need to deal with numeric search within NSString is to define <code>macros</code>(See original answer: <a href="https://stackoverflow.com/a/5337804/492624">Check iPhone iOS Version</a>)</p>
<p>Those macros do exist in github, see: <a href="https://github.com/carlj/CJAMacros/blob/master/CJAMacros/CJAMacros.h" rel="noreferrer">https://github.com/carlj/CJAMacros/blob/master/CJAMacros/CJAMacros.h</a></p>
<p>Like this:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="com">#define</span><span class="pln"> SYSTEM_VERSION_EQUAL_TO</span><span class="pun">(</span><span class="pln">v</span><span class="pun">)</span>                  <span class="pun">([[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">]</span><span class="pln"> compare</span><span class="pun">:</span><span class="pln">v options</span><span class="pun">:</span><span class="typ">NSNumericSearch</span><span class="pun">]</span> <span class="pun">==</span> <span class="typ">NSOrderedSame</span><span class="pun">)</span>
<span class="com">#define</span><span class="pln"> SYSTEM_VERSION_GREATER_THAN</span><span class="pun">(</span><span class="pln">v</span><span class="pun">)</span>              <span class="pun">([[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">]</span><span class="pln"> compare</span><span class="pun">:</span><span class="pln">v options</span><span class="pun">:</span><span class="typ">NSNumericSearch</span><span class="pun">]</span> <span class="pun">==</span> <span class="typ">NSOrderedDescending</span><span class="pun">)</span>
<span class="com">#define</span><span class="pln"> SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO</span><span class="pun">(</span><span class="pln">v</span><span class="pun">)</span>  <span class="pun">([[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">]</span><span class="pln"> compare</span><span class="pun">:</span><span class="pln">v options</span><span class="pun">:</span><span class="typ">NSNumericSearch</span><span class="pun">]</span> <span class="pun">!=</span> <span class="typ">NSOrderedAscending</span><span class="pun">)</span>
<span class="com">#define</span><span class="pln"> SYSTEM_VERSION_LESS_THAN</span><span class="pun">(</span><span class="pln">v</span><span class="pun">)</span>                 <span class="pun">([[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">]</span><span class="pln"> compare</span><span class="pun">:</span><span class="pln">v options</span><span class="pun">:</span><span class="typ">NSNumericSearch</span><span class="pun">]</span> <span class="pun">==</span> <span class="typ">NSOrderedAscending</span><span class="pun">)</span>
<span class="com">#define</span><span class="pln"> SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO</span><span class="pun">(</span><span class="pln">v</span><span class="pun">)</span>     <span class="pun">([[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">]</span><span class="pln"> compare</span><span class="pun">:</span><span class="pln">v options</span><span class="pun">:</span><span class="typ">NSNumericSearch</span><span class="pun">]</span> <span class="pun">!=</span> <span class="typ">NSOrderedDescending</span><span class="pun">)</span></code></pre>
<p>and use them like this:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="kwd">if</span> <span class="pun">(</span><span class="pln">SYSTEM_VERSION_LESS_THAN</span><span class="pun">(@</span><span class="str">"5.0"</span><span class="pun">))</span> <span class="pun">{</span>
    <span class="com">// code here</span>
<span class="pun">}</span>

<span class="kwd">if</span> <span class="pun">(</span><span class="pln">SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO</span><span class="pun">(@</span><span class="str">"6.0"</span><span class="pun">))</span> <span class="pun">{</span>
    <span class="com">// code here</span>
<span class="pun">}</span></code></pre>
<hr />
<h1>Outdated version below</h1>
<p>to get OS version:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="pun">[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">]</span></code></pre>
<p>returns string, which can be turned into int/float via</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="pun">-[</span><span class="typ">NSString</span><span class="pln"> floatValue</span><span class="pun">]</span>
<span class="pun">-[</span><span class="typ">NSString</span><span class="pln"> intValue</span><span class="pun">]</span></code></pre>
<p>like this</p>
<blockquote><p>Both values (floatValue, intValue) will be stripped due to its type, 5.0.1 will become 5.0 or 5 (float or int), for comparing precisely, you will have to separate it to array of INTs check accepted answer here: <a href="https://stackoverflow.com/a/3339787/492624">Check iPhone iOS Version</a></p></blockquote>
<pre class="lang-c prettyprint prettyprinted"><code><span class="typ">NSString</span> <span class="pun">*</span><span class="pln">ver </span><span class="pun">=</span> <span class="pun">[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">];</span>
<span class="typ">int</span><span class="pln"> ver_int </span><span class="pun">=</span> <span class="pun">[</span><span class="pln">ver intValue</span><span class="pun">];</span>
<span class="typ">float</span><span class="pln"> ver_float </span><span class="pun">=</span> <span class="pun">[</span><span class="pln">ver floatValue</span><span class="pun">];</span></code></pre>
<p>and compare like this</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="typ">NSLog</span><span class="pun">(@</span><span class="str">"System Version is %@"</span><span class="pun">,[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">]);</span>
<span class="typ">NSString</span> <span class="pun">*</span><span class="pln">ver </span><span class="pun">=</span> <span class="pun">[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">];</span>
<span class="typ">float</span><span class="pln"> ver_float </span><span class="pun">=</span> <span class="pun">[</span><span class="pln">ver floatValue</span><span class="pun">];</span>
<span class="kwd">if</span> <span class="pun">(</span><span class="pln">ver_float </span><span class="pun">&lt;</span> <span class="lit">5.0</span><span class="pun">)</span> <span class="kwd">return</span> <span class="kwd">false</span><span class="pun">;</span></code></pre>
<p><strong>For Swift 4.0 syntax</strong></p>
<p>below example is just checking if the device is of <code>iOS11</code> or greater version.</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="pln">let systemVersion </span><span class="pun">=</span> <span class="typ">UIDevice</span><span class="pun">.</span><span class="pln">current</span><span class="pun">.</span><span class="pln">systemVersion
</span><span class="kwd">if</span><span class="pln"> systemVersion</span><span class="pun">.</span><span class="pln">cgFloatValue </span><span class="pun">&gt;=</span> <span class="lit">11.0</span> <span class="pun">{</span>
    <span class="com">//"for ios 11"</span>
  <span class="pun">}</span>
<span class="kwd">else</span><span class="pun">{</span>
   <span class="com">//"ios below 11")</span>
  <span class="pun">}</span></code></pre>
<p>&nbsp;</p>
<hr />
<p>解法3號：</p>
<div class="post-text">
<h3>The quick answer …</h3>
<p>As of Swift 2.0, you can use <code>#available</code> in an <code>if</code> or <code>guard</code> to protect code that should only be run on certain systems.</p>
<p><code>if #available(iOS 9, *) {}</code></p>
<p>In Objective-C, you need to check the system version and perform a comparison.</p>
<p><code>[[NSProcessInfo processInfo] operatingSystemVersion]</code> in iOS 8 and above.</p>
<p>As of Xcode 9:</p>
<p><code>if (@available(iOS 9, *)) {}</code></p>
<h2>The full answer …</h2>
<p>In Objective-C, and Swift in rare cases, it&#8217;s better to avoid relying on the operating system version as an indication of device or OS capabilities. There is usually a more reliable method of checking whether a particular feature or class is available.</p>
<p><strong>Checking for the presence of APIs:</strong></p>
<p>For example, you can check if <code>UIPopoverController</code> is available on the current device using <code>NSClassFromString</code>:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="kwd">if</span> <span class="pun">(</span><span class="typ">NSClassFromString</span><span class="pun">(@</span><span class="str">"UIPopoverController"</span><span class="pun">))</span> <span class="pun">{</span>
    <span class="com">// Do something</span>
<span class="pun">}</span></code></pre>
<p>For weakly linked classes, it is safe to message the class, directly. Notably, this works for frameworks that aren&#8217;t explicitly linked as &#8220;Required&#8221;. For missing classes, the expression evaluates to nil, failing the condition:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="kwd">if</span> <span class="pun">([</span><span class="typ">LAContext</span> <span class="kwd">class</span><span class="pun">])</span> <span class="pun">{</span>
    <span class="com">// Do something</span>
<span class="pun">}</span></code></pre>
<p>Some classes, like <code>CLLocationManager</code> and <code>UIDevice</code>, provide methods to check device capabilities:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="kwd">if</span> <span class="pun">([</span><span class="typ">CLLocationManager</span><span class="pln"> headingAvailable</span><span class="pun">])</span> <span class="pun">{</span>
    <span class="com">// Do something</span>
<span class="pun">}</span></code></pre>
<p><strong>Checking for the presence of symbols:</strong></p>
<p>Very occasionally, you must check for the presence of a constant. This came up in iOS 8 with the introduction of <code>UIApplicationOpenSettingsURLString</code>, used to load Settings app via <code>-openURL:</code>. The value didn&#8217;t exist prior to iOS 8. Passing nil to this API will crash, so you must take care to verify the existence of the constant first:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="kwd">if</span> <span class="pun">(&amp;</span><span class="typ">UIApplicationOpenSettingsURLString</span> <span class="pun">!=</span><span class="pln"> NULL</span><span class="pun">)</span> <span class="pun">{</span>
    <span class="pun">[[</span><span class="typ">UIApplication</span><span class="pln"> sharedApplication</span><span class="pun">]</span><span class="pln"> openURL</span><span class="pun">:[</span><span class="pln">NSURL </span><span class="typ">URLWithString</span><span class="pun">:</span><span class="typ">UIApplicationOpenSettingsURLString</span><span class="pun">]];</span>
<span class="pun">}</span></code></pre>
<p><strong>Comparing against the operating system version:</strong></p>
<p>Let&#8217;s assume you&#8217;re faced with the relatively rare need to check the operating system version. For projects targeting iOS 8 and above, <code>NSProcessInfo</code> includes a method for performing version comparisons with less chance of error:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="pun">-</span> <span class="pun">(</span><span class="pln">BOOL</span><span class="pun">)</span><span class="pln">isOperatingSystemAtLeastVersion</span><span class="pun">:(</span><span class="typ">NSOperatingSystemVersion</span><span class="pun">)</span><span class="pln">version</span></code></pre>
<p>Projects targeting older systems can use <code>systemVersion</code> on <code>UIDevice</code>. Apple uses it in their <a href="http://developer.apple.com/iphone/library/samplecode/GLSprite/Listings/Classes_EAGLView_m.html" rel="noreferrer">GLSprite</a> sample code.</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="com">// A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer</span>
<span class="com">// class is used as fallback when it isn't available.</span>
<span class="typ">NSString</span> <span class="pun">*</span><span class="pln">reqSysVer </span><span class="pun">=</span> <span class="pun">@</span><span class="str">"3.1"</span><span class="pun">;</span>
<span class="typ">NSString</span> <span class="pun">*</span><span class="pln">currSysVer </span><span class="pun">=</span> <span class="pun">[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">];</span>
<span class="kwd">if</span> <span class="pun">([</span><span class="pln">currSysVer compare</span><span class="pun">:</span><span class="pln">reqSysVer options</span><span class="pun">:</span><span class="typ">NSNumericSearch</span><span class="pun">]</span> <span class="pun">!=</span> <span class="typ">NSOrderedAscending</span><span class="pun">)</span> <span class="pun">{</span><span class="pln">
    displayLinkSupported </span><span class="pun">=</span><span class="pln"> TRUE</span><span class="pun">;</span>
<span class="pun">}</span></code></pre>
<p>If for whatever reason you decide that <code>systemVersion</code> is what you want, make sure to treat it as an string or you risk truncating the patch revision number (eg. 3.1.2 -&gt; 3.1).</p>
</div>
<div class="grid mb0 fw-wrap ai-start jc-end gs8 gsy">
<div class="grid--cell mr16"></div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/05/how-can-we-programmatically-detect-which-ios-version-is-device-running-on/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Provisioning profile doesn&#8217;t include signing certificate &#8220;iPhone Developer: &#8220;.</title>
		<link>https://stackoverflow.max-everyday.com/2018/05/provisioning-profile-doesnt-include-signing-certificate-iphone-developer/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/05/provisioning-profile-doesnt-include-signing-certificate-iphone-developer/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Tue, 29 May 2018 03:35:53 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[iOS]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2378</guid>

					<description><![CDATA[Build iOS app fail, 遇到 e...]]></description>
										<content:encoded><![CDATA[<p>Build iOS app fail, 遇到 error message:</p>
<blockquote>
<pre>Provisioning profile "xxx" doesn't include signing certificate "iPhone Developer: xxx(xxx)".</pre>
</blockquote>
<p>我们需要清除Mac中的provisioning profile，在keychain 裡刪除相關 的 Keys 和 Certificates，然后再到xcode-preferences-account-detail裡重新點「Download Manually Profiles」。</p>
<p>如果還是build 不過，大多數的情況是，需要给automatically signing 打上勾，就ok了，一键解决。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2380" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/05/Screenshot-2018-05-29-11.08.43.jpg" alt="" width="758" height="513" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/05/Screenshot-2018-05-29-11.08.43.jpg 758w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/05/Screenshot-2018-05-29-11.08.43-600x406.jpg 600w" sizes="(max-width: 758px) 100vw, 758px" /></p>
<p>如果有曾勾選過 &#8220;always allow codesign&#8221;  的按鈕在build app 時，如果還是有問題，則需要重開機一次，才能重新彈出 codesign 的對話框，才能針對新的帳號做授權。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/05/provisioning-profile-doesnt-include-signing-certificate-iphone-developer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SVProgressHUD ld: symbol(s) not found for architecture armv7</title>
		<link>https://stackoverflow.max-everyday.com/2018/05/svprogresshud-ld-symbols-not-found-for-architecture-armv7/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/05/svprogresshud-ld-symbols-not-found-for-architecture-armv7/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Mon, 28 May 2018 09:18:30 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[iOS]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2375</guid>

					<description><![CDATA[在 pod 裡加入 SVProgressHUD,...]]></description>
										<content:encoded><![CDATA[<p>在 pod 裡加入 SVProgressHUD, 一去 import 之後遇到無法 build, error message:</p>
<blockquote>
<pre>ld: symbol(s) not found for architecture armv7</pre>
</blockquote>
<p>使用了 pod update 指令，還是無法解決，訊息如下：</p>
<blockquote>
<pre>CocoaPods 1.5.3 is available.
To update use: `sudo gem install cocoapods`

For more information, see https://blog.cocoapods.org and the CHANGELOG for this version at https://github.com/CocoaPods/CocoaPods/releases/tag/1.5.3

Analyzing dependencies
Pre-downloading: `SVProgressHUD` from `https://github.com/SVProgressHUD/SVProgressHUD.git`
Downloading dependencies
Installing SVProgressHUD 2.2.5 (was 2.2.5)
Generating Pods project
Integrating client project
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

[!] The `EGeofence [Debug]` target overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Target Support Files/Pods-EGeofence/Pods-EGeofence.debug.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

[!] The `EGeofence [Release]` target overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Target Support Files/Pods-EGeofence/Pods-EGeofence.release.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.</pre>
</blockquote>
<hr />
<p>我是在 &#8220;General&#8221; &#8211; &#8220;Linked Frameworks and Libraries&#8221; 裡加入，即可正常 build.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2376" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/05/Screenshot-2018-05-28-17.15.37.jpg" alt="" width="800" height="552" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/05/Screenshot-2018-05-28-17.15.37.jpg 800w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/05/Screenshot-2018-05-28-17.15.37-600x414.jpg 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/05/Screenshot-2018-05-28-17.15.37-768x530.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/05/svprogresshud-ld-symbols-not-found-for-architecture-armv7/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[iOS] App Configuration</title>
		<link>https://stackoverflow.max-everyday.com/2018/05/ios-app-configuration/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/05/ios-app-configuration/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Tue, 22 May 2018 01:15:44 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[iOS]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2352</guid>

					<description><![CDATA[使用 App Configuration 的好處...]]></description>
										<content:encoded><![CDATA[<p>使用 App Configuration 的好處是使用者不用重新輸入資料，可以透過MDM派送相關的設定值給APP.</p>
<hr />
<p>Apple 官方文章：</p>
<p><a href="https://developer.apple.com/library/content/samplecode/sc2279/Introduction/Intro.html">https://developer.apple.com/library/content/samplecode/sc2279/Introduction/Intro.html</a></p>
<h1 id="pageTitle">Managed App Configuration</h1>
<div class="spec_sheet_info_box">
<table class="specbox" cellspacing="0">
<tbody>
<tr>
<td scope="row"><strong>Last Revision:</strong></td>
<td>
<div class="zSharedSpecBoxHeadList">Version 1.0, 2013-10-01<br />
&#8220;ManagedAppConfig&#8221; demonstrates how to implement managed app configuration and feedback support in an iOS app.</div>
</td>
</tr>
<tr>
<td scope="row"><strong>Build Requirements:</strong></td>
<td>
<div class="zSharedSpecBoxHeadList">Xcode 5.0 or later; iOS SDK 7 or later.</div>
</td>
</tr>
<tr>
<td scope="row"><strong>Runtime Requirements:</strong></td>
<td>
<div class="zSharedSpecBoxHeadList">iOS 7 or later.</div>
</td>
</tr>
</tbody>
</table>
</div>
<p>&#8220;ManagedAppConfig&#8221; demonstrates how to implement managed app configuration and feedback support in an iOS application. This functionality allows a Mobile Device Management (MDM) server to push down a dictionary into the managed app&#8217;s NSUserDefaults for the purposes of remotely configuring settings. Also, feedback (such as critical errors) can be written by the app into NSUserDefaults which can then be queried by an MDM server. This is a powerful mechanism enterprise and educational institutions can use to remotely configure managed applications from a centralized MDM server.</p>
<hr />
<p>Apple 官方的 sample code：</p>
<p class="p1">&#8211; (<span class="s1">void</span>)readDefaultsValues {</p>
<p class="p2"><span class="Apple-converted-space">    </span></p>
<p class="p3"><span class="s2"><span class="Apple-converted-space">    </span></span>NSDictionary<span class="s2"> *serverConfig = [[</span>NSUserDefaults standardUserDefaults<span class="s2">] </span>dictionaryForKey<span class="s2">:</span><span class="s3">kConfigurationKey</span><span class="s2">];</span></p>
<p class="p1"><span class="Apple-converted-space">    </span><span class="s4">NSString</span> *serverURLString = serverConfig[<span class="s5">kConfigurationServerURLKey</span>];</p>
<p class="p2"><span class="Apple-converted-space">    </span></p>
<p class="p4"><span class="s2"><span class="Apple-converted-space">    </span></span>// Data coming from MDM server should be validated before use.</p>
<p class="p4"><span class="s2"><span class="Apple-converted-space">    </span></span>// If validation fails, be sure to set a sensible default value as a fallback, even if it is nil.</p>
<p class="p1"><span class="Apple-converted-space">    </span><span class="s1">if</span> (serverURLString &amp;&amp; [serverURLString <span class="s4">isKindOfClass</span>:[<span class="s4">NSString</span> <span class="s4">class</span>]]) {</p>
<p class="p1"><span class="Apple-converted-space">        </span><span class="s1">self</span>.<span class="s5">serverURLUILabel</span>.<span class="s4">text</span> = serverURLString;</p>
<p class="p1"><span class="Apple-converted-space">    </span>} <span class="s1">else</span> {</p>
<p class="p5"><span class="s2"><span class="Apple-converted-space">        </span></span><span class="s6">self</span><span class="s2">.</span><span class="s3">serverURLUILabel</span><span class="s2">.</span><span class="s7">text</span><span class="s2"> = </span>@&#8221;http://foo.bar&#8221;<span class="s2">;</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>}</p>
<p class="p2"><span class="Apple-converted-space">    </span></p>
<p class="p6"><span class="s8"><span class="Apple-converted-space">    </span></span><span class="s7">NSNumber</span><span class="s8"> *disableCloudDocumentSync = serverConfig[</span><span class="s3">kConfigurationDisableCloudDocumentSyncKey</span><span class="s8">];</span></p>
<p class="p1"><span class="Apple-converted-space">    </span><span class="s1">if</span> (disableCloudDocumentSync &amp;&amp; [disableCloudDocumentSync <span class="s4">isKindOfClass</span>:[<span class="s4">NSNumber</span> <span class="s4">class</span>]]) {</p>
<p class="p6"><span class="s8"><span class="Apple-converted-space">        </span></span><span class="s6">self</span><span class="s8">.</span><span class="s3">cloudDocumentSyncEnabledSwitch</span><span class="s8">.</span><span class="s7">on</span><span class="s8"> = ![disableCloudDocumentSync </span><span class="s7">boolValue</span><span class="s8">];</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>} <span class="s1">else</span> {</p>
<p class="p8"><span class="s2"><span class="Apple-converted-space">        </span></span><span class="s6">self</span><span class="s2">.</span>cloudDocumentSyncEnabledSwitch<span class="s2">.</span><span class="s7">on</span><span class="s2"> = </span><span class="s6">YES</span><span class="s2">;</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>}</p>
<p class="p2"><span class="Apple-converted-space">    </span></p>
<p class="p4"><span class="s2"><span class="Apple-converted-space">    </span></span>// Fetch the success and failure count values from NSUserDefaults to display.</p>
<p class="p4"><span class="s2"><span class="Apple-converted-space">    </span></span>// Data validation for feedback values is a good idea, in case the application wrote out an unexpected value.</p>
<p class="p3"><span class="s2"><span class="Apple-converted-space">    </span></span>NSDictionary<span class="s2"> *feedback = [[</span>NSUserDefaults standardUserDefaults<span class="s2">] </span>dictionaryForKey<span class="s2">:</span><span class="s3">kFeedbackKey</span><span class="s2">];</span></p>
<p class="p2"><span class="Apple-converted-space">    </span></p>
<p class="p6"><span class="s8"><span class="Apple-converted-space">    </span></span><span class="s7">NSNumber</span><span class="s8"> *successCount = feedback[</span><span class="s3">kFeedbackSuccessCountKey</span><span class="s8">];</span></p>
<p class="p1"><span class="Apple-converted-space">    </span><span class="s1">if</span> (successCount &amp;&amp; [successCount <span class="s4">isKindOfClass</span>:[<span class="s4">NSNumber</span> <span class="s4">class</span>]]) {</p>
<p class="p6"><span class="s8"><span class="Apple-converted-space">        </span></span><span class="s6">self</span><span class="s8">.</span><span class="s3">successCount</span><span class="s8"> = [successCount </span><span class="s7">unsignedIntegerValue</span><span class="s8">];</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>} <span class="s1">else</span> {</p>
<p class="p6"><span class="s8"><span class="Apple-converted-space">        </span></span><span class="s6">self</span><span class="s8">.</span><span class="s3">successCount</span><span class="s8"> = </span><span class="s9">0</span><span class="s8">;</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>}</p>
<p class="p2"><span class="Apple-converted-space">    </span></p>
<p class="p3"><span class="s2"><span class="Apple-converted-space">    </span></span><span class="s6">self</span><span class="s2">.</span><span class="s3">successUILabel</span><span class="s2">.</span>text<span class="s2"> = [</span>NSString stringWithFormat<span class="s2">:</span><span class="s10">@&#8221;%lu&#8221;</span><span class="s2">, (</span><span class="s6">unsigned</span> <span class="s6">long</span><span class="s2">)</span><span class="s6">self</span><span class="s2">.</span><span class="s3">successCount</span><span class="s2">];</span></p>
<p class="p2"><span class="Apple-converted-space">    </span></p>
<p class="p6"><span class="s8"><span class="Apple-converted-space">    </span></span><span class="s7">NSNumber</span><span class="s8"> *failureCount = feedback[</span><span class="s3">kFeedbackFailureCountKey</span><span class="s8">];</span></p>
<p class="p1"><span class="Apple-converted-space">    </span><span class="s1">if</span> (failureCount &amp;&amp; [failureCount <span class="s4">isKindOfClass</span>:[<span class="s4">NSNumber</span> <span class="s4">class</span>]]) {</p>
<p class="p6"><span class="s8"><span class="Apple-converted-space">        </span></span><span class="s6">self</span><span class="s8">.</span><span class="s3">failureCount</span><span class="s8"> = [failureCount </span><span class="s7">unsignedIntegerValue</span><span class="s8">];</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>} <span class="s1">else</span> {</p>
<p class="p6"><span class="s8"><span class="Apple-converted-space">        </span></span><span class="s6">self</span><span class="s8">.</span><span class="s3">failureCount</span><span class="s8"> = </span><span class="s9">0</span><span class="s8">;</span></p>
<p class="p1"><span class="Apple-converted-space">    </span>}</p>
<p class="p2"><span class="Apple-converted-space">    </span></p>
<p class="p3"><span class="s2"><span class="Apple-converted-space">    </span></span><span class="s6">self</span><span class="s2">.</span><span class="s3">failureUILabel</span><span class="s2">.</span>text<span class="s2"> = [</span>NSString stringWithFormat<span class="s2">:</span><span class="s10">@&#8221;%lu&#8221;</span><span class="s2">, (</span><span class="s6">unsigned</span> <span class="s6">long</span><span class="s2">)</span><span class="s6">self</span><span class="s2">.</span><span class="s3">failureCount</span><span class="s2">];</span></p>
<p class="p1">}</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/05/ios-app-configuration/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Hide back button in tabbar navigation controller</title>
		<link>https://stackoverflow.max-everyday.com/2018/05/hide-back-button-in-tabbar-navigation-controller/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/05/hide-back-button-in-tabbar-navigation-controller/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Thu, 17 May 2018 09:51:59 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[iOS]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2349</guid>

					<description><![CDATA[原本只有使用navigation bar, 使用...]]></description>
										<content:encoded><![CDATA[<p>原本只有使用navigation bar, 使用下面的 code 是正常：</p>
<blockquote>
<pre>[self.navigationItem setHidesBackButton:YES];
[self.navigationItem setTitle:NSLocalizedString(@"Camera",@"")];</pre>
</blockquote>
<p>後來增加了 Tab bar 後，左上角的 back 就出來了，set title 也失敗。類似的失敗畫面：</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2350" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/05/Ykvwd.jpg" alt="" width="640" height="1136" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/05/Ykvwd.jpg 640w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/05/Ykvwd-338x600.jpg 338w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/05/Ykvwd-577x1024.jpg 577w" sizes="(max-width: 640px) 100vw, 640px" /></p>
<p>&nbsp;</p>
<p>解法如下：</p>
<p>You can set all the UITabBar icons in an easy way. You can do this in your <code>viewWillAppear:</code>method:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="pun">[[</span><span class="pln">self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items objectAtIndex</span><span class="pun">:</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> setTitle</span><span class="pun">:</span><span class="typ">NSLocalizedString</span><span class="pun">(@</span><span class="str">"BotonMapas"</span><span class="pun">,</span> <span class="pun">@</span><span class="str">"comment"</span><span class="pun">)];</span>

<span class="pun">[[</span><span class="pln">self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items objectAtIndex</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> setTitle</span><span class="pun">:</span><span class="typ">NSLocalizedString</span><span class="pun">(@</span><span class="str">"BotonRA"</span><span class="pun">,</span> <span class="pun">@</span><span class="str">"comment"</span><span class="pun">)];</span>

<span class="pun">[[</span><span class="pln">self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items objectAtIndex</span><span class="pun">:</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> setTitle</span><span class="pun">:</span><span class="typ">NSLocalizedString</span><span class="pun">(@</span><span class="str">"BotonEstado"</span><span class="pun">,</span> <span class="pun">@</span><span class="str">"comment"</span><span class="pun">)];</span>

<span class="pun">[[</span><span class="pln">self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items objectAtIndex</span><span class="pun">:</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> setTitle</span><span class="pun">:</span><span class="typ">NSLocalizedString</span><span class="pun">(@</span><span class="str">"LabelInfo"</span><span class="pun">,</span> <span class="pun">@</span><span class="str">"comment"</span><span class="pun">)];</span></code></pre>
<blockquote><p><strong><em>Swift 3.1 Solution</em></strong></p></blockquote>
<pre class="lang-c prettyprint prettyprinted"><code><span class="pln">self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">?.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items</span><span class="pun">?[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">title </span><span class="pun">=</span> <span class="typ">NSLocalizedString</span><span class="pun">(</span><span class="str">"BotonMapas"</span><span class="pun">,</span><span class="pln"> comment</span><span class="pun">:</span> <span class="str">"comment"</span><span class="pun">)</span><span class="pln">
self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">?.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items</span><span class="pun">?[</span><span class="lit">1</span><span class="pun">].</span><span class="pln">title </span><span class="pun">=</span> <span class="typ">NSLocalizedString</span><span class="pun">(</span><span class="str">"BotonRA"</span><span class="pun">,</span><span class="pln"> comment</span><span class="pun">:</span> <span class="str">"comment"</span><span class="pun">)</span><span class="pln">
self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">?.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items</span><span class="pun">?[</span><span class="lit">2</span><span class="pun">].</span><span class="pln">title </span><span class="pun">=</span> <span class="typ">NSLocalizedString</span><span class="pun">(</span><span class="str">"BotonEstado"</span><span class="pun">,</span><span class="pln"> comment</span><span class="pun">:</span> <span class="str">"comment"</span><span class="pun">)</span><span class="pln">
self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">?.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items</span><span class="pun">?[</span><span class="lit">3</span><span class="pun">].</span><span class="pln">title </span><span class="pun">=</span> <span class="typ">NSLocalizedString</span><span class="pun">(</span><span class="str">"LabelInfo"</span><span class="pun">,</span><span class="pln"> comment</span><span class="pun">:</span> <span class="str">"comment"</span><span class="pun">)</span></code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/05/hide-back-button-in-tabbar-navigation-controller/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to set tab bar item title programmatically in objective c?</title>
		<link>https://stackoverflow.max-everyday.com/2018/05/how-to-set-tab-bar-item-title-programmatically-in-objective-c/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/05/how-to-set-tab-bar-item-title-programmatically-in-objective-c/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Thu, 17 May 2018 09:48:02 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[iOS]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2347</guid>

					<description><![CDATA[I want to set title to t...]]></description>
										<content:encoded><![CDATA[<p>I want to set title to tab item programatically</p>
<hr />
<p>You can set all the UITabBar icons in an easy way. You can do this in your <code>viewWillAppear:</code>method:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="pun">[[</span><span class="pln">self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items objectAtIndex</span><span class="pun">:</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> setTitle</span><span class="pun">:</span><span class="typ">NSLocalizedString</span><span class="pun">(@</span><span class="str">"BotonMapas"</span><span class="pun">,</span> <span class="pun">@</span><span class="str">"comment"</span><span class="pun">)];</span>

<span class="pun">[[</span><span class="pln">self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items objectAtIndex</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> setTitle</span><span class="pun">:</span><span class="typ">NSLocalizedString</span><span class="pun">(@</span><span class="str">"BotonRA"</span><span class="pun">,</span> <span class="pun">@</span><span class="str">"comment"</span><span class="pun">)];</span>

<span class="pun">[[</span><span class="pln">self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items objectAtIndex</span><span class="pun">:</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> setTitle</span><span class="pun">:</span><span class="typ">NSLocalizedString</span><span class="pun">(@</span><span class="str">"BotonEstado"</span><span class="pun">,</span> <span class="pun">@</span><span class="str">"comment"</span><span class="pun">)];</span>

<span class="pun">[[</span><span class="pln">self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items objectAtIndex</span><span class="pun">:</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> setTitle</span><span class="pun">:</span><span class="typ">NSLocalizedString</span><span class="pun">(@</span><span class="str">"LabelInfo"</span><span class="pun">,</span> <span class="pun">@</span><span class="str">"comment"</span><span class="pun">)];</span></code></pre>
<blockquote><p><strong><em>Swift 3.1 Solution</em></strong></p></blockquote>
<pre class="lang-c prettyprint prettyprinted"><code><span class="pln">self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">?.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items</span><span class="pun">?[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">title </span><span class="pun">=</span> <span class="typ">NSLocalizedString</span><span class="pun">(</span><span class="str">"BotonMapas"</span><span class="pun">,</span><span class="pln"> comment</span><span class="pun">:</span> <span class="str">"comment"</span><span class="pun">)</span><span class="pln">
self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">?.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items</span><span class="pun">?[</span><span class="lit">1</span><span class="pun">].</span><span class="pln">title </span><span class="pun">=</span> <span class="typ">NSLocalizedString</span><span class="pun">(</span><span class="str">"BotonRA"</span><span class="pun">,</span><span class="pln"> comment</span><span class="pun">:</span> <span class="str">"comment"</span><span class="pun">)</span><span class="pln">
self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">?.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items</span><span class="pun">?[</span><span class="lit">2</span><span class="pun">].</span><span class="pln">title </span><span class="pun">=</span> <span class="typ">NSLocalizedString</span><span class="pun">(</span><span class="str">"BotonEstado"</span><span class="pun">,</span><span class="pln"> comment</span><span class="pun">:</span> <span class="str">"comment"</span><span class="pun">)</span><span class="pln">
self</span><span class="pun">.</span><span class="pln">tabBarController</span><span class="pun">?.</span><span class="pln">tabBar</span><span class="pun">.</span><span class="pln">items</span><span class="pun">?[</span><span class="lit">3</span><span class="pun">].</span><span class="pln">title </span><span class="pun">=</span> <span class="typ">NSLocalizedString</span><span class="pun">(</span><span class="str">"LabelInfo"</span><span class="pun">,</span><span class="pln"> comment</span><span class="pun">:</span> <span class="str">"comment"</span><span class="pun">)</span></code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/05/how-to-set-tab-bar-item-title-programmatically-in-objective-c/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
