<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[就哥的技术流]]></title> 
<atom:link href="https://codeios.cn/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[Talk is cheap. Show me the code.]]></description>
<link>https://codeios.cn/</link>
<language>zh-cn</language>
<generator>www.emlog.net</generator>
<item>
    <title>iOS 无开发者账号打ipa包</title>
    <link>https://codeios.cn/?post=8</link>
    <description><![CDATA[<p>xcrun -sdk iphoneos -v PackageApplication ./xxx.app -o ~/Desktop/xxx.ipa<br />
xcrun -sdk iphoneos  PackageApplication -v ./xxx.app -o ~/Desktop/test.ipa</p>]]></description>
    <pubDate>Thu, 10 Apr 2025 15:23:46 +0800</pubDate>
    <dc:creator>CodeiOS</dc:creator>
    <guid>https://codeios.cn/?post=8</guid>
</item>
<item>
    <title>iOS 微信universalLink</title>
    <link>https://codeios.cn/?post=7</link>
    <description><![CDATA[<p>universalLink<br />
universalLink是iOS9出现的东西，可以快速的通过打开一个Https链接来直接启动您的APP</p>
<p>配置<br />
1.域名网站支持https<br />
2.将此apple-app-site-association上传到网站根目录</p>
<p>开启Associated Domains服务<br />
在xcode工程的Capabilities -&gt; Associated Domains中添加跳转域名，域名的格式为：<br />
applinks:www.example.com</p>
<p>universalLink.jpg<br />
服务器必须支持SSL<br />
Domains可以添加多个<br />
Domains必须以applinks: 开头</p>
<p>配置apple-app-site-association文件<br />
{<br />
&quot;applinks&quot;: {<br />
&quot;apps&quot;: [],<br />
&quot;details&quot;: [<br />
{<br />
&quot;appID&quot;: &quot;9JA89QQLNQ.com.apple.wwdc&quot;,<br />
&quot;paths&quot;: [&quot;iosapp/&quot;,&quot;iosapp/<em>&quot;,&quot;</em>&quot;]<br />
}<br />
]<br />
}<br />
}<br />
apps项必须对应一个空的数组<br />
details项对应一个字典的数组<br />
appID对应项由前缀和ID两部分组成,可以在developer中的Identifiers→AppIDs中点击对应的App ID查看</p>
<p>paths对应域名中的path，用于过滤可以跳转到App的链接，支持通配符*，?以及NOT进行匹配，匹配的优先级是从左至右依次降低</p>
<p>配置上path，同一公司可能多款app有次需求，不同的path有益于后期的扩展</p>
<p>把配置好的JSON文件上传到服务器中该域名的根目录下，也就是说，我们可以用GET请求可以获取到这个apple-app-association文件。(APP第一次安装，苹果会进服务器下载文件，调试的时候建议删除以后再安装)</p>
<p>Appdelegate增加如下代码</p>
<p>[WXApi registerApp:@&quot;wx_example&quot; universalLink:@&quot;<a href="https://www.example.com">https://www.example.com</a>&quot;];</p>
<ul>
<li>(BOOL)application:(UIApplication <em>)application continueUserActivity:(NSUserActivity </em>)userActivity restorationHandler:(void (^)(NSArray&lt;id<UIUserActivityRestoring>&gt; * _Nullable))restorationHandler {<br />
return [WXApi handleOpenUniversalLink:userActivity delegate:self];<br />
}</li>
</ul>]]></description>
    <pubDate>Thu, 10 Apr 2025 15:23:22 +0800</pubDate>
    <dc:creator>CodeiOS</dc:creator>
    <guid>https://codeios.cn/?post=7</guid>
</item>
<item>
    <title>macOS Mojave 10.14.6 CocoaPods的安装</title>
    <link>https://codeios.cn/?post=6</link>
    <description><![CDATA[<p>准备<br />
首先要检查Mac是否安装了rvm。打开终端，输入指令 rvm -v<br />
用rvm安装ruby环境<br />
检查更新RubyGems(越新越好)<br />
检查ruby源并移除<br />
安装CocoaPods(sudo 表示管理员执行指令，需要输入密码的)<br />
一.首先要检查Mac是否安装了rvm。打开终端，输入指令 rvm -v<br />
1.安装rvm<br />
curl -L get.rvm.io | bash -s stable<br />
2.指定源<br />
source ~/.rvm/scripts/rvm<br />
3.查看版本确认是否安装成功<br />
rvm -v<br />
4.列出所有指定源里的ruby版本<br />
rvm list known</p>
<p>cocoapoads1.png<br />
二.用rvm安装ruby环境<br />
注意，当ruby版本低于2.2.2时，安装cocoapods会报错，可通过指令 ruby -v检查当前版本。如果版本低于2.2.2，啥也不要说快更新一下。</p>
<p>输入指令：</p>
<p>rvm install 2.5.1<br />
(如上图中，最新版本就是2.5.1)，然后根据提示按enter键。</p>
<p>安装完成之后输入指令</p>
<p>rvm list<br />
查看ruby版本，看看是否安装成功</p>
<p>三.检查更新RubyGems(Ruby1.9.1 以后的版本自带RubyGems)<br />
RubyGems是一个方便而强大的Ruby程序包管理器，Ruby的第三方插件是用gem方式来管理，非常容易发布和共享，一个简单的命令就可以安装上第三方的扩展库。</p>
<p>建议RubyGems升级到2.6.x以上</p>
<p>查看RubyGems的版本用指令:</p>
<p>gem -v<br />
更新RubyGems的版本指令:</p>
<p>gem update --system<br />
四.检查ruby源并移除<br />
先是检查ruby源，</p>
<p>gem sources -l<br />
出现结果如下:</p>
<p><strong><em> CURRENT SOURCES </em></strong></p>
<p><a href="https://rubygems.org/">https://rubygems.org/</a></p>
<p>移除</p>
<p>gem sources --remove <a href="https://rubygems.org/">https://rubygems.org/</a><br />
替换添加国内的镜像源，之所以要添加国内的ruby-china源，是因为taobao源已经停止维护了，所以此处替换的是ruby-china源，且尽量确保只有一个。输入指令gem sources --add <a href="https://gems.ruby-china.com">https://gems.ruby-china.com</a></p>
<p>指令:</p>
<p>gem sources --add <a href="https://gems.ruby-china.com">https://gems.ruby-china.com</a></p>
<p>cocoapoads2.png<br />
五.安装CocoaPods(sudo 表示管理员执行指令，需要输入密码的)<br />
sudo gem install cocoapods<br />
成功后</p>
<p>pod setup<br />
如果遇到pod setup没反应,请参考下面文章</p>
<p>1.如果你同事电脑上有安装好,你其实可以从你同事电脑上拷贝过来,直接放到~/.cocoapods/repos该路径就OK了.<br />
2.如果你身边没有装好的CocoaPods的朋友,可以访问这个链接<br />
<a href="https://github.com/CocoaPods/Specs">https://github.com/CocoaPods/Specs</a> (github所有的第三方开源库的Podspec文件都托管在这里,这也是你pod setup所要下载的).<br />
选择Download ZIP,用你的浏览器或者迅雷什么的下载<br />
解压后为Specs-master</p>
<p>Specs-master改名为master放在 ~/.cocoapods/repos 路径即可.</p>
<p>~/.cocoapods/repos 这个路径是在执行 pod setup生成的,所以电脑无法前往此路径是,建议先pod setup下,然后关闭掉即可生成路径.</p>]]></description>
    <pubDate>Thu, 10 Apr 2025 15:22:53 +0800</pubDate>
    <dc:creator>CodeiOS</dc:creator>
    <guid>https://codeios.cn/?post=6</guid>
</item>
<item>
    <title>iOS Jenkins 自动打包上传至蒲公英 持续集成</title>
    <link>https://codeios.cn/?post=5</link>
    <description><![CDATA[<ol>
<li>安装JAVA环境<br />
Jenkins 是一个用Java编写的持续集成工具，依赖于Java，所以在安装Jenkins前，需要先安装Java环境。</li>
</ol>
<p>首先，检查电脑是否已经安装有环境。</p>
<p>在终端输入命令：java -version。</p>
<p>如果已经安装，则会打印java版本。</p>
<p>image<br />
否则，会说没有安装</p>
<p>如果没有安装Java环境的话，需要去官网下载JAVA JDK（注意是JDK，不是JRE）。在下载前注意勾选上方的 Accept License Agreement。否则，无法下载。</p>
<p>image</p>
<ol start="2">
<li>安装Jenkins</li>
<li>使用Homebrew的命令行进行安装<br />
在终端输入命令：brew install jenkins</li>
</ol>
<p>如果没有安装Homebrew，则需要先安装。</p>
<p>【Homebrew 安装方法】：前往Homebrew官网，直接拷贝官网页面上的命令，在终端运行即可。</p>
<ol start="2">
<li>
<p>启动jenkins，等待其安装完毕。<br />
在终端输入命令：jenkins</p>
</li>
<li>
<p>浏览器输入http://localhost:8080并进行访问。</p>
</li>
<li>
<p>安装插件<br />
Xcode integration<br />
GIT plugin<br />
GitLab Plugin<br />
Gitlab Hook Plugin<br />
Keychains and Provisioning Profiles Management</p>
</li>
</ol>
<p>首页的左侧，点击系统管理<br />
在系统管理界面找到插件管理<br />
在管理插件界面，切换到可选插件选项卡，在右上角的过滤搜索里面输入我们要安装的插件名称，回车。找到我们需要的插件，打勾，点击直接安装。</p>
<ol start="3">
<li>项目新建和设置<br />
点击首页的创建一个新任务<br />
选择构建一个自由风格的软件项目。PS：这里的任务名称还是写我们的APP项目名比较好。后面的配置会用到这个任务名称。</li>
</ol>
<p>image</p>
<ol start="4">
<li>配置项目</li>
<li>General 参数。<br />
切换到General选项。勾选“丢弃旧的构建”。</li>
</ol>
<p>设置包（即构建）的保留天数，以及最大保留个数。这个主要按照需要做设置</p>
<p>“丢弃旧的构建”不勾选也可以。</p>
<p>image</p>
<ol start="2">
<li>源码管理<br />
切换到源码管理选项。</li>
</ol>
<p>输入我们要打包的项目的Git地址。最好SSH的。</p>
<p>填写我们要打包的分支（branch）。</p>
<p>点击Add按钮，Add按钮会弹出一个按钮Jenkins，点击它，进行添加SSH key</p>
<p>image</p>
<ol start="3">
<li>构建触发器<br />
切换到“构建触发器”选项。</li>
</ol>
<p>这里只设置最常用的Poll SCM。切换到“构建触发器”，勾选“Poll SCM”。</p>
<p>H/20 <em> </em> <em> </em>表示：每20分支构建一次。</p>
<p>image</p>
<ol start="4">
<li>构建环境</li>
</ol>
<p>image</p>
<p>image</p>
<ol start="5">
<li>Excute shell<br />
切换到“构建”选项</li>
</ol>
<p>勾选“增加构建步骤”里面的Excute shell。</p>
<p>添加命令到Comman上。</p>
<p>image<br />
打包</p>
<h1>!/bin/bash -l</h1>
<p>export LANG=en_US.UTF-8<br />
export LANGUAGE=en_US.UTF-8<br />
export LC_ALL=en_US.UTF-8  </p>
<p>pod install --verbose --no-repo-update </p>
<h1>打包环境</h1>
<h1>config=&quot;Release&quot;</h1>
<p>config=&quot;Debug&quot;</p>
<h1>构建</h1>
<h1>!/bin/bash -l</h1>
<p>export LANG=en_US.UTF-8<br />
export LANGUAGE=en_US.UTF-8<br />
export LC_ALL=en_US.UTF-8  </p>
<p>pod install --verbose --no-repo-update </p>
<h1>打包环境 (核心)</h1>
<h1>config=&quot;Release&quot;</h1>
<p>config=&quot;Debug&quot;</p>
<h1>构建</h1>
<p>xcodebuild -archivePath &quot;/Users/(用户名)/.jenkins/workspace/iOS-lighthouse-ci_beta/build/Debug-iphoneos/(项目名称).xcarchive&quot; -workspace (项目名称).xcworkspace -sdk iphoneos -scheme &quot;(项目名称)&quot; -configuration ${config} archive</p>
<p>xcodebuild -exportArchive -archivePath &quot;/Users/(用户名)/.jenkins/workspace/iOS-lighthouse-ci_beta/build/Debug-iphoneos/(项目名称).xcarchive&quot; -configuration ${config} -exportPath &quot;/Users/(用户名)/.jenkins/workspace/iOS-lighthouse-ci_beta/build/(项目名称)_debug&quot; -exportOptionsPlist '/Users/(用户名)/.jenkins/workspace/iOS-lighthouse-ci_beta/build/ExportOptions.plist' -allowProvisioningUpdates</p>
<p>上传至蒲公英平台</p>
<h1>通过api上传到蒲公英当中</h1>
<p>echo &quot;===上传至蒲公英平台===&quot;</p>
<h1>蒲公英userkey</h1>
<p>pgyerUserKey=&quot;userkey&quot;</p>
<h1>蒲公英apiKey</h1>
<p>pgyerApiKey=&quot;apiKey&quot;</p>
<h1>指定ipa输出地址</h1>
<p>project_path=$(pwd)</p>
<h1>指定项目名</h1>
<p>project_name=&quot;项目名&quot;</p>
<h1>描述信息</h1>
<p>des=<code>cat ci-beta-description.txt</code><br />
echo &quot;des:+$des&quot;<br />
packageTime=&quot;打包时间：【<code>date \"+%Y-%m-%d %H:%M:%S\"</code>】---&quot;<br />
echo $packageTime</p>
<p>ipa_path=&quot;${project_path}/build/(项目名称)_debug&quot;</p>
<p>if [ -e ${ipa_path}/${project_name}.ipa ]; then</p>
<pre><code>RESULT=$(curl -F "_api_key=${pgyerApiKey}" \
-F "file=@${ipa_path}/${project_name}.ipa" \
-F "buildInstallType=2" \
-F "buildPassword=1230" \
-F "buildUpdateDescription=${packageTime}${des}" \
https://www.pgyer.com/apiv2/app/upload)

# echo ${RESULT}
if [ "${RESULT}" ]; then
    echo "===完成蒲公英平台上传==="
else
    echo "===上传蒲公英平台失败==="
fi
# open ${ipa_path}</code></pre>
<p>else<br />
echo &quot;===上传蒲公英平台失败===&quot;<br />
fi</p>
<ol start="5">
<li>Keychains and Provisioning Profiles Management<br />
login.keychain 文件路径 /Users/(用户名)/Library/Keychains</li>
</ol>
<p>image</p>
<p>image<br />
问题<br />
error: Couldn't load -exportOptionsPlist: The file “ExportOptions.plist” couldn’t be opened because there is no such file.<br />
Error Domain=NSCocoaErrorDomain Code=260 &quot;The file “ExportOptions.plist” couldn’t be opened because there is no such file.&quot; UserInfo={NSFilePath=/Users/ageren/.jenkins/workspace/Vol_Chat/build/ExportOptions.plist, NSUnderlyingError=0x7fb479178710 {Error Domain=NSPOSIXErrorDomain Code=2 &quot;No such file or directory&quot;}}<br />
解决</p>
<p>在/Users/(用户名)/.jenkins/workspace/(项目名称)/build/路径新建ExportOptions.plist文件</p>
<p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;<a href="http://www.apple.com/DTDs/PropertyList-1.0.dtd">http://www.apple.com/DTDs/PropertyList-1.0.dtd</a>&quot;&gt;</p>
<plist version="1.0">
<dict>
    <key>compileBitcode</key>
    <false/>
    <key>method</key>
    <string>development</string>
    <key>provisioningProfiles</key>
    <dict>
        <key>(APP bundle ID)</key>
        <string>(描述文件名称)</string>
    </dict>
    <key>signingCertificate</key>
    <string>iPhone Developer</string>
    <key>signingStyle</key>
    <string>manual</string>
    <key>stripSwiftSymbols</key>
    <true/>
    <key>teamID</key>
    <string>(组织编号)</string>
    <key>thinning</key>
    <string>&lt;none&gt;</string>
</dict>
</plist>]]></description>
    <pubDate>Thu, 10 Apr 2025 15:22:18 +0800</pubDate>
    <dc:creator>CodeiOS</dc:creator>
    <guid>https://codeios.cn/?post=5</guid>
</item>
<item>
    <title>Mac开发 - NSBundle 加载资源文件</title>
    <link>https://codeios.cn/?post=4</link>
    <description><![CDATA[<p>熟悉iOS开发的都知道加载资源直接就可以通过pathForResource:加载资源文件, 但是在Mac端加载出来是nil, 原因是Build Phases -&gt; Copy Bundle Resources中没有该资源文件, 只需将文件添加进去即可</p>]]></description>
    <pubDate>Thu, 10 Apr 2025 15:21:52 +0800</pubDate>
    <dc:creator>CodeiOS</dc:creator>
    <guid>https://codeios.cn/?post=4</guid>
</item>
<item>
    <title>iOS 导航栏的正确隐藏方式欢迎使用CodeiOS</title>
    <link>https://codeios.cn/?post=1</link>
    <description><![CDATA[<p>第一种做法<br />
注意这里一定要用动画的方式隐藏导航栏,这样在使用滑动返回手势的时候效果最好,和上面动图一致.这样做有一个缺点就是在切换tabBar的时候有一个导航栏向上消失的动画.</p>
<ul>
<li>
<p>(void)viewWillAppear:(BOOL)animated {<br />
[super viewWillAppear:animated];</p>
<p>[self.navigationController setNavigationBarHidden:YES animated:YES];<br />
}</p>
</li>
<li>
<p>(void)viewWillDisappear:(BOOL)animated {<br />
[super viewWillDisappear:animated];</p>
<p>[self.navigationController setNavigationBarHidden:NO animated:YES];<br />
}<br />
第二种做法<br />
设置self为导航控制器的代理,实现代理方法,在将要显示控制器中设置导航栏隐藏和显示,使用这种方式不仅完美切合滑动返回手势,同时也解决了切换tabBar的时候,导航栏动态隐藏的问题.</p>
</li>
<li>
<p>(void)viewDidLoad {<br />
[super viewDidLoad];</p>
<p>// 设置导航控制器的代理为self<br />
self.navigationController.delegate = self;<br />
}</p>
</li>
</ul>
<h1>pragma mark - UINavigationControllerDelegate</h1>
<p>// 将要显示控制器</p>
<ul>
<li>
<p>(void)navigationController:(UINavigationController <em>)navigationController willShowViewController:(UIViewController </em>)viewController animated:(BOOL)animated {<br />
// 判断要显示的控制器是否是自己<br />
BOOL isShowHomePage = [viewController isKindOfClass:[self class]];</p>
<p>[self.navigationController setNavigationBarHidden:isShowHomePage animated:YES];<br />
}</p>
</li>
</ul>]]></description>
    <pubDate>Wed, 04 Dec 2024 19:54:20 +0800</pubDate>
    <dc:creator>CodeiOS</dc:creator>
    <guid>https://codeios.cn/?post=1</guid>
</item></channel>
</rss>