

<?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/category/ios/feed/" rel="self" type="application/rss+xml" />
	<link>https://stackoverflow.max-everyday.com</link>
	<description>我要當一個豬頭，快樂過每一天</description>
	<lastBuildDate>Mon, 01 Apr 2019 15:51:28 +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>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 fetchpriority="high" 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 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 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="auto, (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="auto, (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>
		<item>
		<title>Shared session vs. session with default configuration</title>
		<link>https://stackoverflow.max-everyday.com/2018/05/shared-session-vs-session-with-default-configuration/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/05/shared-session-vs-session-with-default-configuration/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Thu, 17 May 2018 06:52:09 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[iOS]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2342</guid>

					<description><![CDATA[最近遇到一個問題，就是透過 NSURLSessi...]]></description>
										<content:encoded><![CDATA[<p>最近遇到一個問題，就是透過 NSURLSession 的 NSURLSessionDataTask 送 post 到第二台 server ，某種特定的架構下（例如連proxy 或 tunnel)，會讓第二台 server 完全連不上。</p>
<hr />
<div class="post-text">
<p>What are the differences between the two <code>session</code> objects created in these two different ways:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="typ">NSURLSession</span> <span class="pun">*</span><span class="pln">session </span><span class="pun">=</span> <span class="pun">[</span><span class="typ">NSURLSession</span><span class="pln"> sharedSession</span><span class="pun">];</span></code></pre>
<p>and</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="typ">NSURLSessionConfiguration</span> <span class="pun">*</span><span class="pln">configuration </span><span class="pun">=</span> <span class="pun">[</span><span class="typ">NSURLSessionConfiguration</span><span class="pln"> defaultSessionConfiguration</span><span class="pun">];</span>
<span class="typ">NSURLSession</span> <span class="pun">*</span><span class="pln">session </span><span class="pun">=</span> <span class="pun">[</span><span class="typ">NSURLSession</span><span class="pln"> sessionWithConfiguration</span><span class="pun">:</span><span class="pln">configuration</span><span class="pun">];</span></code></pre>
</div>
<hr />
<p>As you&#8217;re using them, they&#8217;re functionally very similar. But using <code>sharedSession</code> doesn&#8217;t give you the ability to customize the <code>NSURLSessionConfiguration</code> (e.g. tweak the cache, custom headers, etc.) nor use the delegate-based rendition of <code>NSURLSession</code>.</p>
<p>說明：一般的情況下使用 sharedSession 應該就ok, 問題是出問題之後，請改用 NSURLSessionConfiguration.</p>
<hr />
<p><a href="https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSessionConfiguration_class/Reference/Reference.html#//apple_ref/occ/cl/NSURLSessionConfiguration" rel="nofollow">NSURLSessionConfiguration</a></p>
<p>session with basic set of properties that control various policies on a sessionwide basis. These properties are set on a session at the time of its creation and cannot be changed later. If you need to change these policy properties, create a new session with a modified session configuration.</p>
<p><a href="https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/Introduction/Introduction.html#//apple_ref/occ/clm/NSURLSession/sharedSession" rel="nofollow">sharedSession</a></p>
<p>Returns a shared singleton session object.</p>
<p>Please review Apple Documents first as these are the source of very information.</p>
<hr />
<p>所以，每次都去 create new session 可以避免某些問題！</p>
<p>使用 proxy 的範例如下：</p>
<p>It turns out, the dictionary keys you want are the Stream variants, they are the ones that resolve down to &#8220;HTTPProxy&#8221; and such:</p>
<pre class="default prettyprint prettyprinted"><code><span class="typ">NSString</span><span class="pun">*</span><span class="pln"> proxyHost </span><span class="pun">=</span> <span class="pun">@</span><span class="str">"myProxyHost.com"</span><span class="pun">;</span>
<span class="typ">NSNumber</span><span class="pun">*</span><span class="pln"> proxyPort </span><span class="pun">=</span> <span class="pun">[</span><span class="typ">NSNumber</span><span class="pln"> numberWithInt</span><span class="pun">:</span> <span class="lit">12345</span><span class="pun">];</span>

<span class="com">// Create an NSURLSessionConfiguration that uses the proxy</span>
<span class="typ">NSDictionary</span> <span class="pun">*</span><span class="pln">proxyDict </span><span class="pun">=</span> <span class="pun">@{</span>
    <span class="pun">@</span><span class="str">"HTTPEnable"</span>  <span class="pun">:</span> <span class="pun">[</span><span class="typ">NSNumber</span><span class="pln"> numberWithInt</span><span class="pun">:</span><span class="lit">1</span><span class="pun">],</span>
    <span class="pun">(</span><span class="typ">NSString</span> <span class="pun">*)</span><span class="pln">kCFStreamPropertyHTTPProxyHost  </span><span class="pun">:</span><span class="pln"> proxyHost</span><span class="pun">,</span>
    <span class="pun">(</span><span class="typ">NSString</span> <span class="pun">*)</span><span class="pln">kCFStreamPropertyHTTPProxyPort  </span><span class="pun">:</span><span class="pln"> proxyPort</span><span class="pun">,</span>

    <span class="pun">@</span><span class="str">"HTTPSEnable"</span> <span class="pun">:</span> <span class="pun">[</span><span class="typ">NSNumber</span><span class="pln"> numberWithInt</span><span class="pun">:</span><span class="lit">1</span><span class="pun">],</span>
    <span class="pun">(</span><span class="typ">NSString</span> <span class="pun">*)</span><span class="pln">kCFStreamPropertyHTTPSProxyHost </span><span class="pun">:</span><span class="pln"> proxyHost</span><span class="pun">,</span>
    <span class="pun">(</span><span class="typ">NSString</span> <span class="pun">*)</span><span class="pln">kCFStreamPropertyHTTPSProxyPort </span><span class="pun">:</span><span class="pln"> proxyPort</span><span class="pun">,</span>
<span class="pun">};</span>

<span class="typ">NSURLSessionConfiguration</span> <span class="pun">*</span><span class="pln">configuration </span><span class="pun">=</span> <span class="pun">[</span><span class="typ">NSURLSessionConfiguration</span><span class="pln"> ephemeralSessionConfiguration</span><span class="pun">];</span><span class="pln">
configuration</span><span class="pun">.</span><span class="pln">connectionProxyDictionary </span><span class="pun">=</span><span class="pln"> proxyDict</span><span class="pun">;</span>

<span class="com">// Create a NSURLSession with our proxy aware configuration</span>
<span class="typ">NSURLSession</span> <span class="pun">*</span><span class="pln">session </span><span class="pun">=</span> <span class="pun">[</span><span class="typ">NSURLSession</span><span class="pln"> sessionWithConfiguration</span><span class="pun">:</span><span class="pln">configuration </span><span class="kwd">delegate</span><span class="pun">:</span><span class="kwd">self</span><span class="pln"> delegateQueue</span><span class="pun">:[</span><span class="typ">NSOperationQueue</span><span class="pln"> mainQueue</span><span class="pun">]];</span>

<span class="com">// Form the request</span>
<span class="typ">NSURLRequest</span> <span class="pun">*</span><span class="pln">request </span><span class="pun">=</span> <span class="pun">[</span><span class="typ">NSURLRequest</span><span class="pln"> requestWithURL</span><span class="pun">:[</span><span class="pln">NSURL </span><span class="typ">URLWithString</span><span class="pun">:@</span><span class="str">"https://www.google.com?2"</span><span class="pun">]];</span>

<span class="com">// Dispatch the request on our custom configured session</span>
<span class="typ">NSURLSessionDataTask</span> <span class="pun">*</span><span class="pln">task </span><span class="pun">=</span> <span class="pun">[</span><span class="pln">session dataTaskWithRequest</span><span class="pun">:</span><span class="pln">request completionHandler</span><span class="pun">:</span>
                              <span class="pun">^(</span><span class="typ">NSData</span> <span class="pun">*</span><span class="pln">data</span><span class="pun">,</span> <span class="typ">NSURLResponse</span> <span class="pun">*</span><span class="pln">response</span><span class="pun">,</span> <span class="typ">NSError</span> <span class="pun">*</span><span class="pln">error</span><span class="pun">)</span> <span class="pun">{</span>
                                  <span class="typ">NSLog</span><span class="pun">(@</span><span class="str">"NSURLSession got the response [%@]"</span><span class="pun">,</span><span class="pln"> response</span><span class="pun">);</span>
                                  <span class="typ">NSLog</span><span class="pun">(@</span><span class="str">"NSURLSession got the data [%@]"</span><span class="pun">,</span><span class="pln"> data</span><span class="pun">);</span>
                              <span class="pun">}];</span>

<span class="typ">NSLog</span><span class="pun">(@</span><span class="str">"Lets fire up the task!"</span><span class="pun">);</span>
<span class="pun">[</span><span class="pln">task resume</span><span class="pun">];</span></code></pre>
<hr />
<p>如果直接使用上面的 code 可能會遇到這一個 warning:</p>
<blockquote>
<pre>Sending 'ViewController *const __strong' to parameter of incompatible type 'id&lt;NSURLSessionDelegate&gt; _Nullable'</pre>
</blockquote>
<p>解法：</p>
<p>Confirm <code>&lt;NSURLSessionDelegate&gt;</code> in your header file and it will solve the issue i think,</p>
<pre class="lang-c prettyprint prettyprinted"><code>  <span class="lit">@interface</span> <span class="typ">ViewController</span> <span class="pun">:</span> <span class="typ">UIViewController</span> <span class="pun">&lt;</span><span class="typ">NSURLSessionDataDelegate</span><span class="pun">&gt;</span></code></pre>
<p>It is because you are setting delegate to self in <code>NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];</code> So it&#8217;s requires to confirm <code>NSURLSessionDataDelegate</code> protocol.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/05/shared-session-vs-session-with-default-configuration/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
