我正在尝试使用CryptoExercise的SecKeyWrapper addPeerPublicKey:keyBits:方法将一个RSA公钥添加到我的iPhone的钥匙串中.这种方法的逻辑是它首先尝试将密钥添加到钥匙串,如果它已经存在,(sanityCheck==errSecDuplicateItem)它会尝试通过调用从钥匙串中检索此密钥SecKeyItemCopyMatching().
这正是在我的情况下发生的事情:密钥已经在钥匙串中,所以调用SecKeyItemAdd() returns errSecDuplicateItem.
然后它尝试检索现有的键,但SecKeyItemCopyMatching() returns 0(表示没有错误),但第二个参数(peerKeyRef)仍然是零.
这怎么可能?这有什么问题?
以下是[SecKeyWrapper addPeerPublicKey:keyBits:]来自CryptoExercise示例的代码供参考:
- (SecKeyRef)addPeerPublicKey:(NSString *)peerName keyBits:(NSData *)publicKey {
OSStatus sanityCheck = noErr;
SecKeyRef peerKeyRef = NULL;
CFTypeRef persistPeer = NULL;
LOGGING_FACILITY( peerName != nil, @"Peer name parameter is nil." );
LOGGING_FACILITY( publicKey != nil, @"Public key parameter is nil." );
NSData *peerTag = [[NSData alloc] initWithBytes:(const void *) [peerName UTF8String] length:[peerName length]];
NSMutableDictionary *peerPublicKeyAttr = [[NSMutableDictionary alloc] init]; …Run Code Online (Sandbox Code Playgroud) 当我尝试运行我的Grails 2.4.1应用程序时,我得到以下异常,我不太明白.
| Running Grails application
objc[15346]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.
| Error 2014-06-19 16:54:40,048 [localhost-startStop-1] ERROR context.GrailsContextLoaderListener - Error initializing the application: org/hibernate/event/spi/PreLoadEventListener
Message: org/hibernate/event/spi/PreLoadEventListener
Line | Method
->> 800 | defineClass in java.lang.ClassLoader
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用kSoap2和EasyWSDL将我的Android应用程序连接到受TLS保护的SOAP端点,但我收到以下异常:
W/System.err: javax.net.ssl.SSLHandshakeException: Connection closed by peer
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:351)
at com.android.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:192)
at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:149)
W/System.err: at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:112)
at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:184)
at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:258)
at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(Unknown Source:0)
at org.ksoap2.transport.HttpsServiceConnectionSE.openOutputStream(HttpsServiceConnectionSE.java:127)
at com.easywsdl.exksoap2.mtom.MTOMTransportImplementation.sendData(MTOMTransportImplementation.java:65)
at com.easywsdl.exksoap2.transport.AdvancedHttpsTransportSE.sendData(AdvancedHttpsTransportSE.java:39)
at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:184)
at com.easywsdl.exksoap2.transport.AdvancedHttpsTransportSE.call(AdvancedHttpsTransportSE.java:51)
Run Code Online (Sandbox Code Playgroud)
以下是我配置传输的方式:
@Override
protected Transport createTransport() {
Transport transport = super.createTransport();
try {
if(transport instanceof HttpsTransportSE) {
HttpsTransportSE httpsTransport = (HttpsTransportSE)transport;
if(httpsTransport.getServiceConnection() instanceof HttpsServiceConnectionSE) {
HttpsServiceConnectionSE httpsServiceConnection = (HttpsServiceConnectionSE)httpsTransport.getServiceConnection();
httpsServiceConnection.setSSLSocketFactory(getSSLSocketFactory()); …Run Code Online (Sandbox Code Playgroud) kSOAP2拒绝解析我得到的SOAP响应,因为它包含2个具有相同id值的元素.问题是在XML Schema中,这个id是anyURI类型,而不是xs:ID,所以它没有任何unicity语义:https: //github.com/oehf/ipf/blob/8a22c51a47fab1af6fea7da81f9e5d8de636e225/commons/ihe /xds/src/main/resources/wsdl/schema/ebRS30/rim.xsd#L103
这是kSOAP2中的错误还是有办法禁用该异常?
我向开始目的地添加了一个可为空的参数:
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_graph"
app:startDestination="@id/startDest">
<fragment android:id="@+id/startDest"
android:name="com.myapp.MyStartFragment"
android:label="Start"
tools:layout="@layout/fragment_start">
<argument
android:name="dataObject"
app:argType="com.myapp.MyDataObject"
android:defaultValue="@null"
app:nullable="true"/>
...
</fragment>
...
</navigation>
Run Code Online (Sandbox Code Playgroud)
但是当我加载我的应用程序时,我收到以下异常:
java.lang.IllegalStateException: Fragment MyStartFragment{a4ffd1f (ca52d4dc-ff36-4a93-8ebf-f11af7b7d5aa) id=0x7f080145} has null arguments
at com.myapp.MyStartFragment$$special$$inlined$navArgs$1.invoke(FragmentNavArgsLazy.kt:42)
at com.myapp.MyStartFragment$$special$$inlined$navArgs$1.invoke(Unknown Source:0)
at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:44)
at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:34)
at com.myapp.MyStartFragment.getArgs(Unknown Source:27)
at com.myapp.MyStartFragment.onAttach(MyStartFragment.kt:85)
Run Code Online (Sandbox Code Playgroud)
而异常是由 MyStartFragment 中的这段代码触发的:
private val args: MyStartFragmentArgs by navArgs()
override fun onAttach(context: Context) {
super.onAttach(context)
val title = if(this.args.dataObject == null) getString(R.string.start_list_title) else this.args.dataObject!!.name
...
}
Run Code Online (Sandbox Code Playgroud)
这是 MyDataObject 的代码:
@Parcelize
data class MyDataObject ( …Run Code Online (Sandbox Code Playgroud) 我在使用 DynamicLink 时遇到问题。如果在 iPhone 上安装了应用程序,动态链接会打开带有深层链接的 iOS 应用程序,一切正常。但如果该应用程序未安装,则不会在 Apple App Store 中显示该应用程序的页面,而是显示一个显示“未找到动态链接”的网页。
这是调试链接:https : //www.nomadflare.com/app/?ibi=com%2Enomadflare%2ENomadFlare&imv=1%2E0&ofl=https%3A%2F%2Fwww%2Enomadflare%2Ecom& link =https%3A%2F%2Fnomadflare %2Ecom%2Fapp%2F%3Finvitedby%3DdZ3I3pK0KzcOGhO8AoVbBnn8XsO2&d=1
这是我配置整个事情的方式。在我的 Firebase 项目设置中,我设置了 App Store ID 和团队 ID:
在我的动态链接设置中,我使用自定义域和子路径定义了一个新的 URL 前缀(我在域的根目录下有一个网站,托管在 Firebase 托管上):
有了这个,我在https://nomadflare.com/apple-app-site-association上有以下内容:
{"applinks":{"apps":[],"details":[{"appID":"HLAKBN9F84.com.nomadflare.NomadFlare","paths":["NOT /_/*","/*"]}]}}
Run Code Online (Sandbox Code Playgroud)
然后在我的 XCode 项目中,我在 Capabilities 中启用了关联域,并将第一个关联域设置为applinks:$(DYNAMIC_LINKS_DOMAIN),其中 DYNAMIC_LINKS_DOMAIN 是用户定义的构建设置,它取决于构建配置,但对于 prod 等于nomadflare.com.
在 Info/URL Types 中,自定义 URL 方案是$(PRODUCT_BUNDLE_IDENTIFIER)(同样,取决于构建配置,但对于 prod,它是com.nomadflare.NomadFlare.
最后,在我的 Swift 代码中,我有以下功能,当用户点击“共享”按钮时会触发该功能:
{"applinks":{"apps":[],"details":[{"appID":"HLAKBN9F84.com.nomadflare.NomadFlare","paths":["NOT /_/*","/*"]}]}}
Run Code Online (Sandbox Code Playgroud)
这是我的 Info.plist 中的相关键:
<key>FirebaseDynamicLinksCustomDomains</key>
<array>
<string>https://$(DYNAMIC_LINKS_DOMAIN)/app</string>
</array>
<key>LSApplicationQueriesSchemes</key>
<key>WebsiteUrl</key>
<string>$(WEBSITE_URL)</string>
<key>AppStoreID</key>
<string>1474350816</string>
Run Code Online (Sandbox Code Playgroud)
并且WEBSITE_URL是另一个特定于构建配置的用户定义设置,其值 …
我正在尝试将UISearchController添加到包含UITableView(以及MKMapView的UIViewController)中,但希望这不是问题。我遵循了Ray Wenderlich的教程,但是就行为而言,我无法获得相同的结果。
这是我的viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
// Setup the Search Controller
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.placeholder = NSLocalizedString("Search references by project, customer or city", comment: "")
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
navigationItem.hidesSearchBarWhenScrolling = true
} else {
tableView.tableHeaderView = searchController.searchBar
}
definesPresentationContext = true
self.modeSelector.layer.cornerRadius = 5.0
if let split = splitViewController {
let controllers = split.viewControllers
detailViewController = (controllers[controllers.count - 1] as! UINavigationController).topViewController as? ReferenceViewController
}
self.navigationItem.rightBarButtonItem?.isEnabled = false
} …Run Code Online (Sandbox Code Playgroud) 我有以下可调用函数,该函数从数据库中获取一些数据,然后使用html-pdf使用该数据创建PDF,将该PDF上载到存储,最后返回存储中文件的名称。它在https形式下工作良好,但我想将其转换为可调用的函数,由于某种原因我无法弄清楚,它因以下错误而崩溃:RangeError:超出了最大调用堆栈大小。
我怀疑这与以下事实有关:html-pdf不适用于promises,而是使用错误/数据回调。但是我试图将其转化为没有成功的承诺。
export const createPdf = functions.https.onCall((data, context) => {
const refId = data.refId;
const companyId = data.companyId;
const userId = context.auth.uid;
return admin.database().ref('/references').child(companyId).child(refId).once('value', (snapshot) => {
const filePath = '/references/' + refId + '/pdfs/' + refId + '.pdf';
const localeId = snapshot.child('locale').val();
return admin.database().ref('/tags').child(localeId).once('value', (tagsSnapshot) => {
const jsLocaleId = localeId.replace(/_/, "-");
const projectDate = moment().locale(jsLocaleId)
.year(snapshot.child('year').val())
.month(snapshot.child('month').val() - 1)
.date(15)
.format('MMMM YYYY');
const tags = tagsSnapshot.val();
const projectCategories = ...
const pictures = snapshot.child('pictures').val();
const pdfData = { …Run Code Online (Sandbox Code Playgroud) 我尝试更新Firebase函数项目的依赖项,以使用最新版本的firebase-functions和firebase-admin,这反过来又似乎需要更新版本的TypeScript和tslint。这是我生成的package.json:
{
"name": "functions",
"scripts": {
"lint": "./node_modules/.bin/tslint -p tslint.json",
"build": "./node_modules/.bin/tsc",
"serve": "npm run build && firebase serve --only functions",
"shell": "npm run build && firebase experimental:functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"main": "lib/index.js",
"engines": {
"node": "8"
},
"dependencies": {
"@types/jsonwebtoken": "^7.2.8",
"axios": "^0.18.1",
"body-parser": "^1.18.3",
"express": "^4.16.3",
"firebase-admin": "^8.0.0",
"firebase-functions": "^3.1.0",
"handlebars": "^4.1.2",
"html-pdf": "^2.2.0",
"js-sha256": "^0.9.0",
"json2csv": "^4.1.2",
"jsonwebtoken": "^8.3.0",
"jwks-rsa": "^1.3.0",
"moment": "^2.24.0",
"pdfkit": "^0.9.1",
"uuid": "^3.3.2", …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的项目从 Alamofire 4.9 迁移到 5.3,但我在错误处理方面遇到了困难。我想Decodable尽可能多地使用,但当一切顺利时,我的 API 端点返回一个 JSON 结构,而当出现错误时,我的 API 端点返回一个不同的 JSON 结构,所有端点上的所有错误都相同。Codable我的代码中对应的是ApiError.
我想创建一个自定义响应序列化器,它可以给我一个Result<T, ApiError>而不是默认的Result<T, AFError>. 我发现这篇文章似乎解释了一般过程,但其中的代码无法编译。
我怎样才能创建这样的自定义ResponseSerializer?
android ×3
firebase ×3
ios ×3
soap ×2
swift ×2
typescript ×2
alamofire ×1
alamofire5 ×1
grails ×1
kotlin ×1
ksoap2 ×1
npm ×1
objective-c ×1
security ×1
tls1.2 ×1
uitableview ×1
xml ×1